diff --git a/common/build/Utilities/Utilities.cbp b/common/build/Utilities/Utilities.cbp index 55793bc2b9..1182781392 100644 --- a/common/build/Utilities/Utilities.cbp +++ b/common/build/Utilities/Utilities.cbp @@ -1,84 +1,84 @@ - - - - - - + + + + + + diff --git a/common/build/Utilities/utilities.vcproj b/common/build/Utilities/utilities.vcproj index 140df4fbe7..eca9d95698 100644 --- a/common/build/Utilities/utilities.vcproj +++ b/common/build/Utilities/utilities.vcproj @@ -227,11 +227,11 @@ > #include diff --git a/common/src/Utilities/LnxThreads.cpp b/common/src/Utilities/Linux/LnxThreads.cpp similarity index 98% rename from common/src/Utilities/LnxThreads.cpp rename to common/src/Utilities/Linux/LnxThreads.cpp index 09f8a6f816..fa40b4f83f 100644 --- a/common/src/Utilities/LnxThreads.cpp +++ b/common/src/Utilities/Linux/LnxThreads.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "PrecompiledHeader.h" +#include "../PrecompiledHeader.h" #include "Threading.h" #include "x86emitter/tools.h" diff --git a/common/src/Utilities/ThreadTools.cpp b/common/src/Utilities/ThreadTools.cpp index bfc76225bf..33d031ca7f 100644 --- a/common/src/Utilities/ThreadTools.cpp +++ b/common/src/Utilities/ThreadTools.cpp @@ -38,6 +38,7 @@ namespace Threading void Thread::Start() { + m_terminated = false; if( pthread_create( &m_thread, NULL, _internal_callback, this ) != 0 ) throw Exception::ThreadCreationError(); } @@ -135,6 +136,26 @@ namespace Threading err = pthread_mutex_init( &mutex, NULL ); } + MutexLock::MutexLock( bool isRecursive ) + { + if( isRecursive ) + { + pthread_mutexattr_t mutexAttribute; + int status = pthread_mutexattr_init( &mutexAttribute ); + if (status != 0) { /* ... */ } + status = pthread_mutexattr_settype( &mutexAttribute, PTHREAD_MUTEX_RECURSIVE); + if (status != 0) { /* ... */} + + int err = 0; + err = pthread_mutex_init( &mutex, &mutexAttribute ); + } + else + { + int err = 0; + err = pthread_mutex_init( &mutex, NULL ); + } + } + MutexLock::~MutexLock() { pthread_mutex_destroy( &mutex ); diff --git a/common/src/Utilities/WinMisc.cpp b/common/src/Utilities/Windows/WinMisc.cpp similarity index 96% rename from common/src/Utilities/WinMisc.cpp rename to common/src/Utilities/Windows/WinMisc.cpp index 285aeca4dc..94dd790220 100644 --- a/common/src/Utilities/WinMisc.cpp +++ b/common/src/Utilities/Windows/WinMisc.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "PrecompiledHeader.h" +#include "../PrecompiledHeader.h" #include "RedtapeWindows.h" static LARGE_INTEGER lfreq; diff --git a/common/src/Utilities/WinThreads.cpp b/common/src/Utilities/Windows/WinThreads.cpp similarity index 98% rename from common/src/Utilities/WinThreads.cpp rename to common/src/Utilities/Windows/WinThreads.cpp index dbadceaa98..c606ea1e73 100644 --- a/common/src/Utilities/WinThreads.cpp +++ b/common/src/Utilities/Windows/WinThreads.cpp @@ -17,7 +17,7 @@ */ -#include "PrecompiledHeader.h" +#include "../PrecompiledHeader.h" #include "RedtapeWindows.h" #include "x86emitter/tools.h" #include "Threading.h" diff --git a/pcsx2/Docs/PCSX2 FAQ 0.9.4.rtf b/pcsx2/Docs/PCSX2 FAQ 0.9.4.rtf deleted file mode 100644 index 50c55e0d7d..0000000000 --- a/pcsx2/Docs/PCSX2 FAQ 0.9.4.rtf +++ /dev/null @@ -1,172 +0,0 @@ -{\rtf1\ansi\ansicpg1253\deff0\deflang1032{\fonttbl{\f0\froman\fprq2\fcharset161{\*\fname Times New Roman;}Times New Roman Greek;}{\f1\froman\fprq2\fcharset2 Symbol;}{\f2\fswiss\fcharset161{\*\fname Arial;}Arial Greek;}} -{\colortbl ;\red0\green0\blue255;} -{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\b\f0\fs44 PCSX2 0.9.4 FAQ\par -\par -\b0\fs28 In this document we will try to answer the most common questions our end users have. This is mostly a copy/paste from the Emuforums thread created by CKemu with some updates and corrections.\par -\b\fs44\par -\par -\par -Can I 'Play' Games?\b0\par -\fs28 \par -If by 'playing' a game, you mean: at full speed with sound, perfect graphics, etc, then \b NO\b0 . Come back next year.\par - \par -Since this release (PCSX2 0.9.4) compatibility has increased greatly. Many games will now go 'in-game' or at least to some form of menu. Whilst games may get 'in-game', they will not run at 'playable' speeds, due to the complex nature of PS2 emulation, and the lack of modern hardware that is powerful enough to emulate such a console.\par - \par -Speed has recently increased significantly, for near 'fullspeed' games, we recommend you examine the {\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/95668-post-your-pcsx2-0-9-4-screenshots-here.html"}}{\fldrslt{\cf1\ul screenshots thread}}}\cf0\ulnone\f0\fs28 for speeds.\par - \par -\b\fs44 Is game 'X' Working?\b0\fs28\par - \par -Before posting this, check the {\field{\*\fldinst{HYPERLINK "http://www.pcsx2.net/compat.php?p=1&c=$&s1=1&s2=1&s3=1&s4=1&s5=1" }}{\fldrslt{\cf1\ul compatibility list}}}\cf0\ulnone\f0\fs28 you will be able to see how far your game goes, if you can't get it as far as we can, check your configuration against the {\field{\*\fldinst{HYPERLINK "http://www.pcsx2.net/guide.php" }}{\fldrslt{\cf1\ul Configuration Guide}}}\cf0\ulnone\f0\fs28 , if you still have no luck, you may post the question. If your game is not in the compatibility list then I\rquote m afraid you are on your own, we cannot guarantee it working either way so it is impossible to tell if we can help you at all.\par - \par -\b\fs44 Does PCSX2 play PlayStation 1 (PSOne / PSX / PS1) Games?\b0\fs28\par - \par -\b No\b0 , simple as that. PCSX2's primary goal is to emulate the PS2, which would eventually include PlayStation 1 games, however at this time the key focus is to make PlayStation 2 games 'run' with a high degree of compatibility, including support for such features as USB device support (EyeToy, Special Controllers), DEV9 (Network, HDD) etc.\par - \par -If you wish to play PlayStation 1 games, there are extremely compatible, fast and stable emulators already in existance, and I recommend:\par - \par -{\field{\*\fldinst{HYPERLINK "http://psxemulator.gazaxian.com/" }}{\fldrslt{\cf1\ul pSX}}}\cf0\ulnone\f0\fs28 - New emulator, with a growing level of compatibility and is very simple to use.\par -{\field{\*\fldinst{HYPERLINK "http://epsxe.com/" }}{\fldrslt{\cf1\ul ePSXe}}}\cf0\ulnone\f0\fs28 - The famous and widely supported PS1 emulator, use this if you love features, and plugins!\par -{\field{\*\fldinst{HYPERLINK "http://batard.psxfanatics.com/" }}{\fldrslt{\cf1\ul PSXeven}}}\cf0\ulnone\f0\fs28 - Created by Xeven, supports the PSEmu Pro plugin system, and often has increased compatibilty over ePSXe with some specific games.\par - \par -\par -\b\fs44 My game worked in 0.9.2 but not in 0.9.4 why?\b0\fs28\par - \par -Due to changes in the emulator some games may not work as well as they did in the previous release, as you will find with most emulation projects, you fix one game, you break another somewhere. So the best solution to this is, play your game on the version it worked best for you.\par - \par -\b\fs44 PCSX2 doesn't work on my Athlon XP (or other non SSE2 chips)\b0\fs28\par - \par -Due to the nature of the VM (pcsx2.exe), which heavily uses SSE2, this version of the emulator will \b NOT\b0 work for you, however the TLB (pcsx2t.exe) build should work for you. Note when using a \b non\b0 SSE2 cpu to run PCSX2, make sure you select the \b non\b0 SSE2 versions of the plugins.\par - \par -\par -\b\fs44 ZeroGS looks REALLY ugly!! - What gives?\par -\b0\fs28 \par -\par -ZeroGS renders to native PS2 resolution, that\rquote s it's default render target, when you set the window size to say 1024x768, ZeroGS still renders to native PS2 resolution, but stretches that resolution to fit the window size. What you are used to is setting your window size to x*y and the target resolution also changes accordingly.\par - \par -The so called 'AA' ZeroGS uses, isn't actually anti aliasing, it simply ups the render target size, so you end up with a higher resolution image, thus increasing it's quality (albeit blocky).\par - \par -So you're thinking, well what gives? To be honest, you do, the forum user, so many people whine about speed (oh no my aging rig..or general abuse thrown at the mods / developers), it was decided that in order to maintain speed, the render target and window resolution would remain unlinked, despite the obvious fuglyness of it.\par - \par -\b\fs44 Where is the BIOS?\par -\b0\fs28 \par -It is Illegal to ask for a BIOS, as the BIOS is copyright of SONY. If you wish to use a REAL BIOS with PCSX2, you can dump it from your own PS2 (there are guides {\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/83608-rfs-guide-dumping-your-ps2-bios-over-lan.html" }}{\fldrslt{\cf1\ul here}}}\cf0\ulnone\f0\fs28 and {\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/84994-guide-dump-bios-through-usb.html" }}{\fldrslt{\cf1\ul here}}}\cf0\ulnone\f0\fs28 . Or find it by yourself.\par - \par -\b\fs44 No SCPH10,000 Support?!\par -\b0\fs28 \par -The SCPH10,000 BIOS doesn't have all the libraries many games need to load, thus for better results, use a more modern BIOS version.\par - \par -\b\fs44 Do I need ROM1, ROM2, EROM?\par -\b0\fs28 \par -If the console is warning you about not having these files, do not panic, all you need is the main ROM0 (the 4,096kb main BIOS file). You can dump the ROM1, ROM2, EROM from your own PS2 console, again guides and tools are on the internet, use {\field{\*\fldinst{HYPERLINK "http://www.google.com" }}{\fldrslt{\cf1\ul Google}}}\cf0\ulnone\f0\fs28\par -\par -\b\fs44 Is PCSX2 finally using the new .p2b BIOS format?\par -\par -\b0\fs28 Unfortunately, florin the team member responsible for this feature got held back and it did not make it in the release. Nevertheless, you can extract the contents of your .p2b BIOS file using 7zip, so you are still able to use your own complete BIOS files\par -\par - \par -\b\fs44 Where can I get games?\b0\fs28\par - \par -From your local computer game shop, where else?\par - \par -This forum does not support warez or piracy, helping someone get links to such files, asking for such files, or linking to illegal material will be warned then banned if the violation is repeated. There are \b MANY\b0 great games out there, and you owe it to the talented creators to buy their games, and many you can get very cheaply, in platinum editions or second hand.\par - \par -\b\fs44 Can I be a betatester?\b0\fs28\par - \par -Ask this and the answer will always be \b NO\b0 . Keep asking it and you'll find yourself with a big fat ban.\par - \par -\b\fs44 What are the system requirements?\b0\fs28\par - \par -We recommend the following:\par - \par -\b Minimal Specs:\par -\b0 AMD XP/64 or Intel Pentium 4 (VM Built will not work with [B]non[/B] SSE2 CPU's)\par -512MB of RAM\par -Pixel Shader 1.4 supporting card (GSdx Graphics Plugin Only)\par - \par -\b Recommended Specs:\b0 (For reasonable performance in many games, but not all)\par -AMD64 X2 or Intel Conroe E6600+ (Multi Threading is supported in PCSX2)\par -512-1024MB of RAM (more RAM allows for VM mode to be stable)\par -Pixel Shader 2.0 supporting card (recommended GeForce 6600-8800 or equivalent ATi card)\par - \par -\b Possible Ideal Specs:\b0\par -64bit OS such as Vista or winXP64, to allow for future support of 64bit recompilers.\par -Future AMD or Intel Quad Core maybe needed, but currently the support of 4 threads is not handled by PCSX2, and the effect of threading out EE / VU is not yet known.\par -We don't forsee you requiring a GPU more powerful than the current generation of cards, up to and including the nVidia GeForce 8800.\par - \par -A more in-depth guide to system specifications can be found {\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/84457-will-emulator-run-fast-my-computer.html" }}{\fldrslt{\cf1\ul here}}}\cf0\ulnone\f0\fs28 .\par - \par -\b\fs44 How do I compile the SVN source?\par -\b0\fs28 \par -We do not support SVN builds on this forum. Only official builds are permitted to be discussed. This is mainly to stop confusion, people 'handing out' betas, n00b questions when dealing with errors, as it's hard to keep track of multiple 0.x.x versions.\par - \par -Besides, if you need to ask that question, then trust me, you don't want to be bothered. It's very very hard.\par - \par -\b\fs44 What is going on with PCSX2?\par -\b0\fs28\par -\i Why aren't we getting lots of info, or is PCSX2 dead?\i0\par -\pard\fi-360\li720\tx720\lang2057\f1\'b7\tab\lang1032\f0 When something 'special' happens, one of the beta-testers will post shots and information.\par -\pard\lang2057\f1\'b7\tab\lang1032\f0 When something super-dupa mega super hyper turbo mega mega happens, shots will be posted like \i super mega\i0 lightning fast on the main {\field{\*\fldinst{HYPERLINK "http://www.pcsx2.net/"}}{\fldrslt{\cf1\ul news page}}}\cf0\ulnone\f0\fs28 .\par -\lang2057\f1\'b7\tab\lang1032\f0 If no shots are being posted, assume that the progress is slow but steady, and whilst stuff is happening, it doesn't result in anything that you'd be able to see (eg techy nerd stuff).\par -\lang2057\f1\'b7\tab\lang1032\f0 If nothing is being posted whatsoever, assume that \b A:\b0 The developers have lives (yeah I didn't believe that either), \b B:\b0 The developers are taking a rest.\par -\lang2057\f1\'b7\tab\lang1032\f0 What if \b SHOCK HORROR\b0 no news has been posted for ages???!!!!!! Assume any of the above or most of the team was killed.\par -\lang2057\f1\'b7\tab\lang1032\f0 What if I have programming knowledge, and could understand the technical changes being made? Well then go browse to the SVN, and aquire the \b changelog.txt\b0 .\par -\par -\b\fs44 When will the next version be released?\par -\b0\fs28 \par -The authors are writing this in there spare time. If they knew, they would inform you, normally a release is made when significant progress and a big difference in 'output' is shown, eg, when you the end user will be able to see more stuff running.\par - \par -\b\fs44 Why bother making releases when it is not finished?\b0\fs28\par - \par -In a nutshell, it keeps the "Gimme the next release \b NOW!\b0 " crowd from getting too annoying. More importantly it alls folks to see how things are progressing first hand.\par - \par -\b\fs44 How do I make a patch?\par -\b0\fs28 \par -Making a patch will \b not\b0 make a game 'playable' but may allow you further into it. Patches can be used to skip videos that don't play, or other simple bugs, they will not make '3D' perfect or make sound super duppa!\par - \par -{\field{\*\fldinst{HYPERLINK "http://www.pcsx2.net/nachbrenner/" }}{\fldrslt{\cf1\ul Nachbrenner's Site for making Patches}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://www.ngemu.com/forums/showthread.php?t=62837" }}{\fldrslt{\cf1\ul Simple Guide for Video Skip Patches}}}\cf0\ulnone\f0\fs28\par - \par -\b\fs44 My Sprites have black borders!\b0\fs28\par - \par -This happens when you have \b Linear Texture Filtering\b0 (LTF) turned on in GSdx, to solve this, turn off LTF. This is most often the cause of black squares or borders around sprites in 2D and 2.5D fighting games.\par - \par -\b\fs44 Every Game I run crashes the emulator instantly!\par -\b0\fs28 \par -This is often caused by people having the \b NLOOP0\b0 hack enabled in the GS plugin (ZeroGS KOSMOS / GSdx), and using the Run>Execute menu. By using Run>Execute the emulator first boots the BIOS, which will crash when you have NLOOP0 enabled. Simply use File>RunCD menu to avoid crashes, and this is the recommended option for anygame.\par - \par -If you wish to run the BIOS, simply \b DISABLE\b0 NLOOP0 in your GS plugin first!\par - \par -\b\fs44 Useful Links\par -\b0\fs28 \par -BIOS Guides:\par - \par -{\field{\*\fldinst{HYPERLINK "http://www.ngemu.com/forums/showthread.php?t=65015" }}{\fldrslt{\cf1\ul CKemu's guide to using the PS2 BIOS}}}\cf0\ulnone\f0\fs28 \par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/84994-guide-dump-bios-through-usb.html" }}{\fldrslt{\cf1\ul RealOne's Guide to USB BIOS Dumping}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/83608-rfs-guide-dumping-your-ps2-bios-over-lan.html" }}{\fldrslt{\cf1\ul Reichfuher's guide to dumping your Playstation 2 BIOS}}}\cf0\ulnone\f0\fs28\par -\par -Error/Problem Guides:\par - \par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/67512-common-problems-solutions-guide.html" \\\\l "post912874" }}{\fldrslt{\cf1\ul Refraction's guide to common problems and errors.}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/84457-will-emulator-run-fast-my-computer.html" }}{\fldrslt{\cf1\ul Will the emulator run fast on my computer?}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/70174-why-pcsx2-slow.html" }}{\fldrslt{\cf1\ul Why is PCSX2 Slow?}}}\cf0\ulnone\f0\fs28\par -\par -Memory Card Guides:\par - \par -{\field{\*\fldinst{HYPERLINK "http://www.ngemu.com/forums/showthread.php?t=64482" }}{\fldrslt{\cf1\ul Convert GameFAQ saves to PCSX2 memorycard}}}\cf0\ulnone\f0\fs28 {\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/69844-load-us-ntsc-final-fantasy-x-gamesaves-any-ffx-version.html" }}{\fldrslt{\cf1\ul Load US memcard saves on any region version of FFX and FFX-2}}}\cf0\ulnone\f0\fs28\par - \par -Plugins/Patch Guides:\par - \par -{\field{\*\fldinst{HYPERLINK "http://www.ngemu.com/forums/showthread.php?t=62837" }}{\fldrslt{\cf1\ul Guide to making patches for PCSX2}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/1065199-post74.html" }}{\fldrslt{\cf1\ul TwinPad Keyboard Plugin Latest Version}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/ps2-plugin-questions-troubleshooting/87274-lilypad-new-pad-plugin-lame-name.html" }}{\fldrslt{\cf1\ul Lilypad plugin}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/ps2-plugin-questions-troubleshooting/94273-megapad-plugin.html" }}{\fldrslt{\cf1\ul MegaPad plugin}}}\cf0\ulnone\f0\fs28\par - \par -Reviews:\par - \par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/76251-pcsx2-review-cpu-power-does-matter.html" }}{\fldrslt{\cf1\ul PCSX2 Review Part 1: CPU Power Matters}}}\cf0\ulnone\f0\fs28\par -{\field{\*\fldinst{HYPERLINK "http://forums.ngemu.com/pcsx2-official-forum/80417-pcsx2-review-part2-gpu-power-also-matter.html" }}{\fldrslt{\cf1\ul PCSX2 Review Part 2: GPU Power Also Matters}}}\cf0\ulnone\f0\fs28\par -\par -\par -\f2\fs20\par -} - \ No newline at end of file diff --git a/pcsx2/Docs/PCSX2 FAQ 0.9.6.rtf b/pcsx2/Docs/PCSX2 FAQ 0.9.6.rtf new file mode 100644 index 0000000000..5fa4ce054a --- /dev/null +++ b/pcsx2/Docs/PCSX2 FAQ 0.9.6.rtf @@ -0,0 +1,468 @@ +{\rtf1\adeflang1025\ansi\ansicpg1253\uc1\adeff0\deff0\stshfdbch37\stshfloch37\stshfhich37\stshfbi0\deflang1032\deflangfe1032\themelang1032\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset161\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f34\fbidi \froman\fcharset161\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f37\fbidi \fswiss\fcharset161\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\flomajor\f31500\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fhimajor\f31502\fbidi \froman\fcharset161\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\flominor\f31504\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fhiminor\f31506\fbidi \fswiss\fcharset161\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f51\fbidi \fswiss\fcharset0\fprq2 Arial;} +{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f381\fbidi \froman\fcharset0\fprq2 Cambria Math;}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;} +{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f411\fbidi \fswiss\fcharset0\fprq2 Calibri;} +{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\flomajor\f31510\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31530\fbidi \froman\fcharset0\fprq2 Cambria;}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31540\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31550\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhiminor\f31570\fbidi \fswiss\fcharset0\fprq2 Calibri;}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31580\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red84\green141\blue212;}{\*\defchp \loch\af37\hich\af37\dbch\af37 }{\*\defpap +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 +\ltrch\fcs0 \fs22\lang1032\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 \snext0 \sqformat \spriority0 \styrsid10827347 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1032\langfe1032\loch\f37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1032 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \sunhideused \styrsid8465558 Hyperlink;}{\*\cs16 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf12 +\sbasedon10 \ssemihidden \sunhideused \styrsid8929062 FollowedHyperlink;}{\s17\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1032\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 \sbasedon0 \snext17 \slink18 \ssemihidden \sunhideused \styrsid11618959 header;}{\*\cs18 \additive \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \fs22\lang0\langfe1033\langfenp1033 +\sbasedon10 \slink17 \slocked \ssemihidden \styrsid11618959 Header Char;}{\s19\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1032\langfe1033\loch\f37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 \sbasedon0 \snext19 \slink20 \sunhideused \styrsid11618959 footer;}{\*\cs20 \additive \rtlch\fcs1 \af0\afs22 \ltrch\fcs0 \fs22\lang0\langfe1033\langfenp1033 +\sbasedon10 \slink19 \slocked \styrsid11618959 Footer Char;}}{\*\rsidtbl \rsid276287\rsid1463223\rsid3022359\rsid4022471\rsid5513725\rsid6170542\rsid8465558\rsid8848631\rsid8929062\rsid10827347\rsid11618959\rsid13963138\rsid14898486}{\mmathPr\mmathFont34 +\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title PCSX2 0.9.6 FAQ}{\author bositman}{\operator bositman}{\creatim\yr2009\mo7\dy2\hr2\min59}{\revtim\yr2009\mo7\dy2\hr2\min59} +{\printim\yr2009\mo2\dy27\hr13\min27}{\version2}{\edmins1}{\nofpages10}{\nofwords1153}{\nofchars6232}{\nofcharsws7371}{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw11906\paperh16838\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale90\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot6170542\newtblstyruls\nogrowautofit\utinl \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11618959 +\rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1032\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5513725 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11618959 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1032\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5513725 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11618959 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1032\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5513725 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid11618959 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1032\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid5513725 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\footerr \ltrpar \pard\plain \ltrpar\s19\qc \li0\ri0\sa200\sl276\slmult1\widctlpar +\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1032\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 {\field{\*\fldinst {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid11618959 \hich\af37\dbch\af37\loch\f37 PAGE \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid13963138 \hich\af37\dbch\af37\loch\f37 10}}}\sectd \ltrsect +\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11618959 +\par }\pard \ltrpar\s19\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11618959 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qc \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8929062 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1032\langfe1033\loch\af37\hich\af37\dbch\af37\cgrid\langnp1032\langfenp1033 {\rtlch\fcs1 \af1\afs36 +\ltrch\fcs0 \b\f1\fs36\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8929062 \hich\af1\dbch\af37\loch\f1 PCSX2 0.9.6 FAQ +\par }\pard \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid6170542 {\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs36 \ltrch\fcs0 \b\i\f1\fs36\cf17\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8929062 \hich\af1\dbch\af37\loch\f1 Section I: General questions about the project +\par }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 What is the aim of this project? +\par }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 +The aim of this project is to emulate the Playstation 2, allowing people to play their Ps2 games on their pc. This requires having an original Playstation \hich\af1\dbch\af37\loch\f1 +2 console (for the BIOS) and of course having the original games as well. +\par }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 Is the project open source?}{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 +\f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 Yes, the project is open source, and it is licensed under the GNU General Public License v2. +\par }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 Can I help the project? +\par }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Sure you can, refer to this threa\hich\af1\dbch\af37\loch\f1 d }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 + HYPERLINK "http://forums.pcsx2.net/thread-2319.html" }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0032003300310039002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \cs15\f1\fs30\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8929062 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 Is the release package complete? Can I play out of the box? +\par }{\rtlch\fcs1 \af1\afs30 \ltrch\fcs0 \f1\fs30\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 No, the release package is not complete. You need to do at least 3 things before you can play. +\par \hich\af1\dbch\af37\loch\f1 First, you need to put in your o\hich\af1\dbch\af37\loch\f1 wn BIOS. Dump your Playstation 2 BIOS from your own console. You can find the BIOS dumper }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://www.pcsx2.net/downloads.php?p=tool" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6c00000068007400740070003a002f002f007700770077002e00700063007300780032002e006e00650074002f0064006f0077006e006c006f006100640073002e007000680070003f0070003d0074006f006f006c00 +0000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Second, you need to configure the plugins in the emulator. You can use the official guide found }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 +\hich\af1\dbch\af37\loch\f1 HYPE\hich\af1\dbch\af37\loch\f1 RLINK "http://forums.pcsx2.net/forum-23.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6400000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f0066006f00720075006d002d00320033002e00680074006d006c000000795881f43b1d +7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 And third, you need to update your directx in order for gsdx to work (important!) . Gsdx is our suggested graphics plugin. Update directx with the web installer }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://www.microsoft.com/dow\hich\af1\dbch\af37\loch\f1 nloads/details.aspx?FamilyId=2DA43D38-DB71-4C1B-BC6A-9B6652CD92A3&displaylang=en" }{\rtlch\fcs1 +\af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90bf200000068007400740070003a002f002f007700770077002e006d006900630072006f0073006f00660074002e0063006f006d002f0064006f0077006e006c006f006100640073002f00640065007400610069006c00 +73002e0061007300700078003f00460061006d0069006c007900490064003d00320044004100340033004400330038002d0044004200370031002d0034004300310042002d0042004300360041002d00390042003600360035003200430044003900320041003300260064006900730070006c00610079006c0061006e0067 +003d0065006e000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par +\par }{\rtlch\fcs1 \af1\afs36 \ltrch\fcs0 \b\i\f1\fs36\cf17\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8929062 \hich\af1\dbch\af37\loch\f1 Section 2: General questions about the emulator +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 What are the require}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 ments for using this emulator?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Minimum +\par \hich\af1\dbch\af37\loch\f1 * Windows/Linux OS +\par \hich\af1\dbch\af37\loch\f1 * CPU that supports SSE2 (P\hich\af1\dbch\af37\loch\f1 entium 4 and up, Athlon64 and up) +\par \hich\af1\dbch\af37\loch\f1 * GPU that supports Pixel Shaders 2.0 +\par \hich\af1\dbch\af37\loch\f1 * 512mb RAM +\par +\par \hich\af1\dbch\af37\loch\f1 Recommended +\par \hich\af1\dbch\af37\loch\f1 * Windows Vista 32bit/64bit +\par \hich\af1\dbch\af37\loch\f1 * CPU: Intel Core 2 Duo @ 3.2ghz or better +\par \hich\af1\dbch\af37\loch\f1 * GPU: 8600gt or better +\par \hich\af1\dbch\af37\loch\f1 * 1gb RAM (2gb if on Vista) +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Does the \hich\af1\dbch\af37\loch\f1 emulator support 4 }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 cores?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 +No, currently only 2 cores are supported. To make Pcsx2 efficiently use 3 or more cores will require major code changes. So don't ask when quad-core support will be available, since it won't be anytime soon! However, pcsx2 will r +\hich\af1\dbch\af37\loch\f1 un fine on your quadcore cpu. It just won't benefit from the extra 2 cores +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Why }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 +\hich\af1\dbch\af37\loch\f1 is my CPU load less than 100%?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 As said above,}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 PCSX2 only uses 2 cores,}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 }{ +\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 so if you have more the CPU usage will be way less 100%. Even if you have exactly 2 cores,}{\rtlch\fcs1 \af1\afs28 +\ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 the emulator +\hich\af1\dbch\af37\loch\f1 will not cause 100% CPU usage because of the way threading works. This does NOT mean PCSX2 isn't using the full power of your CPU,}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 +\hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 it is normal. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Is SLI/Crossfire useful?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 By itself, no. Pcsx2 is not programmed to use more than one GPU. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8929062 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Why not u}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 se CUDA \hich\af1\dbch\af37\loch\f1 to make things faster?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 CUDA works best with many parallel threads, something pcsx2 does not use. +\par \hich\af1\dbch\af37\loch\f1 So even if we got CUDA support, it would probably run very slow. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Is game X playable?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 There is a compatibility list on the site, }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://www.pcs +\hich\af1\dbch\af37\loch\f1 x2.net/compat.php?c=key" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6400000068007400740070003a002f002f007700770077002e00700063007300780032002e006e00650074002f0063006f006d007000610074002e007000680070003f0063003d006b00650079000000795881f43b1d +7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 For now it is outdated, so you are better off just trying the game +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Do ps1 games work with this e}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 mulator?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 No, this emulator only works with playstation 2 games. In order to play Ps1 games, you will need a ps1 emulator +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 My \hich\af1\dbch\af37\loch\f1 game worked in an earlier vers}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 ion, and now it does not, why?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Due to changes in the emulator some games may not work as well as they did in the previous release, as you will find with most emulation projects, you fix one game, you break another somewhere. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8929062 +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Why is the emulator so slow?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Because the Playstation 2 is a complex console, with a lot of parts which must be emulated at the same time. For a better explanation,}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8929062 +\hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 refer }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://forums.pcsx2.net/thread-2330.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0032003300330030002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 to this thread}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 W}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 +\hich\af1\dbch\af37\loch\f1 here c\hich\af1\dbch\af37\loch\f1 an I get BIOS and Games?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 You can get your own BIOS from your own ps2. +\par \hich\af1\dbch\af37\loch\f1 You can use games from your own collection, or acquire them from a game store. Any other way is illegal and we have a strict policy about warez. +\par \hich\af1\dbch\af37\loch\f1 Case closed. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8929062 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Where did the old VM and \hich\af1\dbch\af37\loch\f1 TLB versions go? +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 They were replaced by a different system which allows us to code better. It is still under development, but it will allow us to develop a better emulator. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8929062 +\par +\par +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 How do I play a game?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 1) Dump your own BIOS and put it into the BIOS folder +\par \hich\af1\dbch\af37\loch\f1 2\hich\af1\dbch\af37\loch\f1 ) Configure the emulator (read section 3 below) +\par \hich\af1\dbch\af37\loch\f1 3) Get your Ps2 game discs ready, or make an ISO of them for faster access +\par \hich\af1\dbch\af37\loch\f1 4) Configure the cdvdrom plugin to point to those ISO/discs +\par \hich\af1\dbch\af37\loch\f1 5) File->Run CD/DVD +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 H}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 +\hich\af1\dbch\af37\loch\f1 ow do I compile the SVN source?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Read the compile g\hich\af1\dbch\af37\loch\f1 uide }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 + HYPERLINK "http://forums.pcsx2.net/thread-2373.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0032003300370033002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Keep in mind that while you can post bugs about your own compiled svn revisions, we do not offer support for them. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 When will the next version be rel}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 eased?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 It will be released when it is \hich\af1\dbch\af37\loch\f1 ready.}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid1463223 \hich\af1\dbch\af37\loch\f1 Don\hich\f1 \rquote \loch\f1 +t waste your time and ours asking about that.}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par +\par }{\rtlch\fcs1 \af1\afs36 \ltrch\fcs0 \i\f1\fs36\cf17\lang1033\langfe1033\langnp1033\insrsid8929062 +\par +\par +\par }{\rtlch\fcs1 \af1\afs36 \ltrch\fcs0 \b\i\f1\fs36\cf17\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8929062 \hich\af1\dbch\af37\loch\f1 Section 3: Configuration questions +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 How}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 +\hich\af1\dbch\af37\loch\f1 can I configure the emulator?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Please refer to the official PCSX2 guide }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 + HYPERLINK "http://forums.pcsx2.net/forum-23.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6400000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f0066006f00720075006d002d00320033002e00680074006d006c000000795881f43b1d +7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 HERE}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Where did the DC opt\hich\af1\dbch\af37\loch\f1 ion go?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 That option is no longer necessary, so it has been removed. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 What abo}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 ut the frame limiting options?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 The frame limiting options are often necessary for an enjoyable experience. Read out the explanation in the configuration dialogue, it's very deta\hich\af1\dbch\af37\loch\f1 iled. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 What is the normal }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 speed for Playstation 2 games?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 NTSC games have a normal speed of 60 frames per second. +\par \hich\af1\dbch\af37\loch\f1 PAL games have a normal speed of 50 frames per second. +\par \hich\af1\dbch\af37\loch\f1 Note that these speed}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 s}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 are unlike what happens in normal PC games. Sound, graphic, ever\hich\af1\dbch\af37\loch\f1 +ything is clocked at that speed. A NTSC game running at 30 frames per second is truly going at half the speed it should be. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Are patches necessary?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Often they are not. In a few cases, they allow you to go further ingame compared to without, but by default\hich\af1\dbch\af37\loch\f1 you should leave them off. They can also be used for cheats. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 What about gamefixes?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Gamefixes are, like the name says, special fixes for certain games. Enable them only for those games, they might cause problems in others. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Are speedhacks safe?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Speed \hich\af1\dbch\af37\loch\f1 hacks are, like the name says, hacks that make games go faster. +\par \hich\af1\dbch\af37\loch\f1 Use speedhacks at your own risk, they }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \b\f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 \hich\af1\dbch\af37\loch\f1 will break}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 \hich\af1\dbch\af37\loch\f1 many games. +\par \hich\af1\dbch\af37\loch\f1 NOTE: Do NOT report bugs unless you also tried the game with "Nothing" selected. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Wh}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 +\hich\af1\dbch\af37\loch\f1 at about the advanced options?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 Advanced optio\hich\af1\dbch\af37\loch\f1 ns should be only changed knowing you can break up games spectacularly sometimes. The help included in the configuration dialogue is very detailed, read it. +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 What about the plugins?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 We included the latest stable versions of the best plugins out there in t\hich\af1\dbch\af37\loch\f1 he package. You will need to configure them. Refer to the guide +\par +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid1463223\charrsid1463223 \hich\af1\dbch\af37\loch\f1 Why is the sound bad?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid1463223 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par \hich\af1\dbch\af37\loch\f1 We made SPU2-X the default plugin, as it has become a very nice choice by now. +\par \hich\af1\dbch\af37\loch\f1 Some games don't work very well with it though (especially squaresoft games). If you hav\hich\af1\dbch\af37\loch\f1 e trouble with the plugin, try Zerospu2 as well (also included). +\par +\par +\par }{\rtlch\fcs1 \af1\afs36 \ltrch\fcs0 \b\i\f1\fs36\cf17\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8929062 \hich\af1\dbch\af37\loch\f1 Section IV: Useful links +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid4022471\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 BIOS Guides:}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 +\par }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://forums.pcsx2.net/thread-2329.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0032003300320039002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 +Reichfuher's guide to dumping your Playstation 2 BIOS}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 Error/Problem Guides:}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 +\par }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "ht\hich\af1\dbch\af37\loch\f1 tp://forums.pcsx2.net/thread-2331.html" }{\rtlch\fcs1 \af1\afs28 +\ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0032003300330031002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 Will PCSX2 run fast on my computer?}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 Memory Card Guides:}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 +\par }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://forums.pcsx2.net/thread-2332.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0032003300330032002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 Convert GameFAQ saves to PCSX2 memorycard}}} +\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542 +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 \hich\af1\dbch\af37\loch\f1 How d}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 +\hich\af1\dbch\af37\loch\f1 o I make a skip video patch?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 +\par }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8848631 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://f\hich\af1\dbch\af37\loch\f1 orums.pcsx2.net/thread-4067.html" }{\rtlch\fcs1 \af1\afs28 +\ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8848631 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0034003000360037002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8848631\charrsid8848631 \hich\af1\dbch\af37\loch\f1 Patch Making For Dummies}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8848631 +\par \hich\af1\dbch\af37\loch\f1 }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par }{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 \b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid8465558\charrsid8465558 \hich\af1\dbch\af37\loch\f1 How do I play online?}{\rtlch\fcs1 \af1\afs32 \ltrch\fcs0 +\b\f1\fs32\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid8465558 +\par }{\field{\*\fldinst {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8929062 \hich\af1\dbch\af37\loch\f1 HYPERLINK "http://forums.pcsx2.net/thread-4066.html" }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid8929062 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6a00000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f007400680072006500610064002d0034003000360036002e00680074006d006c000000 +795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \cs15\f1\fs28\ul\cf2\lang1033\langfe1033\langnp1033\insrsid8929062\charrsid8929062 \hich\af1\dbch\af37\loch\f1 How to play online guide}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid10827347\sftnbj {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid6170542\charrsid6170542 +\par +\par }\pard \ltrpar\qr \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8929062 {\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid276287 +\par +\par +\par }{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8929062 \hich\af1\dbch\af37\loch\f1 Crea}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid11618959 \hich\af1\dbch\af37\loch\f1 t}{ +\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 \f1\fs28\lang1033\langfe1033\langnp1033\insrsid8929062 \hich\af1\dbch\af37\loch\f1 ed by Krakatos and bositman for v0.9.6}{\rtlch\fcs1 \af1\afs28 \ltrch\fcs0 +\f1\fs28\lang1033\langfe1033\langnp1033\insrsid10827347\charrsid6170542 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f000000000000000000000000f044 +37fda7fac901feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/pcsx2/Docs/PCSX2 readme 0.9.6.rtf b/pcsx2/Docs/PCSX2 readme 0.9.6.rtf new file mode 100644 index 0000000000..7a500622db --- /dev/null +++ b/pcsx2/Docs/PCSX2 readme 0.9.6.rtf @@ -0,0 +1,750 @@ +{\rtf1\adeflang1025\ansi\ansicpg1253\uc1\adeff0\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1032\deflangfe1032\themelang1032\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset161\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f2\fbidi \fmodern\fcharset161\fprq1{\*\panose 02070309020205020404}Courier New;}{\f3\fbidi \froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f10\fbidi \fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;} +{\f34\fbidi \froman\fcharset161\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\f38\fbidi \fswiss\fcharset161\fprq2{\*\panose 020b0604030504040204}Tahoma;} +{\flomajor\f31500\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbmajor\f31501\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fhimajor\f31502\fbidi \froman\fcharset161\fprq2{\*\panose 02040503050406030204}Cambria;}{\fbimajor\f31503\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\flominor\f31504\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fdbminor\f31505\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fhiminor\f31506\fbidi \fswiss\fcharset161\fprq2{\*\panose 020f0502020204030204}Calibri;}{\fbiminor\f31507\fbidi \froman\fcharset161\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f41\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f51\fbidi \fswiss\fcharset0\fprq2 Arial;} +{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f61\fbidi \fmodern\fcharset0\fprq1 Courier New;}{\f59\fbidi \fmodern\fcharset238\fprq1 Courier New CE;} +{\f60\fbidi \fmodern\fcharset204\fprq1 Courier New Cyr;}{\f63\fbidi \fmodern\fcharset162\fprq1 Courier New Tur;}{\f64\fbidi \fmodern\fcharset177\fprq1 Courier New (Hebrew);}{\f65\fbidi \fmodern\fcharset178\fprq1 Courier New (Arabic);} +{\f66\fbidi \fmodern\fcharset186\fprq1 Courier New Baltic;}{\f67\fbidi \fmodern\fcharset163\fprq1 Courier New (Vietnamese);}{\f381\fbidi \froman\fcharset0\fprq2 Cambria Math;}{\f379\fbidi \froman\fcharset238\fprq2 Cambria Math CE;} +{\f380\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}{\f383\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f386\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f421\fbidi \fswiss\fcharset0\fprq2 Tahoma;} +{\f419\fbidi \fswiss\fcharset238\fprq2 Tahoma CE;}{\f420\fbidi \fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f423\fbidi \fswiss\fcharset162\fprq2 Tahoma Tur;}{\f424\fbidi \fswiss\fcharset177\fprq2 Tahoma (Hebrew);} +{\f425\fbidi \fswiss\fcharset178\fprq2 Tahoma (Arabic);}{\f426\fbidi \fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f427\fbidi \fswiss\fcharset163\fprq2 Tahoma (Vietnamese);}{\f428\fbidi \fswiss\fcharset222\fprq2 Tahoma (Thai);} +{\flomajor\f31510\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31520\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31530\fbidi \froman\fcharset0\fprq2 Cambria;}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;}{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;} +{\fbimajor\f31540\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31550\fbidi \froman\fcharset0\fprq2 Times New Roman;} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31560\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhiminor\f31570\fbidi \fswiss\fcharset0\fprq2 Calibri;}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;} +{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\fbiminor\f31580\fbidi \froman\fcharset0\fprq2 Times New Roman;}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}} +{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0; +\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\*\defchp }{\*\defpap \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 \snext0 \sqformat \spriority0 \styrsid12323803 Normal;}{\*\cs10 +\additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv +\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 \snext11 \ssemihidden \sunhideused \sqformat Normal Table;}{\*\cs15 +\additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 \sqformat \spriority22 \styrsid14581459 Strong;}{\*\cs16 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \ul\cf2 \sbasedon10 \styrsid14581459 Hyperlink;}{\*\cs17 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 +\ul\cf12 \sbasedon10 \styrsid222077 FollowedHyperlink;}{\s18\ql \li0\ri0\widctlpar +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 +\f2\fs20\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 \sbasedon0 \snext18 \slink19 \sunhideused \styrsid417554 HTML Preformatted;}{\*\cs19 \additive \rtlch\fcs1 \af2 \ltrch\fcs0 \f2 \sbasedon10 \slink18 \slocked \styrsid417554 +HTML Preformatted Char;}{\s20\ql \li0\ri0\widctlpar\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 +\sbasedon0 \snext20 \slink21 \styrsid8610414 header;}{\*\cs21 \additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \fs24 \sbasedon10 \slink20 \slocked \styrsid8610414 Header Char;}{\s22\ql \li0\ri0\widctlpar +\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 \sbasedon0 \snext22 \slink23 \styrsid8610414 footer;}{\*\cs23 +\additive \rtlch\fcs1 \af0\afs24 \ltrch\fcs0 \fs24 \sbasedon10 \slink22 \slocked \styrsid8610414 Footer Char;}{\s24\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af38\afs16\alang1025 \ltrch\fcs0 +\f38\fs16\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 \sbasedon0 \snext24 \slink25 \styrsid11677673 Balloon Text;}{\*\cs25 \additive \rtlch\fcs1 \af38\afs16 \ltrch\fcs0 \f38\fs16 \sbasedon10 \slink24 \slocked \styrsid11677673 Balloon Text Char;}} +{\*\listtable{\list\listtemplateid1774759798\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67633153\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 +\fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633155\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440 +\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633157\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633153\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633155\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633157\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633153\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633155\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633157\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid243488514}{\list\listtemplateid2063525058{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;} +\f3\fs20\fbias0\hres0\chhres0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fs20\fbias0\hres0\chhres0 +\fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li2160 +\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li2880 +\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li3600 +\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li4320 +\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li5040 +\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li5760 +\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f10\fs20\fbias0\hres0\chhres0 \fi-360\li6480 +\jclisttab\tx6480\lin6480 }{\listname ;}\listid463814724}{\list\listtemplateid-722973088\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\leveltemplateid67633153 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633155 +\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633157 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633153 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633155 +\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633157 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633153 +\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633155 +\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext\leveltemplateid67633157 +\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid570427154}{\list\listtemplateid-1895026182\listhybrid{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1 +\levelspace0\levelindent0{\leveltext\leveltemplateid67633153\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li720\jclisttab\tx720\lin720 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative +\levelspace0\levelindent0{\leveltext\leveltemplateid67633155\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li1440\jclisttab\tx1440\lin1440 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67633157\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li2160\jclisttab\tx2160\lin2160 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67633153\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li2880\jclisttab\tx2880\lin2880 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0 +\levelindent0{\leveltext\leveltemplateid67633155\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li3600\jclisttab\tx3600\lin3600 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67633157\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li4320\jclisttab\tx4320\lin4320 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67633153\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li5040\jclisttab\tx5040\lin5040 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0 +{\leveltext\leveltemplateid67633155\'01o;}{\levelnumbers;}\f2\fbias0\hres0\chhres0 \fi-360\li5760\jclisttab\tx5760\lin5760 }{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\lvltentative\levelspace0\levelindent0{\leveltext +\leveltemplateid67633157\'01\u-3929 ?;}{\levelnumbers;}\f10\fbias0\hres0\chhres0 \fi-360\li6480\jclisttab\tx6480\lin6480 }{\listname ;}\listid1573277112}}{\*\listoverridetable{\listoverride\listid243488514\listoverridecount0\ls1} +{\listoverride\listid1573277112\listoverridecount0\ls2}{\listoverride\listid570427154\listoverridecount0\ls3}{\listoverride\listid463814724\listoverridecount0\ls4}}{\*\pgptbl {\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0 +\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}{\pgp\ipgp0\itap0\li0\ri0\sb0\sa0}}{\*\rsidtbl \rsid82861 +\rsid222077\rsid227916\rsid417554\rsid933385\rsid1124666\rsid2581528\rsid3160083\rsid3611072\rsid3804384\rsid3876361\rsid4198422\rsid4271791\rsid5601099\rsid5655082\rsid5852811\rsid5901880\rsid6313325\rsid6448706\rsid6846868\rsid7020513\rsid7162114 +\rsid7739776\rsid7742541\rsid7864568\rsid8610414\rsid9319045\rsid9838469\rsid9909128\rsid10425902\rsid10444408\rsid10813592\rsid10845340\rsid10967750\rsid10977128\rsid11496440\rsid11608519\rsid11677673\rsid12283771\rsid12323803\rsid12588127\rsid13045890 +\rsid14290941\rsid14581459\rsid14693038\rsid14961767\rsid15075321\rsid15157205\rsid15490329\rsid15820360\rsid15927270\rsid16076372\rsid16211124\rsid16330193\rsid16453112}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0 +\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\title PCSX2 0.9.6 readme}{\author bositman}{\operator bositman}{\creatim\yr2009\mo2\dy27\hr14\min21}{\revtim\yr2009\mo2\dy27\hr14\min24}{\version4}{\edmins1}{\nofpages6}{\nofwords1345}{\nofchars7264} +{\*\company PCSX2 team}{\nofcharsws8592}{\vern32895}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}{\xmlns2 urn:schemas-microsoft-com:office:smarttags}} +\paperw11906\paperh16838\margl1800\margr1800\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont1\relyonvml0\donotembedlingdata0\grfdocevents0\validatexml1\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors1\noxlattoyen +\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\formshade\horzdoc\dgmargin\dghspace180\dgvspace180\dghorigin1800\dgvorigin1440\dghshow1\dgvshow1 +\jexpand\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot\splytwnine\ftnlytwnine\htmautsp\nolnhtadjtbl\useltbaln\alntblind\lytcalctblwd\lyttblrtgr\lnbrkrule\nobrkwrptbl\snaptogridincell\allowfieldendsel\wrppunct +\asianbrkrule\rsidroot14581459\newtblstyruls\nogrowautofit\usenormstyforlist\noindnmbrts\felnbrelev\nocxsptable\indrlsweleven\noafcnsttbl\afelev\utinl\hwelev\spltpgpar\notcvasp\notbrkcnstfrctbl\notvatxbx\krnprsnet\cachedcolbal \nouicompat \fet0 +{\*\wgrffmtfilter 013f}\nofeaturethrottle1\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8610414 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 +\fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10967750 \chftnsep +\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8610414 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10967750 \chftnsepc +\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8610414 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10967750 \chftnsep +\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid8610414 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 { +\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10967750 \chftnsepc +\par }}\ltrpar \sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid12323803\sftnbj {\footerr \ltrpar \pard\plain \ltrpar\s22\qc \li0\ri0\widctlpar +\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid933385 + PAGE \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid15927270 1}}}\sectd \ltrsect\linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8610414 +\par }\pard \ltrpar\s22\ql \li0\ri0\widctlpar\tqc\tx4153\tqr\tx8306\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8610414 +\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}} +{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}\pard\plain \ltrpar +\qc \li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid15927270 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 +\b\fs36\lang1024\langfe1024\noproof\langnp1033\insrsid15927270 PCSX2 readme}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\fs36\lang1024\langfe1024\noproof\langnp1033\insrsid14290941\charrsid15927270 +\par }\pard \ltrpar\ql \li720\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin720\itap0\pararsid14290941 {\rtlch\fcs1 \af0 \ltrch\fcs0 \b\lang1024\langfe1024\noproof\langnp1033\insrsid15927270 +\par }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \cs15\b\lang1033\langfe1032\langnp1033\insrsid15927270\charrsid15927270 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \cs15\b\lang2057\langfe1032\langnp2057\insrsid12588127 +\par }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \cs15\b\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 PCSX2}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 + is a PlayStation 2 emulator for Windows and Linux, started by the same team that brought you }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid933385\charrsid5601099 HYPERLINK "http://www.pcsx.net/"}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid227916\charrsid5601099 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b4200000068007400740070003a002f002f007700770077002e0070006300730078002e006e00650074002f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af0 +\ltrch\fcs0 \cs16\ul\cf2\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 PCSX}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid12323803\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 (a Sony PlayStation 1 emulator).\line \line The }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \cs15\b\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 PCSX2}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 project attempts to allow PS2 code to be executed on your computer, thus meaning you can put a PS2 DVD or CD into your computers drive, and boot it up!\line }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14290941 Overview +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 \line The project has been running for }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10845340 more than five}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 + years now, and since it's initial release has grown in compatibility. From initially just being able to run a few public domain demos, it's current state enables many games to boot and actually go in game, such as the 'famous' }{\rtlch\fcs1 \ab\af0 +\ltrch\fcs0 \cs15\b\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 Final Fantasy X}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 or }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 +\cs15\b\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 Devil May Cry 3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid10845340 You can always visit the }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid933385\charrsid5601099 HYPERLINK "http://www.pcsx2.net/"}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid227916\charrsid5601099 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b4400000068007400740070003a002f002f007700770077002e00700063007300780032002e006e00650074002f000000795881f43b1d7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 +\af0 \ltrch\fcs0 \cs16\ul\cf2\lang2057\langfe1032\langnp2057\insrsid10845340\charrsid10845340 PCSX2 homepage}}}\sectd \ltrsect\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid12323803\sftnbj {\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10845340 to check the latest compatibility s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 tatus of games with more than 18}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid10845340 00 titles tested.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid8610414 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10813592 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10813592 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid10813592 What\rquote s new in 0.9.6? +\par +\par {\*\bkmkstart Added_Features_and_Improvements}{\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang2057\langfe1032\langnp2057\insrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar +\ql \fi-360\li720\ri0\sb100\sa100\sbauto1\saauto1\widctlpar\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls4\adjustright\rin0\lin720\itap0\pararsid10813592 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10813592 +Huge rewrite, mainly from the new members of the Playground branch!}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang2057\langfe1032\langnp2057\insrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10813592 +Dropped VM build replaced by the all new Vtlb, meaning no more \lquote Cannot allocate memory\rquote errors at start}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10444408 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid10813592 up,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10444408 more accurate emulation, slightly lower speeds but with many optimizations to come}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid11677673 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673 +Full memcard support, working in all games}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid10813592 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 Improved Frameskip/VU-skip +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\insrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10813592 Special Game Fixes Section +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 Advanced Options Section for custom tweaking VU/FPU behavior. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Rewritten Multithreaded GS (MTGS) mode, with a +s much as 15% speedup for HT machines (only 3-5% for Dual Core), and fixes many instabilities. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab} +Improved VU/FPU Flags and Clamping support (helps fix odd behaviors and SPS in some games) +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\lang1033\langfe1032\langnp1033\insrsid10813592\charrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Improved EE/IOP synchronization (fixes many freeze-ups and vmhacks). +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\fs20\insrsid10813592 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid10813592 Improved CDVD support. {\*\bkmkend Added_Features_and_Improvements} +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid10813592 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10813592\charrsid10813592 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10813592 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid12588127 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14290941 Configuration +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par A very detailed guide is available on the PCSX2 homepage which is already translated in several languages! +\par You can consult it }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid933385\charrsid5601099 HYPERLINK "http://forums.pcsx2.net/forum-23.html"}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid227916\charrsid5601099 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b6400000068007400740070003a002f002f0066006f00720075006d0073002e00700063007300780032002e006e00650074002f0066006f00720075006d002d00320033002e00680074006d006c000000795881f43b1d +7f48af2c825dc485276300000000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs16\ul\cf2\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 here}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid12323803\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid12588127 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14290941 Status +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid13045890 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 PCSX2 has come a long way since its\rquote + starting point back at 2002.Current features include:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid13045890 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0\pararsid13045890 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 +Separate recompilers for Emotion Engine (EE) , Vector Unit 0 (VU0) and Vector Unit 1 (VU1). +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid13045890 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls2\adjustright\rin0\lin720\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 Dual core support, with the Graphics Synthesizer (GS) running on a second thread. +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid13045890 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Usage of}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid5901880 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16453112 MMX,SSE1,SSE2,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 SS}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid8610414 S}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 E3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16453112 and SSE4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid13045890 extensions +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid13045890 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Proper SPU2 emulation featuring Auto DMA and Time Scaling +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid13045890 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Full }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 +gamepad support featuring Dual Shock 2,analog controls and even supporting analog movement over keyboard}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 (using some external plugins)}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid13045890 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid7020513 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 +Patch system for creating cheats and for workarounds on games +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid7020513 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid222077 Sections}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 that still need work: +\par +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid7020513 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \ltrpar\ql \fi-360\li720\ri0\widctlpar +\jclisttab\tx720\wrapdefault\aspalpha\aspnum\faauto\ls3\adjustright\rin0\lin720\itap0\pararsid7020513 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 Dev9 functions, such as HDD and Ethernet (partially implemented) support + +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid7020513 \loch\af3\dbch\af0\hich\f3 \'b7\tab}Firewire emulation}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid9838469 + (quite low on the list though)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid7020513 \loch\af3\dbch\af0\hich\f3 \'b7\tab}USB emulation (very partially implemented) +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid222077 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid222077 +Image Processing Unit (IPU) emulation which is responsible for the FMV playback.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid11677673 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid222077 +It has been implemented but it is buggy and slow +\par {\listtext\pard\plain\ltrpar \rtlch\fcs1 \af0 \ltrch\fcs0 \f3\lang2057\langfe1032\langnp2057\insrsid11608519 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid11608519 MIPS cache needs to be prop +erly implemented (barely works at this time) +\par }\pard \ltrpar\ql \li360\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin360\itap0\pararsid7020513 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14581459 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14581459 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid12588127 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid7020513 How can you }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid7162114 help}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 +\b\i\fs36\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid14290941 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 As most of you are aware, the PCSX2 team is working on this project at the expense of their free time and provide }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid6313325 it}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 without charging the program\rquote s use.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 + +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15157205 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7020513 +If you want to show your appreciation to these people and motivate them, you can donate any amount of money you feel is right to the team\rquote s paypal account }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15157205 +found in the official site}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\lang2057\langfe1032\langnp2057\insrsid12283771 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \b\lang2057\langfe1032\langnp2057\insrsid14290941 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14581459 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 +These funds will be used so the team members can get more modern and new hardware in order to test and debug more efficiently and even implement new features (just like dual core support for example). +\par +\par If you are a programmer and you are interested in helping the PCSX2 team by making additions or corrections to the code, you are free to browse through the public }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid2581528 Google Code}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 repository }{\field\fldedit{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid933385\charrsid5601099 HYPERLINK "http://code.google.com/p/pcsx2/"}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid227916\charrsid5601099 {\*\datafield +00d0c9ea79f9bace118c8200aa004ba90b0200000003000000e0c9ea79f9bace118c8200aa004ba90b5800000068007400740070003a002f002f0063006f00640065002e0067006f006f0067006c0065002e0063006f006d002f0070002f00700063007300780032002f000000795881f43b1d7f48af2c825dc48527630000 +0000a5ab0000}}}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \cs16\ul\cf2\lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 here}}}\sectd \ltrsect +\linex0\headery708\footery708\colsx708\endnhere\sectlinegrid360\sectdefaultcl\sectrsid12323803\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 after taking into account PCSX2 is under the }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 GNU G}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 eneral}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 P}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 ublic}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 L}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 icence (GPL) v2.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14290941 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12283771 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid4271791 +\par +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 The}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid4198422 Coding}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 +\b\i\fs36\lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 Team}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid12283771 +\par +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 +Below you can see 3 tables, showing the current team members who are actively coding at the present time, the current team members who have been inactive for some time and the older team members who for some reason quit along the way, which include the pr +evious project leader Linuzappz to whom we send our best regards }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 {\field{\*\fldinst SYMBOL 74 \\f "Wingdings" \\s 12}{\fldrslt\f10\fs24}}}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771\charrsid12283771 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid4271791 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14290941 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12283771 +\par +\par +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 +\par }{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid12283771 Current active team members: +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Nickname \cell +Real Name \cell Place\cell Comments \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 +\af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 saqib\cell \cell Pakistan\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 Project leader, f}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 ixing bugs }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 around (FPU, Interpreter, VUs..}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 )\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv +\brdrs\brdrw10 \trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127 +\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 refraction +\cell Alex Brown \cell England\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 General Coding DMA/VIF etc\cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard\plain \ltrpar\s18\ql \li0\ri0\widctlpar\intbl +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid417554 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 +\f2\fs20\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid11677673\charrsid417554 arcum42\tab }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid417554 \cell +}\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\insrsid11677673 \cell \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 Linux compatibility and porting}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673\charrsid14581459 +\trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 cottonvibes}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid417554 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 \cell \cell +}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 FPU and VU recompilers, general coding}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 \cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow4\irowband4\ltrrow +\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 drkIIRaziel}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid417554 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 \cell }{ +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 Greece}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid4271791 \cell }\pard\plain \ltrpar +\s18\ql \li0\ri0\widctlpar\intbl\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5852811 \rtlch\fcs1 +\af2\afs20\alang1025 \ltrch\fcs0 \f2\fs20\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5852811 Memory managemen}{\rtlch\fcs1 \af1 \ltrch\fcs0 +\f1\lang1033\langfe1032\langnp1033\insrsid11677673 t, emulation theory/principals, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5852811 recompiler design. +\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5852811 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow5\irowband5\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv +\brdrs\brdrw10 \trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127 +\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 gigaherz}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid417554 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 \cell \cell }{ +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid5852811 General coding, spu2ghz, cdvdGigaherz}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 +\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673\charrsid14581459 \trowd \irow6\irowband6\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 Jake Stine-Air}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid417554 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid4271791 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 USA}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid4271791 \cell }\pard\plain \ltrpar\s18\ql \li0\ri0\widctlpar\intbl +\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid5852811 \rtlch\fcs1 \af2\afs20\alang1025 \ltrch\fcs0 +\f2\fs20\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\lang2057\langfe1032\langnp2057\insrsid11677673 MTGS,}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5852811 +counters, timing/syncing, general coding}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\lang1033\langfe1032\langnp1033\insrsid11677673 ,SPU2-X}{\rtlch\fcs1 \af2 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5852811 \cell }\pard\plain \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang1032\langfe1032\cgrid\langnp1032\langfenp1032 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow7\irowband7\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv +\brdrs\brdrw10 \trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127 +\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 rama\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 \cell \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 +Resident hacker, uses random values until they fix something, then figures out why :P}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow8\irowband8\ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 tmkk\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 \cell \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 VUs, recompilers, }{ +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid4271791 x86asm}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673\charrsid14581459 \trowd \irow9\irowband9\lastrow \ltrrow\ts11\trgaph108\trrh255\trleft-1008\trbrdrt\brdrs\brdrw10 \trbrdrl +\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9683\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-900\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx476\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1651\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth708\clshdrawnil \cellx3111\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5840\clshdrawnil \cellx8951\row }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14581459 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid14581459 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14290941 {\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid12283771 +Current inactive team members: +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14581459 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Nickname \cell +Real Name \cell Place\cell Comments \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\pararsid7162114 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 +florin\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Florin Sasu\cell Romania\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 Master of HLE. Master of cd code and bios HLE..\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Nachnbrenner\cell \cell Germany\cell patch freak :P}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673\charrsid14581459 +\trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 aumatt\cell +\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 Australia}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid16453112 \cell }{\rtlch\fcs1 \af1\afs20 +\ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 a bit of everything mostly handles CDVD cmds}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid16453112 \cell +}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow3\irowband3\ltrrow +\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Shadow\cell +George Moralis \cell Greece\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 Project founder, m}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 aster of cpu, master of bugs, general coding\'85\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow4\irowband4\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\trowd \irow5\irowband5\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 +\trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Goldfinger\cell \cell Brazil\cell }{ +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 MMI,FPU and general stuff\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow5\irowband5\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 loser\cell \cell Australia\cell obscure cdvd related stuff\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid11677673 \trowd \irow6\irowband6\ltrrow\ts11\trgaph108\trrh273\trleft-1080\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 zerofrog}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid16453112 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid16453112 \cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673 USA}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid16453112 \cell }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid11677673 R}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid11677673\charrsid9909128 +ecompilers, ZeroGS, x86-64, linux, optimizations, general fixes and new features}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid16453112 \cell }\pard \ltrpar +\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow7\irowband7\lastrow \ltrrow\ts11\trgaph108\trrh273\trleft-1080 +\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth9878\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-972\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1484\clshdrawnil \cellx404\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1723\clshdrawnil \cellx2127\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1039\clshdrawnil \cellx3166\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth5632\clshdrawnil \cellx8798\row }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14581459 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid14290941 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14290941 {\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid4271791 +\par +\par }{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid14581459\charrsid12283771 Ex team members: +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid14581459 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14581459 +\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Nickname \cell +Real Name \cell Place\cell Comments \cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673 \trowd \irow0\irowband0\ltrrow +\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\row \ltrrow}\trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 +\af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Linuzappz \cell \cell Argentina\cell }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673 Project founder, m}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 +\f1\fs20\lang2057\langfe1032\langnp2057\insrsid11677673\charrsid14581459 aster of The GS emulation and so many others..\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang1033\langfe1032\langnp1033\insrsid11677673\charrsid5601099 \trowd \irow1\irowband1\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv +\brdrs\brdrw10 \trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791 +\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr +\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\row \ltrrow}\trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 { +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 basara\cell \cell \cell Recompiler programmer. general coding\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 +\ltrch\fcs0 \insrsid11677673 \trowd \irow2\irowband2\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\row \ltrrow}\trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh +\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 \trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb +\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 +\af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 [TyRaNiD]\cell \cell \cell GS programmer.General coding\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\insrsid11677673 \trowd \irow3\irowband3\ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11677673 Roor\cell \cell \cell +General coding\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid11677673 \trowd \irow4\irowband4\lastrow \ltrrow\ts11\trgaph108\trrh273\trleft-1003\trbrdrt +\brdrs\brdrw10 \trbrdrl\brdrs\brdrw10 \trbrdrb\brdrs\brdrw10 \trbrdrr\brdrs\brdrw10 \trbrdrh\brdrs\brdrw10 \trbrdrv\brdrs\brdrw10 +\trftsWidth3\trwWidth10075\trftsWidthB3\trautofit1\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblrsid11677673\tblind-895\tblindtype3 \clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clNoWrap\clftsWidth3\clwWidth1184\clshdrawnil \cellx181\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1610\clshdrawnil \cellx1791\clvertalb\clbrdrt +\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 \cltxlrtb\clNoWrap\clftsWidth3\clwWidth1073\clshdrawnil \cellx2864\clvertalb\clbrdrt\brdrs\brdrw10 \clbrdrl\brdrs\brdrw10 \clbrdrb\brdrs\brdrw10 \clbrdrr\brdrs\brdrw10 +\cltxlrtb\clftsWidth3\clwWidth6208\clshdrawnil \cellx9072\row }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid12588127 {\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid12588127 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid16453112 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16453112 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid5655082 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16453112 +\par +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12588127\charrsid12588127 Additional coding: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid5655082 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12588127\charrsid12588127 F|RES}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422 ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422 Pofis,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid12588127\charrsid12588127 Gigaherz}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422 ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12588127\charrsid12588127 Nocomp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 _Riff_,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 fumofumo}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3876361 , pseudonym, }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid3876361 Nneeve}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid15820360\charrsid3876361 + +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid1124666 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid1124666 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid4198422\charrsid12283771 The}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid4198422 Beta Tester}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 +\b\i\fs36\lang2057\langfe1032\langnp2057\insrsid4198422\charrsid12283771 Team}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422\charrsid4198422 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid12588127 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422 +\par Beta testers are people (slaves/mindless grunts :P) who constantly test new PCSX2 beta builds to report any new bugs, regressions or improvements. While this might sound simple to most, what many people do not know is that }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid1124666 testers also debug with the coders, maintain th}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3804384 e huge game compatibility list, }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid1124666 create dumps and logs for the coders and so much more. As above,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid1124666 active,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 +inactive and ex members are listed alphabetically}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid12588127 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1124666 {\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid2581528 +\par +\par }{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid1124666\charrsid12283771 Current active members: +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid12588127 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid4198422 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1124666 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666\charrsid12588127 Bositman}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid1124666 ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 Crushtest,}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid3611072 Falcon4Ever,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 GeneralPlot}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16330193 ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid2581528 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16330193 Krakatos}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid2581528 , Prafull}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1124666 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid1124666 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 \tab }{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 +\b\i\fs28\lang2057\langfe1032\langnp2057\insrsid1124666\charrsid12283771 Current inactive team members:}{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid1124666 +\par }{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid12283771 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid1124666 Belmont,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid7162114 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid3804384\charrsid12588127 CKemu}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid3804384 ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid7162114 }{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid1124666 Knuckles,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid6313325 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid1124666 Raziel}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid14693038 , }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16330193 RudyX,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16330193\charrsid1124666 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16330193 P}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid16330193\charrsid12588127 arotaku}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid1124666\charrsid7162114 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid1124666 +\par }\pard \ltrpar\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid5655082 {\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid1124666\charrsid12283771 Ex team members:}{\rtlch\fcs1 +\af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid15820360 +\par }{\rtlch\fcs1 \af0\afs28 \ltrch\fcs0 \b\i\fs28\lang2057\langfe1032\langnp2057\insrsid7864568 +\par }\pard \ltrpar\qc \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid7742541 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 Chaoscode, }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541\charrsid15820360 CpUMasteR}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 , EFX ,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541\charrsid7742541 }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 Elly, JegHegy, Razorblade,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid14693038 RPGWizard,}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid1124666 Seta San,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 Snake875}{\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid417554 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid15820360 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid4271791 +\par +\par +\par +\par +\par +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid2581528 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid3611072 Release date chart +\par +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid227916 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1033\langfe1032\langnp1033\insrsid2581528\charrsid227916 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid3611072 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072 +\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2581528 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid3611072 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072 +And here are the actual release dates for those of you who are curious:}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid3611072 +\par +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 0.026}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 23 March 2002 +\par 0.031}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 14 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7162114 A}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 pril 2002 +\par 0.036}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 17 June 2002 +\par 0.038}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 7 July 2002 +\par 0.042}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 11 September 2002 +\par 0.1}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 20 December 2002 +\par 0.2}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 19 February 2003\tab +\par 0.3}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 2 may\tab 2003 +\par 0.4}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 31 July 2003 +\par 0.41}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 7 August 2003 +\par 0.5}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 25 November 2003 +\par 0.6}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 24 March 2004 +\par 0.7}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 17 December 2004 +\par 0.8}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 16 May 2005 +\par 0.81}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 17 May 2005 +\par 0.9}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 3 April 2006 +\par 0.9.1}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 3 July 2006 +\par 0.9.2}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 18 November 2006 +\par 0.9.3 Linux only}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 1 April 2007 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid10425902 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 0.9.4}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid10425902 :}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 \tab \tab 11 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 November}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid3611072\charrsid10425902 2007}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid10425902 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid2581528 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7864568 0.9.6:}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid8610414 1 March 2009}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid2581528 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid15820360 Additional thanks and credits}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid10425902 +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid15820360 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid15820360 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Duke of NAPALM: \tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 For the 3d stars demo.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 +The first demo that worked in pcsx2 :)}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \b\i\fs36\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 Tony Saveski (dreamtime): }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 F}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or his great ps2tutorials!! +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 F|res: \tab \tab \tab Author of dolphin,}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 a big thanks from shadow.. +\par Now3d}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 :\tab \tab \tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 The guy that helped }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 shadow}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 at }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 his}{\rtlch\fcs1 \af0 +\ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 first steps.. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Keith:\tab \tab \tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 Who believed in us.. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Bobbi & }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 Thorgal: }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 \tab F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or hosting us, for }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 +the old page }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 design }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 and so}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 many other}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 things}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Sjeep:\tab \tab \tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 Help and info +\par BGnome}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 : }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 \tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 Help testing stuff +\par {\*\xmlopen\xmlns2{\factoidname City}}{\*\xmlopen\xmlns2{\factoidname place}}Dixon}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 {\*\xmlclose}{\*\xmlclose}: }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 \tab \tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 Design }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 of the old}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 pcsx2 page, and the pcsx2.net domain +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Bositman:\tab \tab PCSX2}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 + beta tester :) (gia sou bositman pare ta credits sou ) +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 No-Reccess:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 \tab N}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 ice guy and great demo coder :) +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 NSX}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 2 team}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 : }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 \tab \tab F}{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 their help with VU}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 ;) +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Razorblade: F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or the }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 old PCSX2 logo & }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 icon. +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 S}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 nake}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 : \tab H}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 e knows what for :P +\par Ector}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 : }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 \tab \tab A}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 wesome emu :) +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 Zezu: \tab \tab A good guy. G}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 ood luck with your emu }{\rtlch\fcs1 +\af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 :P}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 +\par Hiryu & Sjeep:\tab \tab F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or their libcdvd (iso parsing and filesystem driver code) +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 Sjeep: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid15820360 \tab \tab \tab F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 the }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 SjDATA filesystem driver +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 F|res:\tab \tab \tab F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or the original DECI2 implementation +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 libmpeg2: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541 \tab \tab F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 the }{ +\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 mpeg2 decoding routines +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 Aumatt: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541 \tab \tab F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or applying fixes to pcsx2 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 Microsoft: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541 \tab \tab For VC.N}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 et 2003}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 + (and now 2005)}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 (really faster than vc6) :P +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 NASM team: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541 F}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 or nasm +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 CKemu: }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 }{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541 \tab \tab L}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360\charrsid15820360 ogos/design}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid15820360 + +\par }\pard \ltrpar\ql \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid7742541 {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541\charrsid7742541 +\par and probably to a few more.. +\par +\par Special Shadow's thanks go to...}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541\charrsid7742541 +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid6313325 My friends}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 : Dimitris, James, Thodoris, T}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\lang2057\langfe1032\langnp2057\insrsid7742541\charrsid7742541 hanasis and probably to a few more..and of course to a lady somewhere out there....}{\rtlch\fcs1 \af0 \ltrch\fcs0 \lang2057\langfe1032\langnp2057\insrsid7742541 +\par +\par +\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\lang2057\langfe1032\langnp2057\insrsid7864568 Created for v0.9.6}{\rtlch\fcs1 \af0 \ltrch\fcs0 \i\lang2057\langfe1032\langnp2057\insrsid7742541 by bositman.}{\rtlch\fcs1 \af0 \ltrch\fcs0 +\i\lang2057\langfe1032\langnp2057\insrsid7742541\charrsid7742541 +\par }{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \i\fs36\lang2057\langfe1032\langnp2057\insrsid7742541 +\par }\pard \ltrpar\qr \li-900\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin-900\itap0\pararsid7742541 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \i\fs36\lang2057\langfe1032\langnp2057\insrsid7742541 +\par +\par +\par }\pard \ltrpar\qr \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid2581528 {\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \i\fs36\lang2057\langfe1032\langnp2057\insrsid7742541\charrsid7742541 +The PCSX2 Coding and Beta testing team}{\rtlch\fcs1 \af0\afs36 \ltrch\fcs0 \i\fs36\lang2057\langfe1032\langnp2057\insrsid9319045\charrsid14693038 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef0{\lsdlockedexcept \lsdqformat1 \lsdlocked0 Normal;\lsdqformat1 \lsdlocked0 heading 1; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 4; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 7; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 heading 9;\lsdpriority99 \lsdlocked0 footer;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdlocked0 caption; +\lsdqformat1 \lsdlocked0 Title;\lsdqformat1 \lsdlocked0 Subtitle;\lsdqformat1 \lsdlocked0 Strong;\lsdqformat1 \lsdlocked0 Emphasis;\lsdpriority99 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdpriority99 \lsdlocked0 Placeholder Text; +\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2; +\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List; +\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;\lsdpriority61 \lsdlocked0 Light List Accent 1; +\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdsemihidden1 \lsdpriority99 \lsdlocked0 Revision; +\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1; +\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;\lsdpriority72 \lsdlocked0 Colorful List Accent 1; +\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2; +\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2; +\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3; +\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4; +\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4; +\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5; +\lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5; +\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6; +\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6; +\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6; +\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography; +\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e352e30000000000000000000000e0000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff0900060000000000000000000000010000000100000000000000001000000200000001000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdffffff04000000feffffff05000000fefffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffff01000000ec69d9888b8b3d4c859eaf6cd158be0f00000000000000000000000000e0 +1363d698c9010300000080020000000000004d0073006f004400610074006100530074006f0072006500000000000000000000000000000000000000000000000000000000000000000000000000000000001a000101ffffffffffffffff02000000000000000000000000000000000000000000000000e01363d698c901 +00e01363d698c9010000000000000000000000004100580045003100d300cb005a0055005100d4005300d600c7004b00c900c900ca00db00da003300d600d0003d003d000000000000000000000000000000000032000101ffffffffffffffff03000000000000000000000000000000000000000000000000e01363d698 +c90100e01363d698c9010000000000000000000000004900740065006d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000201ffffffff04000000ffffffff000000000000000000000000000000000000000000000000 +00000000000000000000000000000000cd00000000000000010000000200000003000000feffffff0500000006000000070000000800000009000000feffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c623a536f757263657320786d6c6e733a623d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f6772617068792220786d6c6e733d +22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222053656c65637465645374796c653d225c4150412e58534c22205374796c654e616d653d22415041222f3e006e00650073006500200045006e00 +760065006c006f007000650020004b0061006b00750020002300320000004100360000003c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d226e6f223f3e0d0a3c64733a6461746173746f72654974656d2064733a6974656d49443d227b43453142 +373130312d353442362d343434332d423639432d4141363941424245394444427d2220786d6c6e733a64733d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f637573746f6d586d6c223e3c64733a736368656d61526566733e3c +64733a736368656d615265662064733a7572693d22687474703a2f2f736368656d61732e6f70656e500072006f007000650072007400690065007300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000200ffffffffffffffffffffffff000000000000 +0000000000000000000000000000000000000000000000000000000000000400000055010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000786d6c666f726d6174732e6f72672f6f6666696365446f63756d656e742f323030362f6269626c696f677261706879222f3e3c2f64733a736368656d61526566733e3c2f64733a6461746173746f +72654974656d3e007000650020004d006f006e006100720063006800000045006e00760065006c006f0070006500000045006e00760065006c006f0070006500200042003600000045006e00760065006c006f0070006500200042003500000045006e00760065006c006f0070006500200042003400000045006e007600 +65006c006f00700065002000430036003500000045006e00760065006c006f0070006500200043003600000045006e00760065006c006f0070006500200043003400000045006e00760065006c006f0070006500200043003300000045006e00760065006c006f0070006500200043003500000045006e00760065006c00 +6f0070006500200044004c00000045002000730069007a006500200073006800650065007400000044002000730069007a006500200073006800650065007400000043002000730069007a006500200073006800650065007400000045006e00760065006c006f00700065002000230031003400000045006e0076006500 +6c006f00700065002000230031003200000045006e00760065006c006f00700065002000230031003100000045006e00760065006c006f000105000000000000}} \ No newline at end of file diff --git a/pcsx2/Docs/PS2Edefs.txt b/pcsx2/Docs/PS2Edefs.txt deleted file mode 100644 index 5442da8297..0000000000 --- a/pcsx2/Docs/PS2Edefs.txt +++ /dev/null @@ -1,443 +0,0 @@ - PS2E Definitions v0.3.0 (beta) - ------------------------------ - - Author: linuzappz@pcsx.net - -Note: Refer to PS2Edefs.h for more info. - -1) API Funcs -2) FAQs -3) Notes - -1) API Funcs: - --------- - - Common stuff: - ------------ - -// u32 CALLBACK PS2EgetLibType(void); - -Gets the plugin type, from the following defines: - -#define PS2E_LT_GS 0x01 -#define PS2E_LT_PAD 0x02 -#define PS2E_LT_SPU2 0x04 -#define PS2E_LT_CDVD 0x08 -#define PS2E_LT_DEV9 0x10 -#define PS2E_LT_USB 0x20 -#define PS2E_LT_FIREWIRE 0x40 - -Note that the types can be ORed so you can make an -ie. GS/PAD plugin in one dll. - -// u32 CALLBACK PS2EgetLibVersion(void); - -Will get the plugin version: - -const unsigned char version = 1; // GS library v1 -const unsigned char revision = VERSION; -const unsigned char build = BUILD; // increase that with each version - -return version<<16|revision<<8|build; - -'version' is the GS plugin API version, as this is beta, -it should be 1. -'revision' and 'build' are plugin defined values. - -// char* CALLBACK PS2EgetLibName(void); - -Get the LibName, ie. "GSsoftdx Driver"; - - - - GS plugin API: - ------------- - -Basic funcs ------------ - -// s32 CALLBACK GSinit(); - -Inits the plugin, return 0 on success, else -1. - -// s32 CALLBACK GSopen(void *pDsp, char *Title); - -Opens the plugin, return 0 on success, else -1. -The plugin must fill the 'pDsp' arg (32bit) that'll be -passed to other plugins (*1), this is OS dependant (*2). - -On Win32: pass a HWND value, ie: - *(long*)pDsp = (long)GShwnd; -On Linux: pass a Display value, ie: - *(long*)pDsp = (long)display; - -*1 Even if this value is passed to every plugin, this -may not be used by the plugins. - -*2 This could change anyways, ie. maybe you can code a -GS/PAD plugin for a speacial library, so the pDsp -will be a value that you need to communicate between -them (if you need to do this). - -// void CALLBACK GSclose(); - -Close the plugin. - -// void CALLBACK GSshutdown(); - -Shutdown the plugin. - -// void CALLBACK GSvsync(); - -Called on every VSync. - -// void CALLBACK GSgifTransfer(u32 *pMem, u32 size); - -Transfer 'size' qwords (128bit) from 'pMem' to the Gif. - -// void CALLBACK GSgifTransfer2(u32 *pMem); - -Transfer a qwords (128bit) block from 'pMem' to the Gif. - -// void CALLBACK GSwrite32(u32 mem, u32 value); - -Writes to address 'mem' data 'value', 32bit. -Addresses can range from 0x12000000 to 0x14000000. - -// void CALLBACK GSwrite64(u32 mem, u64 value); - -Writes to address 'mem' data 'value', 64bit. -Addresses can range from 0x12000000 to 0x14000000. - -// u32 CALLBACK GSread32(u32 mem); - -Returns 32bit from address 'mem'. -Addresses can range from 0x12000000 to 0x14000000. - -// u64 CALLBACK GSread64(u32 mem); - -Returns 64bit from address 'mem'. -Addresses can range from 0x12000000 to 0x14000000. - -Extended funcs --------------- - -// void CALLBACK GSkeyEvent(keyEvent *ev); - -Gets called when there is a keyEvent from the PAD plugin - -// void CALLBACK GSmakeSnapshot(char *path); - -Makes an snapshot of the vRam, can be a with the full -vRam or just the view area (as you prefer), to the dir -'path'. - - -// #ifdef __WIN32__ -// s32 CALLBACK GSsetWindowInfo(winInfo *info); -// #endif - -Windows only function, will pass the info struct to the -GS plugin, if the plugin will use this info it should -return 1 (TRUE), else the emu will destroy the window -handle and let the plugin take care of that. -This function must be called before the GSopen. -Note that the emu should hide the hMenu and the hStatusWnd -if it they are set. -The position and size of the window is not specified and -should be reset by the plugin, but the window passed should -be in a normal state, not maximized nor minimized. -After a GSclose the emu must destroy the window and -recreate it. - -// void CALLBACK GSconfigure(); - -Configure the plugin. - -// void CALLBACK GSabout(); - -Shows an About Dialog of the plugin. - -// s32 CALLBACK GStest(); - -Returns 0 if the plugin should work ok, else -1. - - - - PAD plugin API: -=[ OBSOLETE ]=- - -------------- - -Basic funcs ------------ - -// s32 CALLBACK PADinit(u32 flags); - -Inits the plugin, return 0 on success, else -1. - -// s32 CALLBACK PADopen(void *pDsp); - -Opens the plugin, return 0 on success, else -1. -The 'pDsp' is a value from the GS plugin (refer to -GSopen). - -// void CALLBACK PADclose(); - -Close the plugin. - -// void CALLBACK PADshutdown(); - -Shutdown the plugin. - -// keyEvent* CALLBACK PADkeyEvent(); - -Called every vsync, return NULL if no event happened. - -// u8 CALLBACK PADstartPoll(int pad); - -Starts polling data from the PAD, 'pad' can be 1 (pad1) -or 2 (pad2). -Returns first byte from buffer; - -// u8 CALLBACK PADpoll(u8 value); - -Returns next byte from buffer; -Refer to "pad and mem card data.txt" or "padmem.txt", -for info about value/buffer data. - -// u32 CALLBACK PADquery(); - -returns: 1 if supported pad1 - 2 if supported pad2 - 3 if both are supported - -Extended funcs --------------- - -// void CALLBACK PADconfigure(); - -Configure the plugin. - -// void CALLBACK PADabout(); - -Shows an About Dialog of the plugin. - -// s32 CALLBACK PADtest(); - -Returns 0 if the plugin should work ok, else -1. - - - - SIO plugin API: - -------------- - -Basic funcs ------------ - -// s32 CALLBACK SIOinit(u32 port, u32 slot, SIOchangeSlotCB f); - -Inits the plugin, return 0 on success, else -1. -port/slot combination will be used to load the corresponding - configuration data from ini. It's like an id for the instance. -'f' is a callback function that is used by SIO_TYPE_MTAP capable - plugins to change active slot in emulator (since sio is emu-controled). - -// s32 CALLBACK SIOopen(void *pDsp); - -Opens the plugin, return 0 on success, else -1. -The 'pDsp' is a value from the GS plugin (refer to -GSopen). - -// void CALLBACK SIOclose(); - -Close the plugin. - -// void CALLBACK SIOshutdown(); - -Shutdown the plugin. - -// u8 CALLBACK SIOstartPoll(u8 value); - -Starts polling data from the SIO, 'value' is - 0x01, 0x21, 0x61 and 0x81 corresponding to pad, mtap, rm and mc. -Returns first byte from buffer; - -// u8 CALLBACK SIOpoll(u8 value); - -Returns next byte from buffer; -Refer to "pad and mem card data.txt", "padmem.txt" or - "padspecs.txt" (http://ps2dev.ps2-scene.org/padspecs.txt), -for info about value/buffer data. - -// u32 CALLBACK SIOquery(); - -#define SIO_TYPE_PAD 0x00000001 -#define SIO_TYPE_MTAP 0x00000004 -#define SIO_TYPE_RM 0x00000040 -#define SIO_TYPE_MC 0x00000100 - -returns: ORed value of SIO_TYPE_xxxx - the capabilities of the plugin -eg. a remote control plugin will return SIO_TYPE_PAD | SIO_TYPE_RM - -Extended funcs --------------- - -// void CALLBACK SIOconfigure(); - -Configure the plugin. - -// void CALLBACK SIOabout(); - -Shows an About Dialog of the plugin. - -// s32 CALLBACK SIOtest(); - -Returns 0 if the plugin should work ok, else -1. - - - - SPU2 plugin API: - --------------- - -TODO :) - -Basic funcs ------------ - -// s32 CALLBACK SPU2init(); -// s32 CALLBACK SPU2open(void *pDsp); -// void CALLBACK SPU2close(); -// void CALLBACK SPU2shutdown(); -// void CALLBACK SPU2update(); -// void CALLBACK SPU2dma(u32 *dmaAddr, char *pRam); -// void CALLBACK SPU2write(u32 mem, u16 value); -// u16 CALLBACK SPU2read(u32 mem); - -Extended funcs --------------- - -// void CALLBACK SPU2configure(); -// void CALLBACK SPU2about(); -// s32 CALLBACK SPU2test(); - - - - CDVD plugin API: - --------------- - -Basic funcs ------------ - -// s32 CALLBACK CDVDinit(); - -Inits the plugin, return 0 on success, else -1. - -// s32 CALLBACK CDVDopen(); - -Opens the plugin, return 0 on success, else -1. - -// void CALLBACK CDVDclose(); - -Close the plugin. - -// void CALLBACK CDVDshutdown(); - -Shutdown the plugin. - -// s32 CALLBACK CDVDreadTrack(u32 lsn, int mode); - -Starts reading from the specified 'lsn' sector location, -return 0 on success, else -1. - -// u8* CALLBACK CDVDgetBuffer(); - -Gets a pointer to the buffer with the sector data -readed by a previously CDVDreadTrack call. -The buffer size depends on the mode used for readTrack. - -note: return can be NULL (for async modes) - -// s32 CALLBACK CDVDreadSubQ(u32 lsn, cdvdSubQ* subq); - -Read subq data from disc at 'lsn' location (only cds have subq data), -return 0 on success, else -1. - -// s32 CALLBACK CDVDgetTN(cdvdTN *Buffer); - -Get the the cdvdTN data for the currect CdRom, -return 0 on success, else -1. - -// s32 CALLBACK CDVDgetTD(u8 Track, cdvdLoc *Buffer); - -Get the the cdvdTD data for the 'Track' track in the current CdRom, -return 0 on success, else -1. - -// s32 CALLBACK CDVDgetTOC(void* toc); - -Get ps2 style toc from disc, return 0 on success, else -1. -(ps2 toc isnt quite the same as a normal disc toc, -especially for dvds) - -// s32 CALLBACK CDVDgetDiskType(); - -Returns disktype in the format CDVD_TYPE_xxxx - -// s32 CALLBACK CDVDgetTrayStatus(); - -Returns tray status in the format CDVD_TRAY_xxxx - -// s32 CALLBACK CDVDctrlTrayOpen(); - -Opens disc tray, return 0 on success, else -1. - -// s32 CALLBACK CDVDctrlTrayClose(); - -Closes disc tray, return 0 on success, else -1. - - -Extended funcs --------------- - -// void CALLBACK CDVDconfigure(); - -Configure the plugin. - -// void CALLBACK CDVDabout(); - -Shows an About Dialog of the plugin. - -// s32 CALLBACK CDVDtest(); - -Returns 0 if the plugin should work ok, else -1. - - -2) FAQs - - * What's the right open/close sequence? - 1. CDVD - 2. GS - 3. PAD1/2 - 4. SPU2 - - * Where to start coding a plugin? - Get an open source plugin, mine are all open source, - so you can freely base on them. - - * Why GSgifTransfer2 exists? - GSgifTransfer2 is used by the XGKICK VU1 opcode, and - it doesn't has a size, the GSgifTransfer is used by he GIF - and the VIF dmas, and it has a size, so that's why :). - -3) Notes - - * CDVDgetBuffer should be used after CDVDreadTrack, - like this: - CDVDreadTrack(time); - ptr = CDVDgetBuffer(); - - but not like this; - ptr = CDVDgetBuffer(); - CDVDreadTrack(time); - - * Errors should be checked for both CDVDreadTrack and CDVDgetBuffer, - and not only CDVDreadTrack. - diff --git a/pcsx2/Docs/RemoteDebugging.txt b/pcsx2/Docs/RemoteDebugging.txt deleted file mode 100644 index 339b400b48..0000000000 --- a/pcsx2/Docs/RemoteDebugging.txt +++ /dev/null @@ -1,105 +0,0 @@ -ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» -ºNOTE: 1. this is an internal pcsx2 team document, for developers ONLYº -º 2. lamers/gamers are excluded º -º 3. DECI2 will not run your games:P º -ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ - -RemoteDebugging -=============== - -This is a new feature available for debugging applications within pcsx2 emu. - Using a remote debugger is not wellcomed unless it is more featured. - Fortunately, there are such debuggers. Currently added support is for win32 - target only; also, only TCP/IP remote connection and only for Sony's DECI2 - app-level protocol. Future addition could be GNU debugger remote support. - -Anyway, pcsx2 has a new menu item that allows one to start a debugging session - by specifying the listen port [default for DECI2 is 8510]. Pcsx2 will act like - a server for the remote debugger. It is set to accept connections on any IP. - For local debugging sessions, use IP=127.0.0.1 aka IP=localhost. On the - other hand, if a pcsx2 would be listening on an active IP in the Internet, - anyone could connect to it;) Only one connection is supported. After the - connection is closed by the client/remote tool, the only thing to do is to - "admire" the log window and then close it/restart the emu. - -So, to start a debug session: - - first start the emu [quite reasonable; because it will be the server]. There - are some issues if you start the client first or if you didn't close ALL the - client subprograms in the last debugging session. - - choose from the menu, Debug->Remote Debugging. A dialog will pop asking for - the port to use. Also, if you have a non-HLE bios selected in the Config box, - ie. a true bios, there will be also an option weather to debug the bios. You - have 2 choices: - -not checked=Run Bios - before any debug is performed a bios run. ie. the emu - will run the bios up to the shell loading or a bit - further, to the moment when all the iop modules are - loaded. You will have then a full environment loaded. - -checked=Debug Bios - nothing is done further and the PC=0xBFC00000. - - after that a connection log window will be shown and you can follow the - connection data exchange. First, the emu is placed in a wait state. - - this is the moment you have to run the client. It will open the connection. - The emu accepts the connection and the DECI2 protocol is on;) - You'll see how the client queries for registers values & memory areas. - - the situation gets complicated since you can do many things from now on: - -Debug bios: - - start with a bios selected and the check box checked (see above). - - PC=0xBFC00000 and you can trace the bios now. Anyway, there is no breakpoints - support for the bios as the client "thinks" you are debugging the real PS2, - so you cannot write to bios area. BTW: the breakpoints are implemented by - patching the code with a BREAK instruction. Since you cannot write such instr - you cannot put a breakpoint on the bios, cannot run to address and so on... -Run bios: - - start with a bios selected and the check box not checked (see above). - - wait till the emu runs the bios...it will take some time. After THAT the - connection log window will be displayed. - - PC=0x82000 or smth like that...you can check the environment set up while - running the bios. The modules window for instance. And various memory - structures. Also, this is the entrypoint of the shell loading. Try to trace - it;) -Debug an application: - - start with HLEbios selected (see above) - - since the debugger (the client) does debug whatever you want to. You can - load the elf to debug with pcsx2 loader (ie. with File->Load ELF file or - from the CDVD). But you will need to know the entrypoint to force it in - remote debugger (set PC to cursor or to address). This way is not recomended. - I like to use the loader of the debugger since it knows to load the source - also if available and does not cause troubles with setting the PC. Also, if - the ELF has symbols, it can run it to main;) - - now, you're on your own. Use step by step, step over, breakpoints, run to - cursor, run to address etc. HAPPY DEBUGGING! - -KNOWN ISSUES and NOTES -====================== - - use CDVDnull or another plugin as you like to have or not a src for cdvd - loading;) - - pcsx2 does not have support to debug the IOP. You can do this now but it is - a hard job. That is due to the fact that PS2 can run every processor - independently (ie. one can be stopped) and pcsx2 cannot. The emu runs either - all the procs or nothing. So, in the debugger, the debugged processor is on - stop and others are "running". When there will be added support for debugging - the IOP, also only one processor will run. - - do not step through the program very fast. Because of the communication speed - and a reentrancy issue, this will get the debugger in a FALSE run state. That - means that the debugger "thinks" that the PS2 (ie. pcsx2;)) is running, - although it is not. The simple solution to this is to press STOP/BREAK button - in the debugger. Notice also that some run states might be also true! When - you are stepping over a big loop...that might take some time, so if you stop - the emu you will get in the middle of the loop:P - - you can also notice the low speed that can also be met in the pcsx2 debugger. - That's because Cpu->Step() is used. - - also, notice that you cannot debug in recompiler mode! ONLY interpreter mode - works! - - IOP modules loading is not supported and the files loaded from host directory - are also loaded in pcsx2 way, ie. from host\ directory; not through remote - debugger. - - if you try to debug the bios and the code is not displayed...scroll down - in order to have only valid addresses on the screen; ie. the top address - to be 0xBFC00000 and in emu communication log there will be no ADDRESS ERROR. - - -=============================== -Florin (florinsasu@yahoo.com) -2003/04/17 diff --git a/pcsx2/Docs/Translating.txt b/pcsx2/Docs/Translating.txt deleted file mode 100644 index 9fb98e10a2..0000000000 --- a/pcsx2/Docs/Translating.txt +++ /dev/null @@ -1,41 +0,0 @@ - Translating PCSX2 - ----------------- - -Just some small notes for translators. - -First download the translator package from the download section of http://www.pcsx2.net - -PCSX2 translations are based on the gettext library: -http://www.gnu.org/software/gettext. - -The main file to translate is pcsx2.po which cames in the package you downloaded, -note that you must place the translated -strings over the msgstr and leave untouched the msgid. - -Example: - -msgid "Memory Card 1" -msgstr "Your Translation goes here" - -To test the translation use the msgfmt.exe utility to -convert the translated pcsx2.po file to a pcsx2.mo file -with this command: 'msgfmt pcsx2.po -o pcsx2.mo -v', after translating -the file please send us the .po and .mo file and please ask before -translating it, maybe someone has already started it -for your language. - -Version update for 0.9.2/3: - -I have rewritten the contents of the Translation doc to ease reading -and brung it up to date with the current GUI. Translations will work in 0.9.2 -but some Menu options may still show as their original names (fixed in 0.9.3). - - - -If you have any problems contact us and we'll try to -help you. - -Regards -linuzappz,shadow,refraction - -Contact me at : refraction@gmail.com or visit us on efnet #pcsx2 \ No newline at end of file diff --git a/pcsx2/Docs/readme 0.9.4.txt b/pcsx2/Docs/readme 0.9.4.txt deleted file mode 100644 index 2048b28cb2..0000000000 --- a/pcsx2/Docs/readme 0.9.4.txt +++ /dev/null @@ -1,146 +0,0 @@ -PCSX2 is a PlayStation 2 emulator for Windows and Linux, started by the same team that brought you PCSX (a Sony PlayStation 1 emulator). - -The PCSX2 project attempts to allow PS2 code to be executed on your computer, thus meaning you can put a PS2 DVD or CD into your computers drive, and boot it up! - - -Overview - -The project has been running for more than five years now, and since it's initial release has grown in compatibility. From initially just being able to run a few public domain demos, it's current state enables many games to boot and actually go in game, such as the 'famous' Final Fantasy X or Devil May Cry 3. You can always visit the PCSX2 homepage (http://www.pcsx2.net) to check the latest compatibility status of games with more than 1800 titles tested. - - -Configuration - -A very detailed guide is available on the PCSX2 homepage which is already translated in several languages! -You can consult it here: http://www.pcsx2.net/guide.php - - -Status - -PCSX2 has come a long way since its’ starting point back at 2002.Current features include: - -•Separate recompilers for Emotion Engine (EE) , Vector Unit 0 (VU0) and Vector Unit 1 (VU1). -•Dual core support, with the Graphics Synthesizer (GS) running on a second thread. -•Usage of MMX,SSE1,SSE2 and limited SSE3 extensions -•Proper SPU2 emulation featuring Auto DMA and Time Scaling -•Full gamepad support featuring Dual Shock 2,analog controls and even supporting analog movement over keyboard (using some external plugins) -•Patch system for creating cheats and for workarounds on games - -Sections that still need work: - -•Dev9 functions, such as HDD and Ethernet (partially implemented) support -•Firewire emulation (quite low on the list though) -•USB emulation (very partially implemented) -•Image Processing Unit (IPU) emulation which is responsible for the FMV playback.It has been implemented but it is buggy and slow -•MIPS cache needs to be properly implemented (barely works at this time) - - - - -How can you help - -As most of you are aware, the PCSX2 team is working on this project at the expense of their free time and provide it without charging the program’s use. -If you want to show your appreciation to these people and motivate them, you can donate any amount of money you feel is right to the team’s paypal account found in the official site. -These funds will be used so the team members can get more modern and new hardware in order to test and debug more efficiently and even implement new features (just like dual core support for example). - -If you are a programmer and you are interested in helping the PCSX2 team by making additions or corrections to the code, you are free to browse through the public SVN repository here (http://sourceforge.net/projects/pcsx2) after taking into account PCSX2 is under the GNU General Public Licence (GPL) v2. - - - -The Coding Team - -Below you can see 3 tables, showing the current team members who are actively coding at the present time, the current team members who have been inactive for some time and the older team members who for some reason quit along the way, which include the previous project leader Linuzappz to whom we send our best regards :) - - -Current active team members: - -Nickname Real Name Place Occupation Comments - -florin Florin Sasu Romania co-coder Master of HLE. Master of cd code and bios HLE.. -saqib - Pakistan Main Coder Fixing bugs around (FPU, Interpreter, VUs...) -Nachnbrenner - Germany co-coder patch freak :P -aumatt Australia co-coder a bit of everything mostly handles CDVD cmds -refraction Alex Brown England co-coder General Coding DMA/VIF etc -zerofrog - USA co-coder Recompilers, ZeroGS, x86-64, linux, optimizations, general fixes and new features - -Current inactive team members: - -Nickname Real Name Place Occupation Comments - -Shadow George Moralis Greece co-coder Master of cpu, master of bugs, general coding… -Goldfinger - Brazil co-coder MMI,FPU and general stuff -loser - Australia co-coder obscure cdvd related stuff - -Ex team members: - -Nickname Real Name Place Occupation Comments - -Linuzappz - Argentina Main Coder Master of The GS emulation and so many others.. -basara - - co-coder Recompiler programmer. general coding -[TyRaNiD] - - co-coder GS programmer.General coding -Roor - - co-coder General coding - -Additional coding: -F|RES, Pofis, Gigaherz, Nocomp, _Riff_, fumofumo - -The Beta Tester Team - -Beta testers are people (slaves/mindless grunts :P) who constantly test new PCSX2 beta builds to report any new bugs, regressions or improvements. While this might sound simple to most, what many people do not know is that testers also debug with the coders, maintain the huge game compatibility list, create dumps and logs for the coders and so much more. As above, active, inactive and ex members are listed alphabetically - -Current active members: - -Bositman, CKemu, Crushtest, Falcon4Ever, GeneralPlot, Prafull, RPGWizard, RudyX, Parotaku - - -Current inactive team members: - -Belmont, Knuckles, Raziel - - -Ex team members: -Chaoscode, CpUMasteR, EFX , Elly, JegHegy, Razorblade, Seta San, Snake875 - - -Additional thanks and credits - -Duke of NAPALM: For the 3d stars demo. The first demo that worked in pcsx2 :) -Tony Saveski (dreamtime): For his great ps2tutorials!! -F|res: Author of dolphin, a big thanks from shadow.. -Now3d: The guy that helped shadow at his first steps.. -Keith: Who believed in us.. -Bobbi & Thorgal: For hosting us, for the old page design and so many other things -Sjeep: Help and info -BGnome: Help testing stuff -Dixon: Design of the old pcsx2 page, and the pcsx2.net domain -Bositman: PCSX2 beta tester :) (gia sou bositman pare ta credits sou ) -No-Reccess: Nice guy and great demo coder :) -NSX2 team: For their help with VU ;) -Razorblade: For the old PCSX2 logo & icon. -Snake: He knows what for :P -Ector: Awesome emu :) -Zezu: A good guy. Good luck with your emu :P -Hiryu & Sjeep: For their libcdvd (iso parsing and filesystem driver code) -Sjeep: For the SjDATA filesystem driver -F|res: For the original DECI2 implementation -libmpeg2: For the mpeg2 decoding routines -Aumatt: For applying fixes to pcsx2 -Microsoft: For VC.Net 2003 (and now 2005) (really faster than vc6) :P -NASM team: For nasm -CKemu: Logos/design - -and probably to a few more.. - -Special Shadow's thanks go to... - -My friends: Dimitris, James, Thodoris, Thanasis and probably to a few more..and of course to a lady somewhere out there.... - - -Created for v0.9.4 by bositman. - - - - - - - -The PCSX2 Coding and Beta testing team - diff --git a/pcsx2/Docs/readme Playground.txt b/pcsx2/Docs/readme Playground.txt deleted file mode 100644 index b50fea69ff..0000000000 --- a/pcsx2/Docs/readme Playground.txt +++ /dev/null @@ -1,70 +0,0 @@ -About PCSX2 Playground: - -pcsx2-playground is originally based off the c/c++ official pcsx2 trunk code. It has since been modified heavily in an on-going attempt to clean up the code, fix bugs, and improve overall emulation ability. - - -Devs (alphabetically) - Comments/Specialty - -arcum42 - Linux compatibility and porting. -cottonvibes - FPU and VU recompilers, general coding. -drkIIRaziel - Memory management, emulation theory/principals, recompiler design. -gigaherz - General coding, spu2ghz, cdvdGigaherz, works on stuff until he gets 'bored' :p -Jake.Stine - MTGS, counters, timing/syncing, general coding. -ramapcsx2 - pcsx2 tweaker, always finds those magic values that make the game work. :p - -Beta Testers (alphabetically): - -Bositman - Setup our Playground forums and helps moderate them. Also beta tests for us and actively contributes in Playground discussion. -Crushtest - Helps with Playground beta testing and discussion. -Krakatos - Project Management and Playground forums moderation. Devotes several hours of his day to playground beta-testing and discussion. - -Additional Credits: - -Special thanks to the official pcsx2 team for making ps2 emulation a reality! -Also a big special-thanks to the pcsx2 team for hosting our Playground forums and builds! -More info about the official pcsx2 team can be found in "readme 0.9.4.txt" - - -Added Features and Improvements: - - * Improved Frameskip/VU-skip - * Special Game Fixes Section - * Advanced Options Section for custom tweaking VU/FPU behavior. - * Rewritten Multithreaded GS (MTGS) mode, with 15% speedup and fixes many instabilities. - * Improved VU/FPU Flags and Clamping support (helps fix odd behaviors and SPS in some games) - * Improved EE/IOP synchronization (fixes many freeze-ups and vmhacks). - * Improved CDVD support. - - -Performance: - -Emulation speeds when using Playground's default settings will be slower than the official 0.9.4 or 0.9.5 builds because pcsx2-playground is doing more work to provide your games with a more correct emulated environment. Properly emulating all of the VU clamping and flags is very time-consuming in particular. So various speedhacks were made so people can disable some of these slower emulation features for games that do not need them. When set-up properly, pcsx2-playground is usually faster than the official build. - -The speed hacks offered are still a work-in-progress, and so for now there isn't much documentation on how to use them. Every game is different and so you'll just have to play around and see what works best. You can also try visiting the Pcsx2 forums, where members of the Playground team and other knowledgeable contributors should be able to help you get the most out of the emulator. - - -The Future of Pcsx2 Playground - -There is still alot of room for improvement, but we're trying hard to fix stuff as best we can. Our todo/wish lists are extensive but we're optimistic that the emulator can continue to improve. :) - -Visit our forums at Pcsx2.net, or come to the #pcsx2 IRC channel on efnet if you want to contribute! - - -System Requirements: - -Minimum - - * Windows/Linux OS - * CPU that supports SSE2 (Pentium 4 and up, Athlon64 and up) - * GPU that supports Pixel Shaders 2.0 - * 512mb RAM - -Recommended - - * Windows Vista 32bit/64bit - * CPU: Intel Core 2 Duo @ 3.2ghz or better - * GPU: 8600gt or better - * 1gb RAM (2gb if on Vista) - -Note: pcsx2 only takes advantage of 2 cores so far; so a quad-core processor will not help with speed. - diff --git a/pcsx2/Docs/specs.tex b/pcsx2/Docs/specs.tex deleted file mode 100644 index aca2581945..0000000000 --- a/pcsx2/Docs/specs.tex +++ /dev/null @@ -1,159 +0,0 @@ -\documentclass[10pt]{article} - -\begin{document} -\section{...stuff...} --order the plugins are started\\ --platform dependent stuff, calling convention\\ - -\section{Generic functions} -The following three functions will be present in all the plugin libraries, - in order to be recognized as valid PS2E plugins. They will help - the emulator to find a plugin capabilities. - -\subsection{PS2EgetLibType} -\begin{quote}\texttt{unsigned int} PS2EgetLibType(\texttt{void});\end{quote} - -\begin{description} -\item[PS2EgetLibType] returns the type of the plugin. - In fact it indicates the APIs supported by the dynamic library. - The returned value can be one of: -\begin{itemize} -\item PS2E\_LT\_GS 0x01 -\item PS2E\_LT\_PAD 0x02 -\item PS2E\_LT\_SPU2 0x04 -\item PS2E\_LT\_CDVD 0x08 -\item PS2E\_LT\_DEV9 0x10 -\end{itemize} -Currently, these are the only plugin types supported. Note that the values - can be ORed. -\end{description} - - - -\subsection{PS2EgetLibVersion2} -\begin{quote}\texttt{unsigned int} PS2EgetLibVersion2(\texttt{unsigned int} - type);\end{quote} - -\begin{description} -\item[PS2EgetLibVersion2] returns a combination of version numbers. -Parameter \emph{type} is used to select the functions set for which - the emulator requests version information. See \texttt{PS2EgetLibType} - for the values of this parameter. - -The 5 APIs and their corresponding specs have changed over time. - In order to prevent crashes and incompatibilities, a spec version have - been introduced as the highest 16 bits of the returned value. -\begin{itemize} -\item PS2E\_GS\_VERSION 0x0002 -\item PS2E\_PAD\_VERSION 0x0002 -\item PS2E\_SPU2\_VERSION 0x0002 -\item PS2E\_CDVD\_VERSION 0x0003 -\item PS2E\_DEV9\_VERSION 0x0001 -\end{itemize} -Notice that when the specs do change \texttt{and} the compatibility is broken, - this version number is increased. The emulator loading code will support - only one version for a certain library type at a time. If the internal - version and plugin API version does not match, the plugin - will not be loaded nor used. - -The low half of the returned value reflects the version of the plugin itself. - A major.minor versioning scheme is used on the two bytes like this: -\begin{verbatim} -...//code -return (PS2E_CDVD_VERSION<<16) | (0<<8) | (67); //version 0.67 -\end{verbatim} -\end{description} - - - -\subsection{PS2EgetLibName} -\begin{quote}\texttt{char*} PS2EgetLibName(\texttt{void});\end{quote} - -\begin{description} -\item[PS2EgetLibName] returns a string that contains a short\footnote{ -less then 30 chars in one line} name. The string is stored - in the plugin and will be used to represent the plugin in a config dialog. -\end{description} - - - - - -\section{CDVD functions} -This section describes the functions that corresponds to CDVD\footnote{short for CD/DVD} -API - type PS2E\_LT\_CDVD(0x08). - These specs are for PS2E\_CDVD\_VERSION(0x0003). - -\subsection{CDVDinit} -\begin{quote}\texttt{int} CDVDinit(\texttt{void});\end{quote} - -\begin{description} -\item[CDVDinit] does the initialization of the CDVD interface. - It is the first function called; so, it can be used to do all the - init stuff such as reading saved configuration, one-time hardware init and - preparing the internal structures, tables, etc\ldots - If an error is found the function will return -1, otherwise 0. -\end{description} - - - -\subsection{CDVDshutdown} -\begin{quote}\texttt{void} CDVDshutdown(\texttt{void});\end{quote} - -\begin{description} -\item[CDVDshutdown] is called when the emulator is closed. Do now the freeing - operations. DO NOT FORGET TO FREE the resources used. The OS will probably - free the garbage left, but some pieces of hardware might need a - ``deinitialization'' procedure in order to work next time the emulator - is run. Imagine that the user will choose another plugin to run with - next time instead of yours, do not cause troubles. -\end{description} - - - -\subsection{CDVDopen} -\begin{quote}\texttt{int} CDVDopen(\texttt{void});\end{quote} - -\begin{description} -\item[CDVDopen] is called when the emulation starts. - It is recommended that functions called from now on (until - \texttt{CDVDclose} is met) to spend few processing time. Avoid calling - blocking functions and if you do, the user should be notified visualy. - Report errors by return value and warrings using a log. - If an error is found the function will return -1 and the emulation stops, - otherwise 0. - -Do not report errors using message boxes while the emu runs, the GS plugin - might use a display mode that can cause troubles to windowing system - in showing your message. -\end{description} - - - -\subsection{CDVDclose} -\begin{quote}\texttt{void} CDVDclose(\texttt{void});\end{quote} - -\begin{description} -\item[CDVDclose] is called when the emulation is stopped. Some of the - resources that you aquired with \texttt{CDVDstart} have to be released now - in order that other programs to use them. If you locked the CD/DVD tray, - unlock it so the user can change the disc. -\end{description} - - - -\subsection{CDVDreadTrack} -\begin{quote}\texttt{int} CDVDreadTrack(\texttt{unsigned int} - lsn, \texttt{int} mode);\end{quote} - -\begin{description} -\item[CDVDreadTrack] is the function that performs the read of \texttt{a} - sector from the CD/DVD. Parameter \emph{lsn} specifies the absolute value - of the sector number in linear addressing mode without \emph{lead-in}\footnote{i.e.\ -without leading 150 sectors == 2 seconds}. Usualy, the plugin will read - a full sector of 2352 bytes in its internal buffer. - The second parameter tells what port of ... -\end{description} - -\end{document} - diff --git a/pcsx2/FiFo.cpp b/pcsx2/FiFo.cpp index 2b0a022404..1523702820 100644 --- a/pcsx2/FiFo.cpp +++ b/pcsx2/FiFo.cpp @@ -173,6 +173,7 @@ void __fastcall WriteFIFO_page_6(u32 mem, const mem128_t *value) psHu64(0x6000) = value[0]; psHu64(0x6008) = value[1]; + FreezeRegs(1); if( mtgsThread != NULL ) { const uint count = mtgsThread->PrepDataPacket( GIF_PATH_3, value, 1 ); @@ -184,10 +185,9 @@ void __fastcall WriteFIFO_page_6(u32 mem, const mem128_t *value) } else { - FreezeRegs(1); GSGIFTRANSFER3((u32*)value, 1); - FreezeRegs(0); } + FreezeRegs(0); } void __fastcall WriteFIFO_page_7(u32 mem, const mem128_t *value) diff --git a/pcsx2/GS.h b/pcsx2/GS.h index a15a8c1977..a591767146 100644 --- a/pcsx2/GS.h +++ b/pcsx2/GS.h @@ -175,9 +175,14 @@ protected: uint m_RingPos; // cur pos gs is reading from uint m_WritePos; // cur pos ee thread is writing to - Threading::Semaphore m_post_InitDone; // used to regulate thread startup and gsInit - Threading::MutexLock m_lock_RingRestart; + // used to regulate thread startup and gsInit + Threading::Semaphore m_post_InitDone; + Threading::MutexLock m_lock_RingRestart; + + // used to keep multiple threads from sending packets to the ringbuffer concurrently. + Threading::MutexLock m_PacketLocker; + // Used to delay the sending of events. Performance is better if the ringbuffer // has more than one command in it when the thread is kicked. int m_CopyCommandTally; diff --git a/pcsx2/MTGS.cpp b/pcsx2/MTGS.cpp index 89b7516c61..6820eb5610 100644 --- a/pcsx2/MTGS.cpp +++ b/pcsx2/MTGS.cpp @@ -197,6 +197,7 @@ mtgsThreadObject::mtgsThreadObject() : , m_post_InitDone() , m_lock_RingRestart() +, m_PacketLocker( true ) // true - makes it a recursive lock , m_CopyCommandTally( 0 ) , m_CopyDataTally( 0 ) @@ -712,14 +713,12 @@ int mtgsThreadObject::Callback() void mtgsThreadObject::WaitGS() { // Freeze registers because some kernel code likes to destroy them - FreezeRegs(1); SetEvent(); while( volatize(m_RingPos) != volatize(m_WritePos) ) { Timeslice(); //SpinWait(); } - FreezeRegs(0); } // Sets the gsEvent flag and releases a timeslice. @@ -733,8 +732,6 @@ void mtgsThreadObject::SetEvent() void mtgsThreadObject::PrepEventWait() { - // Freeze registers because some kernel code likes to destroy them - FreezeRegs(1); //Console::Notice( "MTGS Stall! EE waits for nothing! ... except your GPU sometimes." ); SetEvent(); Timeslice(); @@ -742,7 +739,6 @@ void mtgsThreadObject::PrepEventWait() void mtgsThreadObject::PostEventWait() const { - FreezeRegs(0); } u8* mtgsThreadObject::GetDataPacketPtr() const @@ -784,29 +780,29 @@ void mtgsThreadObject::SendDataPacket() m_packet_size = 0; - if( m_RingBufferIsBusy ) return; - - // The ringbuffer is current in a resting state, so if enough copies have - // queued up then go ahead and initiate the GS thread.. - - // Optimization notes: What we're doing here is initiating a "burst" mode on - // the thread, which improves its cache hit performance and makes it more friendly - // to other threads in Pcsx2 and such. Primary is the Command Tally, and then a - // secondary data size threshold for games that do lots of texture swizzling. - - // 16 was the best value I found so far. - // tested values: - // 24 - very slow on HT machines (+5% drop in fps) - // 8 - roughly 2% slower on HT machines. - - m_CopyDataTally += m_packet_size; - if( ( m_CopyDataTally > 0x8000 ) || ( ++m_CopyCommandTally > 16 ) ) + if( !m_RingBufferIsBusy ) { - FreezeRegs(1); - //Console::Status( "MTGS Kick! DataSize : 0x%5.8x, CommandTally : %d", m_CopyDataTally, m_CopyCommandTally ); - SetEvent(); - FreezeRegs(0); + // The ringbuffer is current in a resting state, so if enough copies have + // queued up then go ahead and initiate the GS thread.. + + // Optimization notes: What we're doing here is initiating a "burst" mode on + // the thread, which improves its cache hit performance and makes it more friendly + // to other threads in Pcsx2 and such. Primary is the Command Tally, and then a + // secondary data size threshold for games that do lots of texture swizzling. + + // 16 was the best value I found so far. + // tested values: + // 24 - very slow on HT machines (+5% drop in fps) + // 8 - roughly 2% slower on HT machines. + + m_CopyDataTally += m_packet_size; + if( ( m_CopyDataTally > 0x8000 ) || ( ++m_CopyCommandTally > 16 ) ) + { + //Console::Status( "MTGS Kick! DataSize : 0x%5.8x, CommandTally : %d", m_CopyDataTally, m_CopyCommandTally ); + SetEvent(); + } } + //m_PacketLocker.Unlock(); } int mtgsThreadObject::PrepDataPacket( GIF_PATH pathidx, const u64* srcdata, u32 size ) @@ -840,6 +836,8 @@ static u32 GSRingBufCopySz = 0; // size - size of the packet data, in smd128's int mtgsThreadObject::PrepDataPacket( GIF_PATH pathidx, const u8* srcdata, u32 size ) { + //m_PacketLocker.Lock(); + #ifdef PCSX2_GSRING_TX_STATS ringtx_s += size; ringtx_s_ulg += size&0x7F; @@ -1064,6 +1062,8 @@ __forceinline void mtgsThreadObject::_FinishSimplePacket( uint future_writepos ) void mtgsThreadObject::SendSimplePacket( GS_RINGTYPE type, int data0, int data1, int data2 ) { + //ScopedLock locker( m_PacketLocker ); + const uint thefuture = _PrepForSimplePacket(); PacketTagType& tag = (PacketTagType&)m_RingBuffer[m_WritePos]; @@ -1072,11 +1072,13 @@ void mtgsThreadObject::SendSimplePacket( GS_RINGTYPE type, int data0, int data1, tag.data[1] = data1; tag.data[2] = data2; - _FinishSimplePacket( thefuture ); + _FinishSimplePacket( thefuture ); } void mtgsThreadObject::SendPointerPacket( GS_RINGTYPE type, u32 data0, void* data1 ) { + //ScopedLock locker( m_PacketLocker ); + const uint thefuture = _PrepForSimplePacket(); PacketTagType& tag = (PacketTagType&)m_RingBuffer[m_WritePos]; diff --git a/pcsx2/NewGUI/LogOptionsDialog.cpp b/pcsx2/NewGUI/LogOptionsDialog.cpp index d078140aa9..da5083e728 100644 --- a/pcsx2/NewGUI/LogOptionsDialog.cpp +++ b/pcsx2/NewGUI/LogOptionsDialog.cpp @@ -1,163 +1,163 @@ -/* Pcsx2 - Pc Ps2 Emulator - * Copyright (C) 2002-2009 Pcsx2 Team - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "PrecompiledHeader.h" -#include "DebugTools/Debug.h" -#include "LogOptionsDialog.h" - -#include - -using namespace wxHelpers; - -void ConnectChildrenRecurse( wxWindow* parent, int eventType, wxObjectEventFunction handler ) -{ - wxWindowList& list = parent->GetChildren(); - for( wxWindowList::iterator iter = list.begin(); iter != list.end(); ++iter) - { - wxWindow *current = *iter; - ConnectChildrenRecurse( current, eventType, handler ); - parent->Connect( current->GetId(), eventType, handler ); - } -} - -namespace Dialogs -{ -////////////////////////////////////////////////////////////////////////////////////////// -// -LogOptionsDialog::eeLogOptionsPanel::eeLogOptionsPanel( wxWindow* parent ) : - CheckedStaticBox( parent, wxHORIZONTAL, L"EE Logs", LogID_EEBox ) -{ - wxBoxSizer& eeMisc = *new wxBoxSizer( wxVERTICAL ); - - AddCheckBoxTo( this, eeMisc, L"Memory", LogID_Memory ); - AddCheckBoxTo( this, eeMisc, L"Bios", LogID_Bios ); - AddCheckBoxTo( this, eeMisc, L"Elf", LogID_ELF ); - - wxBoxSizer& eeStack = *new wxBoxSizer( wxVERTICAL ); - eeStack.Add( new DisasmPanel( this ), stdSpacingFlags ); - eeStack.Add( &eeMisc ); - - ThisSizer.Add( new HwPanel( this ), stdSpacingFlags ); - ThisSizer.Add( &eeStack ); - - SetValue( true ); - Fit(); -} - -LogOptionsDialog::eeLogOptionsPanel::DisasmPanel::DisasmPanel( wxWindow* parent ) : - CheckedStaticBox( parent, wxVERTICAL, L"Disasm" , LogID_Disasm ) -{ - AddCheckBox( L"Core", LogID_CPU ); - AddCheckBox( L"Fpu", LogID_FPU ); - AddCheckBox( L"VU0", LogID_VU0 ); - AddCheckBox( L"Cop0", LogID_COP0 ); - AddCheckBox( L"VU Macro",LogID_VU_Macro ); - - SetValue( false ); - Fit(); -} - -LogOptionsDialog::eeLogOptionsPanel::HwPanel::HwPanel( wxWindow* parent ) : - CheckedStaticBox( parent, wxVERTICAL, L"Hardware", LogID_Hardware ) -{ - AddCheckBox( L"Registers", LogID_Registers ); - AddCheckBox( L"Dma", LogID_DMA ); - AddCheckBox( L"Vif", LogID_VIF ); - AddCheckBox( L"SPR", LogID_SPR ); - AddCheckBox( L"GIF", LogID_GIF ); - AddCheckBox( L"Sif", LogID_SIF ); - AddCheckBox( L"IPU", LogID_IPU ); - AddCheckBox( L"RPC", LogID_RPC ); - - SetValue( false ); - Fit(); -} - -void LogOptionsDialog::eeLogOptionsPanel::OnLogChecked(wxCommandEvent &event) -{ - //LogChecks checkId = (LogChecks)(int)event.m_callbackUserData; - //ToggleLogOption( checkId ); - event.Skip(); -} - -////////////////////////////////////////////////////////////////////////////////////////// -// -LogOptionsDialog::iopLogOptionsPanel::iopLogOptionsPanel( wxWindow* parent ) : - CheckedStaticBox( parent, wxVERTICAL, L"IOP Logs", LogID_IopBox ) -{ - AddCheckBox( L"Disasm", LogID_Disasm); - AddCheckBox( L"Memory", LogID_Memory ); - AddCheckBox( L"Bios", LogID_Bios ); - AddCheckBox( L"Registers", LogID_Hardware ); - AddCheckBox( L"Dma", LogID_DMA ); - AddCheckBox( L"Pad", LogID_Pad ); - AddCheckBox( L"Cdrom", LogID_Cdrom ); - AddCheckBox( L"GPU (PSX)", LogID_GPU ); - - SetValue( true ); - Fit(); -}; - -////////////////////////////////////////////////////////////////////////////////////////// -// -LogOptionsDialog::LogOptionsDialog(wxWindow* parent, int id, const wxPoint& pos, const wxSize& size): - wxDialogWithHelpers( parent, id, L"Logging", true, pos, size ) -{ - eeLogOptionsPanel& eeBox = *new eeLogOptionsPanel( this ); - iopLogOptionsPanel& iopSizer = *new iopLogOptionsPanel( this ); - - wxStaticBoxSizer& miscSizer = *new wxStaticBoxSizer( wxHORIZONTAL, this, _T("Misc") ); - AddCheckBox( miscSizer, L"Log to STDOUT", LogID_StdOut ); - AddCheckBox( miscSizer, L"SYMs Log", LogID_Symbols ); - - wxBoxSizer& mainsizer = *new wxBoxSizer( wxVERTICAL ); - wxBoxSizer& topSizer = *new wxBoxSizer( wxHORIZONTAL ); - - // Expand comments below are form an attempt of mine to make the dialog box resiable, but it - // only wanted to work right for the miscSizer and I couldn't figure out why the CheckStaticBox - // panel wouldn't also resize to fit the window.. :( -- air - - topSizer.Add( &eeBox, stdSpacingFlags ); //.Expand() ); - topSizer.Add( &iopSizer, stdSpacingFlags ); //.Expand() ); - - mainsizer.Add( &topSizer ); //, wxSizerFlags().Expand() ); // topsizer has it's own padding. - mainsizer.Add( &miscSizer, stdSpacingFlags ); //.Expand() ); - - AddOkCancel( mainsizer ); - - SetSizerAndFit( &mainsizer, true ); - - ConnectChildrenRecurse( this, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(LogOptionsDialog::LogChecked) ); -} - - -void LogOptionsDialog::LogChecked(wxCommandEvent &evt) -{ - // Anything going here should be a checkbox, unless non-checkbox controls send CheckBox_Clicked commands - // (which would seem bad). - wxCheckBox* checker = wxStaticCast( evt.GetEventObject(), wxCheckBox ); - - switch( checker->GetId() ) - { - // [TODO] : Implement me! - } - - evt.Skip(); -} - +/* Pcsx2 - Pc Ps2 Emulator + * Copyright (C) 2002-2009 Pcsx2 Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "PrecompiledHeader.h" +#include "DebugTools/Debug.h" +#include "LogOptionsDialog.h" + +#include + +using namespace wxHelpers; + +void ConnectChildrenRecurse( wxWindow* parent, int eventType, wxObjectEventFunction handler ) +{ + wxWindowList& list = parent->GetChildren(); + for( wxWindowList::iterator iter = list.begin(); iter != list.end(); ++iter) + { + wxWindow *current = *iter; + ConnectChildrenRecurse( current, eventType, handler ); + parent->Connect( current->GetId(), eventType, handler ); + } +} + +namespace Dialogs +{ +////////////////////////////////////////////////////////////////////////////////////////// +// +LogOptionsDialog::eeLogOptionsPanel::eeLogOptionsPanel( wxWindow* parent ) : + CheckedStaticBox( parent, wxHORIZONTAL, L"EE Logs", LogID_EEBox ) +{ + wxBoxSizer& eeMisc = *new wxBoxSizer( wxVERTICAL ); + + AddCheckBoxTo( this, eeMisc, L"Memory", LogID_Memory ); + AddCheckBoxTo( this, eeMisc, L"Bios", LogID_Bios ); + AddCheckBoxTo( this, eeMisc, L"Elf", LogID_ELF ); + + wxBoxSizer& eeStack = *new wxBoxSizer( wxVERTICAL ); + eeStack.Add( new DisasmPanel( this ), stdSpacingFlags ); + eeStack.Add( &eeMisc ); + + ThisSizer.Add( new HwPanel( this ), stdSpacingFlags ); + ThisSizer.Add( &eeStack ); + + SetValue( true ); + Fit(); +} + +LogOptionsDialog::eeLogOptionsPanel::DisasmPanel::DisasmPanel( wxWindow* parent ) : + CheckedStaticBox( parent, wxVERTICAL, L"Disasm" , LogID_Disasm ) +{ + AddCheckBox( L"Core", LogID_CPU ); + AddCheckBox( L"Fpu", LogID_FPU ); + AddCheckBox( L"VU0", LogID_VU0 ); + AddCheckBox( L"Cop0", LogID_COP0 ); + AddCheckBox( L"VU Macro",LogID_VU_Macro ); + + SetValue( false ); + Fit(); +} + +LogOptionsDialog::eeLogOptionsPanel::HwPanel::HwPanel( wxWindow* parent ) : + CheckedStaticBox( parent, wxVERTICAL, L"Hardware", LogID_Hardware ) +{ + AddCheckBox( L"Registers", LogID_Registers ); + AddCheckBox( L"Dma", LogID_DMA ); + AddCheckBox( L"Vif", LogID_VIF ); + AddCheckBox( L"SPR", LogID_SPR ); + AddCheckBox( L"GIF", LogID_GIF ); + AddCheckBox( L"Sif", LogID_SIF ); + AddCheckBox( L"IPU", LogID_IPU ); + AddCheckBox( L"RPC", LogID_RPC ); + + SetValue( false ); + Fit(); +} + +void LogOptionsDialog::eeLogOptionsPanel::OnLogChecked(wxCommandEvent &event) +{ + //LogChecks checkId = (LogChecks)(int)event.m_callbackUserData; + //ToggleLogOption( checkId ); + event.Skip(); +} + +////////////////////////////////////////////////////////////////////////////////////////// +// +LogOptionsDialog::iopLogOptionsPanel::iopLogOptionsPanel( wxWindow* parent ) : + CheckedStaticBox( parent, wxVERTICAL, L"IOP Logs", LogID_IopBox ) +{ + AddCheckBox( L"Disasm", LogID_Disasm); + AddCheckBox( L"Memory", LogID_Memory ); + AddCheckBox( L"Bios", LogID_Bios ); + AddCheckBox( L"Registers", LogID_Hardware ); + AddCheckBox( L"Dma", LogID_DMA ); + AddCheckBox( L"Pad", LogID_Pad ); + AddCheckBox( L"Cdrom", LogID_Cdrom ); + AddCheckBox( L"GPU (PSX)", LogID_GPU ); + + SetValue( true ); + Fit(); +}; + +////////////////////////////////////////////////////////////////////////////////////////// +// +LogOptionsDialog::LogOptionsDialog(wxWindow* parent, int id, const wxPoint& pos, const wxSize& size): + wxDialogWithHelpers( parent, id, L"Logging", true, pos, size ) +{ + eeLogOptionsPanel& eeBox = *new eeLogOptionsPanel( this ); + iopLogOptionsPanel& iopSizer = *new iopLogOptionsPanel( this ); + + wxStaticBoxSizer& miscSizer = *new wxStaticBoxSizer( wxHORIZONTAL, this, _T("Misc") ); + AddCheckBox( miscSizer, L"Log to STDOUT", LogID_StdOut ); + AddCheckBox( miscSizer, L"SYMs Log", LogID_Symbols ); + + wxBoxSizer& mainsizer = *new wxBoxSizer( wxVERTICAL ); + wxBoxSizer& topSizer = *new wxBoxSizer( wxHORIZONTAL ); + + // Expand comments below are form an attempt of mine to make the dialog box resiable, but it + // only wanted to work right for the miscSizer and I couldn't figure out why the CheckStaticBox + // panel wouldn't also resize to fit the window.. :( -- air + + topSizer.Add( &eeBox, stdSpacingFlags ); //.Expand() ); + topSizer.Add( &iopSizer, stdSpacingFlags ); //.Expand() ); + + mainsizer.Add( &topSizer ); //, wxSizerFlags().Expand() ); // topsizer has it's own padding. + mainsizer.Add( &miscSizer, stdSpacingFlags ); //.Expand() ); + + AddOkCancel( mainsizer ); + + SetSizerAndFit( &mainsizer, true ); + + ConnectChildrenRecurse( this, wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler(LogOptionsDialog::LogChecked) ); +} + + +void LogOptionsDialog::LogChecked(wxCommandEvent &evt) +{ + // Anything going here should be a checkbox, unless non-checkbox controls send CheckBox_Clicked commands + // (which would seem bad). + wxCheckBox* checker = wxStaticCast( evt.GetEventObject(), wxCheckBox ); + + switch( checker->GetId() ) + { + // [TODO] : Implement me! + } + + evt.Skip(); +} + } // End Namespace Dialogs diff --git a/pcsx2/VU0.cpp b/pcsx2/VU0.cpp index a017527406..823d4827a2 100644 --- a/pcsx2/VU0.cpp +++ b/pcsx2/VU0.cpp @@ -178,8 +178,7 @@ void CTC2() { break; case REG_CMSAR1: // REG_CMSAR1 if (!(VU0.VI[REG_VPU_STAT].UL & 0x100) ) { - VU1.VI[REG_TPC].UL = cpuRegs.GPR.r[_Rt_].US[0]; - vu1ExecMicro(VU1.VI[REG_TPC].UL); // Execute VU1 Micro SubRoutine + vu1ExecMicro(cpuRegs.GPR.r[_Rt_].US[0]); // Execute VU1 Micro SubRoutine } break; default: diff --git a/pcsx2/Vif.cpp b/pcsx2/Vif.cpp index f16a8e2cda..714560e814 100644 --- a/pcsx2/Vif.cpp +++ b/pcsx2/Vif.cpp @@ -37,7 +37,6 @@ PCSX2_ALIGNED16(u32 g_vifRow1[4]); PCSX2_ALIGNED16(u32 g_vifCol1[4]); extern int g_vifCycles; -bool mfifodmairq = false; enum UnpackOffset { @@ -449,8 +448,6 @@ void mfifoVIF1transfer(int qwc) return; } - mfifodmairq = false; //Clear any previous TIE interrupt - if (vif1ch->qwc == 0 && vifqwc > 0) { ptag = (u32*)dmaGetAddr(vif1ch->tadr); @@ -520,7 +517,6 @@ void mfifoVIF1transfer(int qwc) { VIF_LOG("dmaIrq Set"); vif1.done = true; - mfifodmairq = true; //Let the handler know we have prematurely ended MFIFO } } @@ -609,10 +605,6 @@ void vifMFIFOInterrupt() hwDmacIrq(DMAC_14); }*/ - //On a TIE break we do not clear the MFIFO (Art of Fighting) - //If we dont clear it on MFIFO end, Tekken Tag breaks, understandably (Refraction) - if (!mfifodmairq) vifqwc = 0; - vif1.done = 1; g_vifCycles = 0; vif1ch->chcr &= ~0x100; diff --git a/pcsx2/VifDma.cpp b/pcsx2/VifDma.cpp index 7552899a5e..797be0c452 100644 --- a/pcsx2/VifDma.cpp +++ b/pcsx2/VifDma.cpp @@ -1896,6 +1896,7 @@ static int __fastcall Vif1TransDirectHL(u32 *data) } } + FreezeRegs(1); if (mtgsThread != NULL) { // copy 16 bytes the fast way: @@ -1910,10 +1911,9 @@ static int __fastcall Vif1TransDirectHL(u32 *data) } else { - FreezeRegs(1); GSGIFTRANSFER2((u32*)splittransfer[0], 1); - FreezeRegs(0); } + FreezeRegs(0); if (vif1.tag.size == 0) vif1.cmd = 0; splitptr = 0; @@ -1945,6 +1945,7 @@ static int __fastcall Vif1TransDirectHL(u32 *data) //TODO: ret is guaranteed to be qword aligned ? + FreezeRegs(1); if (mtgsThread != NULL) { //unaligned copy.VIF handling is -very- messy, so i'l use this code til i fix it :) @@ -1955,10 +1956,9 @@ static int __fastcall Vif1TransDirectHL(u32 *data) } else { - FreezeRegs(1); GSGIFTRANSFER2(data, (ret >> 2)); - FreezeRegs(0); } + FreezeRegs(0); return ret; } @@ -2569,14 +2569,14 @@ __forceinline void vif1Interrupt() } } - if (vif1.inprogress) + if (vif1.inprogress & 0x1) { _VIF1chain(); CPU_INT(1, g_vifCycles); return; } - if ((!vif1.done) || (vif1.inprogress & 0x1)) + if (!vif1.done) { if (!(psHu32(DMAC_CTRL) & 0x1)) diff --git a/pcsx2/vtlb.cpp b/pcsx2/vtlb.cpp index 3b58228151..05e6c25ef7 100644 --- a/pcsx2/vtlb.cpp +++ b/pcsx2/vtlb.cpp @@ -90,6 +90,8 @@ __forceinline DataType __fastcall MemOp_r0(u32 addr) jNO_DEFAULT; } + + return 0; // technically unreachable, but suppresses warnings. } // ------------------------------------------------------------------------ diff --git a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj index fbbc6438d4..181694750f 100644 --- a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj +++ b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj @@ -1,7 +1,7 @@ - - - - diff --git a/pcsx2/x86/microVU.cpp b/pcsx2/x86/microVU.cpp index 7cf5f92994..d53bbe4f36 100644 --- a/pcsx2/x86/microVU.cpp +++ b/pcsx2/x86/microVU.cpp @@ -48,11 +48,19 @@ microVUt(void) mVUinit(VURegs* vuRegsPtr, int vuIndex) { mVU->cache = NULL; mVU->cacheSize = mVUcacheSize; mVU->prog.max = mMaxProg - 1; + mVU->prog.prog = (microProgram*)_aligned_malloc(sizeof(microProgram)*(mVU->prog.max+1), 64); mVUprint((vuIndex) ? "microVU1: init" : "microVU0: init"); mVU->cache = SysMmapEx((vuIndex ? 0x5f240000 : 0x5e240000), mVU->cacheSize + 0x1000, 0, (vuIndex ? "Micro VU1" : "Micro VU0")); if (!mVU->cache) throw Exception::OutOfMemory(L"microVU Error: Failed to allocate recompiler memory!"); - + + memset(mVU->cache, 0xcc, mVU->cacheSize + 0x1000); + memset(mVU->prog.prog, 0, sizeof(microProgram)*(mVU->prog.max+1)); + + // Setup Entrance/Exit Points + x86SetPtr(mVU->cache); + mVUdispatcherA(mVU); + mVUdispatcherB(mVU); mVUemitSearch(); mVUreset(mVU); } @@ -63,16 +71,8 @@ microVUt(void) mVUreset(mV) { mVUprint((mVU->index) ? "microVU1: reset" : "microVU0: reset"); mVUclose(mVU, 1); - // Dynarec Cache - memset(mVU->cache, 0xcc, mVU->cacheSize + 0x1000); - - // Setup Entrance/Exit Points - x86SetPtr(mVU->cache); - mVUdispatcherA(mVU); - mVUdispatcherB(mVU); - // Clear All Program Data - memset(&mVU->prog, 0, sizeof(mVU->prog)); + //memset(&mVU->prog, 0, sizeof(mVU->prog)); memset(&mVU->prog.lpState, 0, sizeof(mVU->prog.lpState)); // Program Variables @@ -81,15 +81,14 @@ microVUt(void) mVUreset(mV) { mVU->prog.cur = -1; mVU->prog.total = -1; mVU->prog.max = mMaxProg - 1; - mVU->prog.prog = (microProgram*)_aligned_malloc(sizeof(microProgram)*(mVU->prog.max+1), 64); // Setup Dynarec Cache Limits for Each Program u8* z = (mVU->cache + 0x1000); // Dispatcher Code is in first page of cache + mVU->prog.x86start = z; + mVU->prog.x86ptr = z; + mVU->prog.x86end = (u8*)((uptr)z + (uptr)(mVU->cacheSize - (mVU->cacheSize*.05))); + for (int i = 0; i <= mVU->prog.max; i++) { - mVU->prog.prog[i].x86start = z; - mVU->prog.prog[i].x86ptr = z; - z += (mVU->cacheSize / (mVU->prog.max + 1)); - mVU->prog.prog[i].x86end = z; for (int j = 0; j <= mVU->prog.prog[i].ranges.max; j++) { mVU->prog.prog[i].ranges.range[j][0] = -1; // Set range to mVU->prog.prog[i].ranges.range[j][1] = -1; // indeterminable status @@ -112,7 +111,7 @@ microVUt(void) mVUclose(mV, bool isReset) { microBlockManager::Delete(mVU->prog.prog[i].block[j]); } } - if (!isReset) { _aligned_free(mVU->prog.prog); } + if (!isReset) safe_aligned_free(mVU->prog.prog); } } @@ -133,14 +132,14 @@ microVUf(void) mVUclearProg(int progIndex) { microVU* mVU = mVUx; mVUprogI.used = 1; mVUprogI.last_used = 3; - mVUprogI.x86ptr = mVUprogI.x86start; for (int j = 0; j <= mVUprogI.ranges.max; j++) { mVUprogI.ranges.range[j][0] = -1; // Set range to mVUprogI.ranges.range[j][1] = -1; // indeterminable status mVUprogI.ranges.total = -1; } for (u32 i = 0; i < (mVU->progSize / 2); i++) { - if (mVUprogI.block[i]) mVUprogI.block[i]->reset(); + //if (mVUprogI.block[i]) { mVUprogI.block[i]->reset(); } + microBlockManager::Delete(mVUprogI.block[i]); } } @@ -151,6 +150,7 @@ microVUf(void) mVUcacheProg(int progIndex) { mVUdumpProg(progIndex); } +#define aWrap(x, nMax) ((x > nMax) ? 0 : x) // Finds the least used program, (if program list full clears and returns an old program; if not-full, returns free program) microVUf(int) mVUfindLeastUsedProg() { microVU* mVU = mVUx; @@ -163,22 +163,48 @@ microVUf(int) mVUfindLeastUsedProg() { return mVU->prog.total; } else { - - const int pMax = mVU->prog.max; - int smallidx = (mVU->prog.cur+1)&pMax; - u64 smallval = mVU->prog.prog[smallidx].used; +/* + const int pMax = mVU->prog.max; + int smallidx = aWrap((mVU->prog.cur+1), pMax); + u64 smallval = mVU->prog.prog[smallidx].used; - for (int i = 1, j = (smallidx+1)&pMax; i <= pMax; i++, j=(j+1)&pMax) { + for (int i = 1, j = aWrap((smallidx+1), pMax); i <= pMax; i++, aWrap((j+1), pMax)) { if (smallval > mVU->prog.prog[j].used) { smallval = mVU->prog.prog[j].used; smallidx = j; } } - + //smallidx = rand() % 200; mVUclearProg(smallidx); // Clear old data if overwriting old program mVUcacheProg(smallidx); // Cache Micro Program //Console::Notice("microVU%d: Overwriting existing program in slot %d [%d times used]", params vuIndex, smallidx, smallval); + return smallidx; +*/ + +/* + static int smallidx = 0; + const int pMax = mVU->prog.max; + smallidx = aWrap((smallidx+1), pMax); + mVUclearProg(smallidx); // Clear old data if overwriting old program + mVUcacheProg(smallidx); // Cache Micro Program + //Console::Notice("microVU%d: Overwriting existing program in slot %d [%d times used]", params vuIndex, smallidx, smallval); + return smallidx; +*/ + + //mVUreset(mVU); + mVU->prog.x86ptr = mVU->prog.x86start; + for (int z = 0; z <= mVU->prog.max; z++) { + mVUclearProg(z); + mVU->prog.prog[z].used = 0; + mVU->prog.prog[z].last_used = 0; + } + mVU->prog.total = 0; + mVUcacheProg(mVU->prog.total); // Cache Micro Program + mVU->prog.prog[mVU->prog.total].used = 1; + mVU->prog.prog[mVU->prog.total].last_used = 3; + Console::Notice("microVU%d: Cached MicroPrograms = %d", params vuIndex, mVU->prog.total+1); + return mVU->prog.total; } } @@ -208,6 +234,8 @@ microVUt(void) mVUvsyncUpdate(mV) { microVUf(bool) mVUcmpPartial(int progIndex) { microVU* mVU = mVUx; for (int i = 0; i <= mVUprogI.ranges.total; i++) { + if ((mVUprogI.ranges.range[i][0] < 0) + || (mVUprogI.ranges.range[i][1] < 0)) { DevCon::Error("microVU%d: Negative Range![%d][%d]", params mVU->index, i, mVUprogI.ranges.total); } if (memcmp_mmx(cmpOffset(mVUprogI.data), cmpOffset(mVU->regs->Micro), ((mVUprogI.ranges.range[i][1] + 8) - mVUprogI.ranges.range[i][0]))) { return 0; } diff --git a/pcsx2/x86/microVU.h b/pcsx2/x86/microVU.h index cb23137b94..3228bd1d3d 100644 --- a/pcsx2/x86/microVU.h +++ b/pcsx2/x86/microVU.h @@ -27,57 +27,75 @@ #include "microVU_IR.h" #include "microVU_Misc.h" +struct microBlockLink { + microBlock* block; + microBlockLink* next; +}; -#define mMaxBlocks 32 // Max Blocks With Different Pipeline States (For n = 1, 2, 4, 8, 16, etc...) class microBlockManager { private: - static const int MaxBlocks = mMaxBlocks - 1; - microBlock blockList[mMaxBlocks]; // Should always be first in the class to ensure 16-byte alignment - int listSize; // Total Items - 1 - int listI; // Index to Add new block + microBlockLink blockList; + microBlockLink* blockEnd; + int listI; public: - // Aligned replacement for 'new' - static microBlockManager* AlignedNew() { - microBlockManager* alloc = (microBlockManager*)_aligned_malloc(sizeof(microBlockManager), 16); - new (alloc) microBlockManager(); - return alloc; - } // Use instead of normal 'delete' - static void Delete(microBlockManager* dead) { - if (dead == NULL) return; + static void Delete(microBlockManager* &dead) { + if (!dead) return; dead->~microBlockManager(); - _aligned_free(dead); + safe_delete(dead); } - - microBlockManager() { reset(); } - ~microBlockManager() {} - void reset() { listSize = -1; listI = -1; }; + microBlockManager() { + listI = -1; + blockList.block = NULL; + blockList.next = NULL; + blockEnd = &blockList; + } + ~microBlockManager() { reset(); } + void reset() { + if (listI >= 0) { + microBlockLink* linkI = &blockList; + microBlockLink* linkD = NULL; + for (int i = 0; i <= listI; i++) { + safe_aligned_free(linkI->block); + linkI = linkI->next; + safe_delete(linkD); + linkD = linkI; + } + safe_delete(linkI); + } + listI = -1; + blockEnd = &blockList; + }; microBlock* add(microBlock* pBlock) { microBlock* thisBlock = search(&pBlock->pState); if (!thisBlock) { listI++; - if (listSize < MaxBlocks) { listSize++; } - if (listI > MaxBlocks) { Console::Error("microVU Warning: Block List Overflow"); listI = 0; } - memcpy_fast(&blockList[listI], pBlock, sizeof(microBlock)); - thisBlock = &blockList[listI]; + blockEnd->block = (microBlock*)_aligned_malloc(sizeof(microBlock), 16); + blockEnd->next = new microBlockLink; + memcpy_fast(blockEnd->block, pBlock, sizeof(microBlock)); + thisBlock = blockEnd->block; + blockEnd = blockEnd->next; } return thisBlock; } - __forceinline microBlock* search(microRegInfo* pState) { - if (listSize < 0) return NULL; + __releaseinline microBlock* search(microRegInfo* pState) { + microBlockLink* linkI = &blockList; if (pState->needExactMatch) { // Needs Detailed Search (Exact Match of Pipeline State) - for (int i = 0; i <= listSize; i++) { - if (mVUquickSearch((void*)pState, (void*)&blockList[i].pState, sizeof(microRegInfo))) return &blockList[i]; + for (int i = 0; i <= listI; i++) { + if (mVUquickSearch((void*)pState, (void*)&linkI->block->pState, sizeof(microRegInfo))) return linkI->block; + linkI = linkI->next; } } else { // Can do Simple Search (Only Matches the Important Pipeline Stuff) - for (int i = 0; i <= listSize; i++) { - if ((blockList[i].pState.q == pState->q) - && (blockList[i].pState.p == pState->p) - && (blockList[i].pState.xgkick == pState->xgkick) - && (blockList[i].pState.flags == pState->flags) - && !(blockList[i].pState.needExactMatch & 0xf0f)) { return &blockList[i]; } + for (int i = 0; i <= listI; i++) { + if ((linkI->block->pState.q == pState->q) + && (linkI->block->pState.p == pState->p) + && (linkI->block->pState.vi15 == pState->vi15) + && (linkI->block->pState.flags == pState->flags) + && (linkI->block->pState.xgkick == pState->xgkick) + && !(linkI->block->pState.needExactMatch & 0xf0f)) { return linkI->block; } + linkI = linkI->next; } } return NULL; @@ -95,27 +113,27 @@ struct microRange { struct microProgram { u32 data [mProgSize]; // Holds a copy of the VU microProgram microBlockManager* block[mProgSize/2]; // Array of Block Managers - microIR allocInfo; // IR information microRange ranges; // The ranges of the microProgram that have already been recompiled u64 used; // Number of times its been used u32 last_used; // Counters # of frames since last use (starts at 3 and counts backwards to 0 for each 30fps vSync) - u8* x86ptr; // Pointer to program's recompilation code - u8* x86start; // Start of program's rec-cache - u8* x86end; // Limit of program's rec-cache }; -#define mMaxProg ((mVU->index)?64:8) // The amount of Micro Programs Recs will 'remember' (For n = 1, 2, 4, 8, 16, etc...) +#define mMaxProg ((mVU->index)?400:8) // The amount of Micro Programs Recs will 'remember' (For n = 1, 2, 4, 8, 16, etc...) struct microProgManager { - microProgram* prog; // Store MicroPrograms in memory - int max; // Max Number of MicroPrograms minus 1 - int total; // Total Number of valid MicroPrograms minus 1 - int cur; // Index to Current MicroProgram thats running (-1 = uncached) - int isSame; // Current cached microProgram is Exact Same program as mVU->regs->Micro (-1 = unknown, 0 = No, 1 = Yes) - int cleared; // Micro Program is Indeterminate so must be searched for (and if no matches are found then recompile a new one) - microRegInfo lpState; // Pipeline state from where program left off (useful for continuing execution) + microIR allocInfo; // IR information + microProgram* prog; // Store MicroPrograms in memory + int max; // Max Number of MicroPrograms minus 1 + int total; // Total Number of valid MicroPrograms minus 1 + int cur; // Index to Current MicroProgram thats running (-1 = uncached) + int isSame; // Current cached microProgram is Exact Same program as mVU->regs->Micro (-1 = unknown, 0 = No, 1 = Yes) + int cleared; // Micro Program is Indeterminate so must be searched for (and if no matches are found then recompile a new one) + u8* x86ptr; // Pointer to program's recompilation code + u8* x86start; // Start of program's rec-cache + u8* x86end; // Limit of program's rec-cache + microRegInfo lpState; // Pipeline state from where program left off (useful for continuing execution) }; -#define mVUcacheSize (mMaxProg * 0xCCCCC) // 0.8mb per program +#define mVUcacheSize (mMaxProg * (0x100000 * 0.5)) // 0.5mb per program struct microVU { PCSX2_ALIGNED16(u32 macFlag[4]); // 4 instances of mac flag (used in execution) diff --git a/pcsx2/x86/microVU_Analyze.inl b/pcsx2/x86/microVU_Analyze.inl index cd9d47b659..4349b9fdf7 100644 --- a/pcsx2/x86/microVU_Analyze.inl +++ b/pcsx2/x86/microVU_Analyze.inl @@ -102,6 +102,7 @@ // Writing to a VI reg #define analyzeVIreg2(xReg, viWrite, aCycles) { \ if (xReg) { \ + mVUconstReg[xReg].isValid = 0; \ mVUregsTemp.VIreg = xReg; \ mVUregsTemp.VI = aCycles; \ viWrite.reg = xReg; \ @@ -114,6 +115,7 @@ #define analyzeRreg() { mVUregsTemp.r = 1; } #define analyzeXGkick1() { mVUstall = aMax(mVUstall, mVUregs.xgkick); } #define analyzeXGkick2(x) { mVUregsTemp.xgkick = x; } +#define setConstReg(x, v) { if (x) { mVUconstReg[x].isValid = 1; mVUconstReg[x].regValue = v; } } //------------------------------------------------------------------ // FMAC1 - Normal FMAC Opcodes @@ -173,6 +175,11 @@ microVUt(void) mVUanalyzeIALU2(mV, int Is, int It) { analyzeVIreg2(It, mVUlow.VI_write, 1); } +microVUt(void) mVUanalyzeIADDI(mV, int Is, int It, s16 imm) { + mVUanalyzeIALU2(mVU, Is, It); + if (!Is) { setConstReg(It, imm); } +} + //------------------------------------------------------------------ // MR32 - MR32 Opcode //------------------------------------------------------------------ @@ -386,3 +393,16 @@ microVUt(void) mVUanalyzeBranch2(mV, int Is, int It) { analyzeBranchVI(mVU, It, mVUlow.memReadIt); } } + +microVUt(void) mVUanalyzeJump(mV, int Is, int It, bool isJALR) { + if (mVUconstReg[Is].isValid && !CHECK_VU_CONSTHACK) { + mVUlow.constJump.isValid = 1; + mVUlow.constJump.regValue = mVUconstReg[Is].regValue; + //DevCon::Status("microVU%d: Constant JR/JALR Address Optimization", params mVU->index); + } + analyzeVIreg1(Is, mVUlow.VI_read[0]); + if (isJALR) { + analyzeVIreg2(It, mVUlow.VI_write, 1); + setConstReg(It, bSaveAddr); + } +} diff --git a/pcsx2/x86/microVU_Compile.inl b/pcsx2/x86/microVU_Compile.inl index 4a01c6a31b..cac735f8de 100644 --- a/pcsx2/x86/microVU_Compile.inl +++ b/pcsx2/x86/microVU_Compile.inl @@ -62,6 +62,7 @@ } #define calcCycles(reg, x) { reg = ((reg > x) ? (reg - x) : 0); } +#define optimizeReg(rState) { rState = (rState==1) ? 0 : rState; } #define tCycles(dest, src) { dest = aMax(dest, src); } #define incP() { mVU->p = (mVU->p+1) & 1; } #define incQ() { mVU->q = (mVU->q+1) & 1; } @@ -69,7 +70,7 @@ #define doLowerOp() { incPC(-1); mVUopL(mVU, 1); incPC(1); } #define doSwapOp() { doBackupVF1(); mVUopL(mVU, 1); doBackupVF2(); incPC(1); doUpperOp(); doBackupVF3(); } #define doIbit() { if (mVUup.iBit) { incPC(-1); MOV32ItoM((uptr)&mVU->regs->VI[REG_I].UL, curI); incPC(1); } } -#define blockCreate(addr) { if (!mVUblocks[addr]) mVUblocks[addr] = microBlockManager::AlignedNew(); } +#define blockCreate(addr) { if (!mVUblocks[addr]) mVUblocks[addr] = new microBlockManager();/*microBlockManager::AlignedNew();*/ } //------------------------------------------------------------------ // Helper Functions @@ -91,9 +92,11 @@ microVUt(void) mVUcheckIsSame(mV) { // Sets up microProgram PC ranges based on whats been recompiled microVUt(void) mVUsetupRange(mV, s32 pc, bool isStartPC) { - for (int i = 0; i <= mVUcurProg.ranges.total; i++) { - if ((pc >= mVUcurProg.ranges.range[i][0]) - && (pc <= mVUcurProg.ranges.range[i][1])) { return; } + if (isStartPC || !(mVUrange[1] == -1)) { + for (int i = 0; i <= mVUcurProg.ranges.total; i++) { + if ((pc >= mVUcurProg.ranges.range[i][0]) + && (pc <= mVUcurProg.ranges.range[i][1])) { return; } + } } mVUcheckIsSame(mVU); @@ -113,18 +116,22 @@ microVUt(void) mVUsetupRange(mV, s32 pc, bool isStartPC) { else { if (mVUrange[0] <= pc) { mVUrange[1] = pc; + bool mergedRange = 0; for (int i = 0; i <= (mVUcurProg.ranges.total-1); i++) { int rStart = (mVUrange[0] < 8) ? 0 : (mVUrange[0] - 8); int rEnd = pc; if((mVUcurProg.ranges.range[i][1] >= rStart) && (mVUcurProg.ranges.range[i][1] <= rEnd)){ mVUcurProg.ranges.range[i][1] = pc; - mVUrange[0] = -1; - mVUrange[1] = -1; - mVUcurProg.ranges.total--; + mergedRange = 1; //DevCon::Status("microVU%d: Prog Range Merging", params mVU->index); } } + if (mergedRange) { + mVUrange[0] = -1; + mVUrange[1] = -1; + mVUcurProg.ranges.total--; + } } else { DevCon::Status("microVU%d: Prog Range Wrap [%04x] [%d]", params mVU->index, mVUrange[0], mVUrange[1]); @@ -144,6 +151,20 @@ microVUt(void) mVUsetupRange(mV, s32 pc, bool isStartPC) { } } +// Optimizes the End Pipeline State Removing Unnecessary Info +microVUt(void) mVUoptimizePipeState(mV) { + for (int i = 0; i < 32; i++) { + optimizeReg(mVUregs.VF[i].x); + optimizeReg(mVUregs.VF[i].y); + optimizeReg(mVUregs.VF[i].z); + optimizeReg(mVUregs.VF[i].w); + } + for (int i = 0; i < 16; i++) { + optimizeReg(mVUregs.VI[i]); + } + mVUregs.r = 0; +} + // Recompiles Code for Proper Flags and Q/P regs on Block Linkings microVUt(void) mVUsetupBranch(mV, int* xStatus, int* xMac, int* xClip, int xCycles) { mVUprint("mVUsetupBranch"); @@ -324,6 +345,15 @@ microVUt(void) mVUtestCycles(mV) { x86SetJ32(jmp32); } +microVUt(void) mVUinitConstValues(mV) { + for (int i = 0; i < 16; i++) { + mVUconstReg[i].isValid = 0; + mVUconstReg[i].regValue = 0; + } + mVUconstReg[15].isValid = mVUregs.vi15 >> 31; + mVUconstReg[15].regValue = mVUconstReg[15].isValid ? (mVUregs.vi15&0xffff) : 0; +} + //------------------------------------------------------------------ // Recompiler //------------------------------------------------------------------ @@ -349,12 +379,14 @@ microVUr(void*) mVUcompile(microVU* mVU, u32 startPC, uptr pState) { mVU->q = 0; // All blocks start at q index #0 memcpy_fast(&mVUregs, (microRegInfo*)pState, sizeof(microRegInfo)); // Loads up Pipeline State Info mVUblock.x86ptrStart = thisPtr; - pBlock = mVUblocks[startPC/8]->add(&mVUblock); // Add this block to block manager + pBlock = mVUblocks[startPC/8]->add(&mVUblock); // Add this block to block manager mVUpBlock = pBlock; mVUregs.flags = 0; mVUflagInfo = 0; mVUsFlagHack = CHECK_VU_FLAGHACK; + mVUinitConstValues(mVU); + for (int branch = 0; mVUcount < endCount; mVUcount++) { incPC(1); startLoop(); @@ -381,6 +413,12 @@ microVUr(void*) mVUcompile(microVU* mVU, u32 startPC, uptr pState) { int xCycles = mVUsetFlags(mVU, xStatus, xMac, xClip); mVUtestCycles(mVU); + // Fix up vi15 const info for propagation through blocks + mVUregs.vi15 = (mVUconstReg[15].isValid && !CHECK_VU_CONSTHACK) ? ((1<<31) | (mVUconstReg[15].regValue&0xffff)) : 0; + + // Optimize the End Pipeline State for nicer Block Linking + mVUoptimizePipeState(mVU); + // Second Pass iPC = mVUstartPC; setCode(); @@ -419,14 +457,31 @@ microVUr(void*) mVUcompile(microVU* mVU, u32 startPC, uptr pState) { // Check if branch-block has already been compiled blockCreate(branchAddr/8); pBlock = mVUblocks[branchAddr/8]->search((microRegInfo*)&mVUregs); - if (pBlock) { xJMP(pBlock->x86ptrStart); } - else { mVUcompile(mVU, branchAddr, (uptr)&mVUregs); } + if (pBlock) { xJMP(pBlock->x86ptrStart); } + else { mVUcompile(mVU, branchAddr, (uptr)&mVUregs); } return thisPtr; case 9: case 10: // JR/JALR mVUprint("mVUcompile JR/JALR"); incPC(-3); // Go back to jump opcode + if (mVUlow.constJump.isValid) { + if (mVUup.eBit) { // E-bit Jump + iPC = (mVUlow.constJump.regValue*2)&(mVU->progSize-1); + mVUendProgram(mVU, 1, xStatus, xMac, xClip); + } + else { + int jumpAddr = (mVUlow.constJump.regValue*8)&(mVU->microMemSize-8); + mVUsetupBranch(mVU, xStatus, xMac, xClip, xCycles); + // Check if jump-to-block has already been compiled + blockCreate(jumpAddr/8); + pBlock = mVUblocks[jumpAddr/8]->search((microRegInfo*)&mVUregs); + if (pBlock) { xJMP(pBlock->x86ptrStart); } + else { mVUcompile(mVU, jumpAddr, (uptr)&mVUregs); } + } + return thisPtr; + } + if (mVUup.eBit) { // E-bit Jump mVUendProgram(mVU, 2, xStatus, xMac, xClip); MOV32MtoR(gprT1, (uptr)&mVU->branch); diff --git a/pcsx2/x86/microVU_Execute.inl b/pcsx2/x86/microVU_Execute.inl index 9a8e4b28b1..f9463dee9f 100644 --- a/pcsx2/x86/microVU_Execute.inl +++ b/pcsx2/x86/microVU_Execute.inl @@ -127,7 +127,7 @@ microVUx(void*) __fastcall mVUexecute(u32 startPC, u32 cycles) { mVU->cycles = cycles; mVU->totalCycles = cycles; - x86SetPtr(mVUcurProg.x86ptr); // Set x86ptr to where program left off + x86SetPtr(mVU->prog.x86ptr); // Set x86ptr to where last program left off return mVUblockFetch(mVU, startPC, (uptr)&mVU->prog.lpState); } @@ -140,8 +140,8 @@ microVUx(void) mVUcleanUp() { //mVUprint("microVU: Program exited successfully!"); //mVUprint("microVU: VF0 = {%x,%x,%x,%x}", params mVU->regs->VF[0].UL[0], mVU->regs->VF[0].UL[1], mVU->regs->VF[0].UL[2], mVU->regs->VF[0].UL[3]); //mVUprint("microVU: VI0 = %x", params mVU->regs->VI[0].UL); - mVUcurProg.x86ptr = x86Ptr; - mVUcacheCheck(x86Ptr, mVUcurProg.x86start, (uptr)(mVUcurProg.x86end - mVUcurProg.x86start)); + mVU->prog.x86ptr = x86Ptr; + mVUcacheCheck(x86Ptr, mVU->prog.x86start, (uptr)(mVU->prog.x86end - mVU->prog.x86start)); mVU->cycles = mVU->totalCycles - mVU->cycles; mVU->regs->cycle += mVU->cycles; cpuRegs.cycle += ((mVU->cycles < 3000) ? mVU->cycles : 3000) * Config.Hacks.VUCycleSteal; diff --git a/pcsx2/x86/microVU_Flags.inl b/pcsx2/x86/microVU_Flags.inl index 57f35cca54..b0387a71ff 100644 --- a/pcsx2/x86/microVU_Flags.inl +++ b/pcsx2/x86/microVU_Flags.inl @@ -265,7 +265,10 @@ void mVUflagPass(mV, u32 startPC, u32 xCount) { // Checks if the first 4 instructions of a block will read flags microVUt(void) mVUsetFlagInfo(mV) { branchType1 { incPC(-1); mVUflagPass(mVU, branchAddr, 4); incPC(1); } - branchType2 { mVUflagInfo |= 0xfff; } + branchType2 { + if (!mVUlow.constJump.isValid) { mVUflagInfo |= 0xfff; } + else { mVUflagPass(mVU, mVUlow.constJump.regValue, 4); } + } branchType3 { incPC(-1); mVUflagPass(mVU, branchAddr, 4); diff --git a/pcsx2/x86/microVU_IR.h b/pcsx2/x86/microVU_IR.h index 08a794100f..2d1beaf49c 100644 --- a/pcsx2/x86/microVU_IR.h +++ b/pcsx2/x86/microVU_IR.h @@ -35,6 +35,7 @@ union regInfo { __declspec(align(16)) struct microRegInfo { // Ordered for Faster Compares u32 needExactMatch; // If set, block needs an exact match of pipeline state + u32 vi15; // Constant Prop Info for vi15 (only valid if sign-bit set) u8 q; u8 p; u8 r; @@ -42,7 +43,7 @@ __declspec(align(16)) struct microRegInfo { // Ordered for Faster Compares u8 VI[16]; regInfo VF[32]; u8 flags; // clip x2 :: status x2 - u8 padding[7]; // 160 bytes + u8 padding[3]; // 160 bytes #if defined(_MSC_VER) }; #else @@ -84,6 +85,11 @@ struct microVIreg { u8 used; // Reg is Used? (Read/Written) }; +struct microConstInfo { + u8 isValid; // Is the constant in regValue valid? + u32 regValue; // Constant Value +}; + struct microUpperOp { bool eBit; // Has E-bit set bool iBit; // Has I-bit set @@ -93,10 +99,11 @@ struct microUpperOp { }; struct microLowerOp { - microVFreg VF_write; // VF Vectors written to by this instruction - microVFreg VF_read[2]; // VF Vectors read by this instruction - microVIreg VI_write; // VI reg written to by this instruction - microVIreg VI_read[2]; // VI regs read by this instruction + microVFreg VF_write; // VF Vectors written to by this instruction + microVFreg VF_read[2]; // VF Vectors read by this instruction + microVIreg VI_write; // VI reg written to by this instruction + microVIreg VI_read[2]; // VI regs read by this instruction + microConstInfo constJump; // Constant Reg Info for JR/JARL instructions u32 branch; // Branch Type (0 = Not a Branch, 1 = B. 2 = BAL, 3~8 = Conditional Branches, 9 = JALR, 10 = JR) bool isNOP; // This instruction is a NOP bool isFSSET; // This instruction is a FSSET @@ -137,10 +144,11 @@ struct microOp { template struct microIR { - microBlock block; // Block/Pipeline info - microBlock* pBlock; // Pointer to a block in mVUblocks - microTempRegInfo regsTemp; // Temp Pipeline info (used so that new pipeline info isn't conflicting between upper and lower instructions in the same cycle) + microBlock block; // Block/Pipeline info + microBlock* pBlock; // Pointer to a block in mVUblocks + microTempRegInfo regsTemp; // Temp Pipeline info (used so that new pipeline info isn't conflicting between upper and lower instructions in the same cycle) microOp info[pSize/2]; // Info for Instructions in current block + microConstInfo constReg[16]; // Simple Const Propagation Info for VI regs within blocks u8 branch; u32 cycles; // Cycles for current block u32 count; // Number of VU 64bit instructions ran (starts at 0 for each block) diff --git a/pcsx2/x86/microVU_Lower.inl b/pcsx2/x86/microVU_Lower.inl index 8c82889596..0249729754 100644 --- a/pcsx2/x86/microVU_Lower.inl +++ b/pcsx2/x86/microVU_Lower.inl @@ -612,7 +612,7 @@ mVUop(mVU_IADD) { } mVUop(mVU_IADDI) { - pass1 { mVUanalyzeIALU2(mVU, _Is_, _It_); } + pass1 { mVUanalyzeIADDI(mVU, _Is_, _It_, _Imm5_); } pass2 { mVUallocVIa(mVU, gprT1, _Is_); ADD16ItoR(gprT1, _Imm5_); @@ -622,7 +622,7 @@ mVUop(mVU_IADDI) { } mVUop(mVU_IADDIU) { - pass1 { mVUanalyzeIALU2(mVU, _Is_, _It_); } + pass1 { mVUanalyzeIADDI(mVU, _Is_, _It_, _Imm15_); } pass2 { mVUallocVIa(mVU, gprT1, _Is_); ADD16ItoR(gprT1, _Imm15_); @@ -1127,7 +1127,7 @@ mVUop(mVU_B) { mVUop(mVU_BAL) { setBranchA(2, _It_); - pass1 { analyzeVIreg2(_It_, mVUlow.VI_write, 1); } + pass1 { analyzeVIreg2(_It_, mVUlow.VI_write, 1); setConstReg(_It_, bSaveAddr); } pass2 { MOV32ItoR(gprT1, bSaveAddr); mVUallocVIb(mVU, gprT1, _It_); @@ -1207,24 +1207,28 @@ mVUop(mVU_IBNE) { mVUop(mVU_JR) { mVUbranch = 9; - pass1 { analyzeVIreg1(_Is_, mVUlow.VI_read[0]); } + pass1 { mVUanalyzeJump(mVU, _Is_, 0, 0); } pass2 { - mVUallocVIa(mVU, gprT1, _Is_); - SHL32ItoR(gprT1, 3); - AND32ItoR(gprT1, isVU1 ? 0x3ff8 : 0xff8); - MOV32RtoM((uptr)&mVU->branch, gprT1); + if (!mVUlow.constJump.isValid) { + mVUallocVIa(mVU, gprT1, _Is_); + SHL32ItoR(gprT1, 3); + AND32ItoR(gprT1, mVU->microMemSize - 8); + MOV32RtoM((uptr)&mVU->branch, gprT1); + } } pass3 { mVUlog("JR [vi%02d]", _Fs_); } } mVUop(mVU_JALR) { mVUbranch = 10; - pass1 { analyzeVIreg1(_Is_, mVUlow.VI_read[0]); analyzeVIreg2(_It_, mVUlow.VI_write, 1); } + pass1 { mVUanalyzeJump(mVU, _Is_, _It_, 1); } pass2 { - mVUallocVIa(mVU, gprT1, _Is_); - SHL32ItoR(gprT1, 3); - AND32ItoR(gprT1, isVU1 ? 0x3ff8 : 0xff8); - MOV32RtoM((uptr)&mVU->branch, gprT1); + if (!mVUlow.constJump.isValid) { + mVUallocVIa(mVU, gprT1, _Is_); + SHL32ItoR(gprT1, 3); + AND32ItoR(gprT1, mVU->microMemSize - 8); + MOV32RtoM((uptr)&mVU->branch, gprT1); + } MOV32ItoR(gprT1, bSaveAddr); mVUallocVIb(mVU, gprT1, _It_); } diff --git a/pcsx2/x86/microVU_Misc.h b/pcsx2/x86/microVU_Misc.h index 5f4d22bcf0..7b13a0dc3c 100644 --- a/pcsx2/x86/microVU_Misc.h +++ b/pcsx2/x86/microVU_Misc.h @@ -187,7 +187,7 @@ typedef u32 (__fastcall *mVUCall)(void*, void*); #define mVUprogI mVU->prog.prog[progIndex] #define mVUcurProg mVU->prog.prog[mVU->prog.cur] #define mVUblocks mVU->prog.prog[mVU->prog.cur].block -#define mVUallocInfo mVU->prog.prog[mVU->prog.cur].allocInfo +#define mVUallocInfo mVU->prog.allocInfo #define mVUbranch mVUallocInfo.branch #define mVUcycles mVUallocInfo.cycles #define mVUcount mVUallocInfo.count @@ -198,6 +198,7 @@ typedef u32 (__fastcall *mVUCall)(void*, void*); #define iPC mVUallocInfo.curPC #define mVUsFlagHack mVUallocInfo.sFlagHack #define mVUinfo mVUallocInfo.info[iPC / 2] +#define mVUconstReg mVUallocInfo.constReg #define mVUstall mVUinfo.stall #define mVUup mVUinfo.uOp #define mVUlow mVUinfo.lOp @@ -212,7 +213,7 @@ typedef u32 (__fastcall *mVUCall)(void*, void*); #define setCode() { mVU->code = curI; } #define incPC(x) { iPC = ((iPC + x) & (mVU->progSize-1)); setCode(); } #define incPC2(x) { iPC = ((iPC + x) & (mVU->progSize-1)); } -#define bSaveAddr (((xPC + (2 * 8)) & ((isVU1) ? 0x3ff8:0xff8)) / 8) +#define bSaveAddr (((xPC + 16) & (mVU->microMemSize-8)) / 8) #define branchAddr ((xPC + 8 + (_Imm11_ * 8)) & (mVU->microMemSize-8)) #define shufflePQ (((mVU->p) ? 0xb0 : 0xe0) | ((mVU->q) ? 0x01 : 0x04)) #define cmpOffset(x) ((u8*)&(((u8*)x)[mVUprogI.ranges.range[i][0]])) @@ -272,6 +273,7 @@ typedef u32 (__fastcall *mVUCall)(void*, void*); #endif // Speed Hacks +#define CHECK_VU_CONSTHACK 0 // Only use for GoW (will be slower on other games) #define CHECK_VU_FLAGHACK (u32)Config.Hacks.vuFlagHack // (Can cause Infinite loops, SPS, etc...) #define CHECK_VU_MINMAXHACK (u32)Config.Hacks.vuMinMax // (Can cause SPS, Black Screens, etc...) @@ -282,12 +284,12 @@ typedef u32 (__fastcall *mVUCall)(void*, void*); // Cache Limit Check -#define mVUcacheCheck(ptr, start, limit) { \ - uptr diff = ptr - start; \ - if (diff >= limit) { \ - Console::Error("microVU Error: Program went over its cache limit. Size = 0x%x", params diff); \ - mVUreset(mVU); \ - } \ +#define mVUcacheCheck(ptr, start, limit) { \ + uptr diff = ptr - start; \ + if (diff >= limit) { \ + Console::Status("microVU%d: Program cache limit reached. Size = 0x%x", params mVU->index, diff); \ + mVUreset(mVU); \ + } \ } #define mVUdebugNOW(isEndPC) { \ diff --git a/plugins/GSdx/GSCrc.cpp b/plugins/GSdx/GSCrc.cpp index 00fa942582..f21c3799c4 100644 --- a/plugins/GSdx/GSCrc.cpp +++ b/plugins/GSdx/GSCrc.cpp @@ -32,6 +32,7 @@ CRC::Game CRC::m_games[] = {0xDDB59F46, KyuuketsuKitanMoonties, JP, PointListPalette}, {0xC8EE2562, PiaCarroteYoukosoGPGakuenPrincess, JP, PointListPalette}, {0x6CF94A43, KazokuKeikakuKokoroNoKizuna, JP, PointListPalette}, + {0xEDAF602D, DuelSaviorDestiny, JP, PointListPalette}, {0xa39517ab, FFX, EU, 0}, {0xa39517ae, FFX, FR, 0}, {0x941bb7d9, FFX, DE, 0}, @@ -133,12 +134,16 @@ CRC::Game CRC::m_games[] = {0x6BF11378, Onimusha3, US, 0}, {0xF442260C, MajokkoALaMode2, JP, 0}, {0x14FE77F7, TalesOfAbyss, US, 0}, - {0x045D77E9, TalesOfAbyss, US, 0}, // undub + {0x045D77E9, TalesOfAbyss, JPUNDUB, 0}, {0xAA5EC3A3, TalesOfAbyss, JP, 0}, {0xFB236A46, SonicUnleashed, US, 0}, {0x4C7BB3C8, SimpsonsGame, Unknown, 0}, {0x4C94B32C, SimpsonsGame, Unknown, 0}, {0xD71B57F4, Genji, Unknown, 0}, + {0x23A97857, StarOcean3, JPUNDUB, 0}, + {0xCC96CE93, ValkyrieProfile2, US, 0}, + {0x774DE8E2, ValkyrieProfile2, JP, 0}, + {0x47B9B2FD, RadiataStories, US, 0}, }; hash_map CRC::m_map; diff --git a/plugins/GSdx/GSCrc.h b/plugins/GSdx/GSCrc.h index 06f6698d55..8247e4fec0 100644 --- a/plugins/GSdx/GSCrc.h +++ b/plugins/GSdx/GSCrc.h @@ -34,6 +34,7 @@ public: KyuuketsuKitanMoonties, PiaCarroteYoukosoGPGakuenPrincess, KazokuKeikakuKokoroNoKizuna, + DuelSaviorDestiny, FFX, FFX2, FFXII, @@ -70,6 +71,9 @@ public: SonicUnleashed, SimpsonsGame, Genji, + StarOcean3, + ValkyrieProfile2, + RadiataStories, TitleCount, }; diff --git a/plugins/GSdx/GSDevice9.cpp b/plugins/GSdx/GSDevice9.cpp index 37ef14415c..5aa0363098 100644 --- a/plugins/GSdx/GSDevice9.cpp +++ b/plugins/GSdx/GSDevice9.cpp @@ -502,7 +502,6 @@ GSTexture* GSDevice9::CreateRenderTarget(int w, int h, int format) GSTexture* GSDevice9::CreateDepthStencil(int w, int h, int format) { return __super::CreateDepthStencil(w, h, format ? format : D3DFMT_D24S8); - // return __super::CreateDepthStencil(w, h, format ? format : D3DFMT_D32F_LOCKABLE); } GSTexture* GSDevice9::CreateTexture(int w, int h, int format) diff --git a/plugins/GSdx/GSRendererDX.h b/plugins/GSdx/GSRendererDX.h index 14a6fde4e0..96bfe7fe40 100644 --- a/plugins/GSdx/GSRendererDX.h +++ b/plugins/GSdx/GSRendererDX.h @@ -193,20 +193,25 @@ public: GSTextureFX::PSConstantBuffer ps_cb; - ps_cb.FogColor_AREF = GSVector4((int)env.FOGCOL.FCR, (int)env.FOGCOL.FCG, (int)env.FOGCOL.FCB, (int)context->TEST.AREF) / 255; + ps_cb.FogColor_AREF = GSVector4((int)env.FOGCOL.FCR, (int)env.FOGCOL.FCG, (int)env.FOGCOL.FCB, 0) / 255; - if(ps_sel.atst == 2 || ps_sel.atst == 5) + switch(ps_sel.atst) { - ps_cb.FogColor_AREF.a -= 0.9f / 255; - } - else if(ps_sel.atst == 3 || ps_sel.atst == 6) - { - ps_cb.FogColor_AREF.a += 0.9f / 255; + case ATST_LESS: + ps_cb.FogColor_AREF.a = (float)((int)context->TEST.AREF - 1); + break; + case ATST_GREATER: + ps_cb.FogColor_AREF.a = (float)((int)context->TEST.AREF + 1); + break; + default: + ps_cb.FogColor_AREF.a = (float)(int)context->TEST.AREF; + break; } if(tex) { ps_sel.bpp = tex->m_bpp; + ps_sel.rt = tex->m_target; int w = tex->m_texture->GetWidth(); int h = tex->m_texture->GetHeight(); @@ -300,6 +305,19 @@ public: ps_sel.atst = iatst[ps_sel.atst]; + switch(ps_sel.atst) + { + case ATST_LESS: + ps_cb.FogColor_AREF.a = (float)((int)context->TEST.AREF - 1); + break; + case ATST_GREATER: + ps_cb.FogColor_AREF.a = (float)((int)context->TEST.AREF + 1); + break; + default: + ps_cb.FogColor_AREF.a = (float)(int)context->TEST.AREF; + break; + } + m_tfx->UpdatePS(ps_sel, &ps_cb, ps_ssel); bool z = om_dssel.zwe; diff --git a/plugins/GSdx/GSState.cpp b/plugins/GSdx/GSState.cpp index 197f12d81e..d7de1efd3b 100644 --- a/plugins/GSdx/GSState.cpp +++ b/plugins/GSdx/GSState.cpp @@ -890,7 +890,7 @@ void GSState::GIFRegHandlerHWREG(GIFReg* r) { ASSERT(m_env.TRXDIR.XDIR == 0); // host => local - Write((uint8*)r, 8); // hunting ground + Write((uint8*)r, 8); // haunting ground } void GSState::GIFRegHandlerSIGNAL(GIFReg* r) @@ -2211,6 +2211,66 @@ bool GSC_Genji(const GSFrameInfo& fi, int& skip) return true; } +bool GSC_StarOcean3(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) + { + skip = 1000; // + } + } + else + { + if(!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH)) + { + skip = 0; + } + } + + return true; +} + +bool GSC_ValkyrieProfile2(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) + { + skip = 1000; // + } + } + else + { + if(!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH)) + { + skip = 0; + } + } + + return true; +} + +bool GSC_RadiataStories(const GSFrameInfo& fi, int& skip) +{ + if(skip == 0) + { + if(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH) + { + skip = 1000; // + } + } + else + { + if(!(fi.TME && fi.FBP == fi.TBP0 && fi.FPSM == PSM_PSMCT32 && fi.TPSM == PSM_PSMT4HH)) + { + skip = 0; + } + } + + return true; +} + bool GSState::IsBadFrame(int& skip) { GSFrameInfo fi; @@ -2258,6 +2318,9 @@ bool GSState::IsBadFrame(int& skip) map[CRC::TalesOfAbyss] = GSC_TalesOfAbyss; map[CRC::SonicUnleashed] = GSC_SonicUnleashed; map[CRC::Genji] = GSC_Genji; + map[CRC::StarOcean3] = GSC_StarOcean3; + map[CRC::ValkyrieProfile2] = GSC_ValkyrieProfile2; + map[CRC::RadiataStories] = GSC_RadiataStories; } // TODO: just set gsc in SetGameCRC once diff --git a/plugins/GSdx/GSTextureCache.cpp b/plugins/GSdx/GSTextureCache.cpp index 897f6be043..b7e7ebf06d 100644 --- a/plugins/GSdx/GSTextureCache.cpp +++ b/plugins/GSdx/GSTextureCache.cpp @@ -54,9 +54,9 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con Source* src = NULL; - const hash_map& map = m_src.m_map[TEX0.TBP0 >> 5]; + hash_map& m = m_src.m_map[TEX0.TBP0 >> 5]; - for(hash_map::const_iterator i = map.begin(); i != map.end(); i++) + for(hash_map::iterator i = m.begin(); i != m.end(); i++) { Source* s = i->first; @@ -242,9 +242,9 @@ void GSTextureCache::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const if(!target) { - const hash_map& map = m_src.m_map[bp >> 5]; + const hash_map& m = m_src.m_map[bp >> 5]; - for(hash_map::const_iterator i = map.begin(); i != map.end(); ) + for(hash_map::const_iterator i = m.begin(); i != m.end(); ) { hash_map::const_iterator j = i++; @@ -267,9 +267,9 @@ void GSTextureCache::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const if(page < MAX_PAGES) { - const hash_map& map = m_src.m_map[page]; + const hash_map& m = m_src.m_map[page]; - for(hash_map::const_iterator i = map.begin(); i != map.end(); ) + for(hash_map::const_iterator i = m.begin(); i != m.end(); ) { hash_map::const_iterator j = i++; @@ -279,15 +279,15 @@ void GSTextureCache::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const { if(!s->m_target) { - s->m_blocks -= s->m_valid[page].count; - - s->m_valid[page].block = 0; - s->m_valid[page].count = 0; + s->m_valid[page] = 0; + s->m_complete = false; found = true; } else { + // TODO + if(s->m_TEX0.TBP0 == bp) { m_src.RemoveAt(s); @@ -485,6 +485,7 @@ GSTextureCache::Source::Source(GSRenderer* r) , m_initpalette(false) , m_bpp(0) , m_target(false) + , m_complete(false) { memset(m_valid, 0, sizeof(m_valid)); @@ -509,7 +510,7 @@ void GSTextureCache::Source::Update(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE { __super::Update(); - if(m_target) + if(m_complete || m_target) { return; } @@ -517,17 +518,17 @@ void GSTextureCache::Source::Update(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE m_TEX0 = TEX0; m_TEXA = TEXA; - if(m_blocks == m_total_blocks) - { - return; - } - const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[m_TEX0.PSM]; GSVector2i bs = psm.bs; GSVector4i r = rect.ralign(bs); + if(r.eq(GSVector4i(0, 0, 1 << m_TEX0.TW, 1 << m_TEX0.TH))) + { + m_complete = true; // lame, but better than nothing + } + uint32 bp = m_TEX0.TBP0; uint32 bw = m_TEX0.TBW; @@ -548,11 +549,12 @@ void GSTextureCache::Source::Update(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE uint32 row = block >> 5; uint32 col = 1 << (block & 31); - if((m_valid[row].block & col) == 0) + if((m_valid[row] & col) == 0) { - if(!repeating) m_valid[row].block |= col; - - m_valid[row].count++; + if(!repeating) + { + m_valid[row] |= col; + } Write(GSVector4i(x, y, x + bs.x, y + bs.y)); @@ -579,14 +581,12 @@ void GSTextureCache::Source::Update(const GIFRegTEX0& TEX0, const GIFRegTEXA& TE uint32 row = block >> 5; uint32 col = 1 << (block & 31); - m_valid[row].block |= col; + m_valid[row] |= col; } } } } - m_blocks += blocks; - m_renderer->m_perfmon.Put(GSPerfMon::Unswizzle, bs.x * bs.y * sizeof(uint32) * blocks); Flush(m_write.count); @@ -783,11 +783,18 @@ void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0) uint32 bp = TEX0.TBP0; uint32 bw = TEX0.TBW; + if(s->m_target) + { + // TODO + + m_map[bp >> 5][s] = true; + + return; + } + const GSLocalMemory::psm_t& psm = GSLocalMemory::m_psm[TEX0.PSM]; - GSVector2i bs = psm.bs; - - int blocks = 0; + GSVector2i bs = (bp & 31) ? psm.pgs : psm.bs; for(int y = 0; y < th; y += bs.y) { @@ -795,19 +802,32 @@ void GSTextureCache::SourceMap::Add(Source* s, const GIFRegTEX0& TEX0) for(int x = 0; x < tw; x += bs.x) { - uint32 block = base + psm.blockOffset[x >> 3]; + uint32 page = (base + psm.blockOffset[x >> 3]) >> 5; - if(block < MAX_BLOCKS) + if(page < MAX_PAGES) { - m_map[block >> 5][s] = true; - - blocks++; + m_pages[page >> 5] |= 1 << (page & 31); } } } - s->m_blocks = 0; - s->m_total_blocks = blocks; + for(int i = 0; i < countof(m_pages); i++) + { + if(uint32 p = m_pages[i]) + { + m_pages[i] = 0; + + hash_map* m = &m_map[i << 5]; + + for(int j = 0; j < 32; j++) + { + if(p & (1 << j)) + { + m[j][s] = true; + } + } + } + } } void GSTextureCache::SourceMap::RemoveAll() @@ -819,7 +839,7 @@ void GSTextureCache::SourceMap::RemoveAll() m_surfaces.clear(); - for(int i = 0; i < MAX_PAGES; i++) + for(uint32 i = 0; i < countof(m_map); i++) { m_map[i].clear(); } @@ -829,9 +849,20 @@ void GSTextureCache::SourceMap::RemoveAt(Source* s) { m_surfaces.erase(s); - for(int i = 0; i < countof(m_map); i++) + uint32 page = s->m_TEX0.TBP0 >> 5; + + if(s->m_target) { - m_map[i].erase(s); + // TODO + + m_map[page].erase(s); + } + else + { + for(uint32 i = page; i < countof(m_map); i++) + { + m_map[i].erase(s); + } } delete s; diff --git a/plugins/GSdx/GSTextureCache.h b/plugins/GSdx/GSTextureCache.h index 277b5d046f..3ac0392959 100644 --- a/plugins/GSdx/GSTextureCache.h +++ b/plugins/GSdx/GSTextureCache.h @@ -58,11 +58,11 @@ public: public: GSTexture* m_palette; bool m_initpalette; - uint32 m_blocks, m_total_blocks; - struct {uint32 block, count;} m_valid[MAX_PAGES]; // each uint32 bits map to the 32 blocks of that page + uint32 m_valid[MAX_PAGES]; // each uint32 bits map to the 32 blocks of that page uint32* m_clut; int m_bpp; bool m_target; + bool m_complete; public: explicit Source(GSRenderer* renderer); @@ -95,9 +95,10 @@ protected: { hash_map m_surfaces; hash_map m_map[MAX_PAGES]; + uint32 m_pages[16]; bool m_used; - SourceMap() : m_used(false) {} + SourceMap() : m_used(false) {memset(m_pages, 0, sizeof(m_pages));} void Add(Source* s, const GIFRegTEX0& TEX0); void RemoveAll(); diff --git a/plugins/GSdx/GSTextureCache10.cpp b/plugins/GSdx/GSTextureCache10.cpp index e4914cb09f..81c02470fc 100644 --- a/plugins/GSdx/GSTextureCache10.cpp +++ b/plugins/GSdx/GSTextureCache10.cpp @@ -203,8 +203,14 @@ bool GSTextureCache10::Source10::Create(Target* dst) m_initpalette = true; break; case PSM_PSMT4HL: + m_bpp = 4; + m_palette = m_renderer->m_dev->CreateTexture(256, 1); + m_initpalette = true; + break; case PSM_PSMT4HH: - ASSERT(0); // TODO + m_bpp = 5; + m_palette = m_renderer->m_dev->CreateTexture(256, 1); + m_initpalette = true; break; } diff --git a/plugins/GSdx/GSTextureCache11.cpp b/plugins/GSdx/GSTextureCache11.cpp index fc0e4ee0b4..9ab7ff2b32 100644 --- a/plugins/GSdx/GSTextureCache11.cpp +++ b/plugins/GSdx/GSTextureCache11.cpp @@ -205,8 +205,14 @@ bool GSTextureCache11::Source11::Create(Target* dst) m_initpalette = true; break; case PSM_PSMT4HL: + m_bpp = 4; + m_palette = m_renderer->m_dev->CreateTexture(256, 1); + m_initpalette = true; + break; case PSM_PSMT4HH: - ASSERT(0); // TODO + m_bpp = 5; + m_palette = m_renderer->m_dev->CreateTexture(256, 1); + m_initpalette = true; break; } diff --git a/plugins/GSdx/GSTextureCache9.cpp b/plugins/GSdx/GSTextureCache9.cpp index 6b33249851..65c301835d 100644 --- a/plugins/GSdx/GSTextureCache9.cpp +++ b/plugins/GSdx/GSTextureCache9.cpp @@ -203,8 +203,14 @@ bool GSTextureCache9::Source9::Create(Target* dst) m_initpalette = true; break; case PSM_PSMT4HL: + m_bpp = 4; + m_palette = m_renderer->m_dev->CreateTexture(256, 1); + m_initpalette = true; + break; case PSM_PSMT4HH: - ASSERT(0); // TODO + m_bpp = 5; + m_palette = m_renderer->m_dev->CreateTexture(256, 1); + m_initpalette = true; break; } diff --git a/plugins/GSdx/GSTextureCacheSW.cpp b/plugins/GSdx/GSTextureCacheSW.cpp index 17bd198170..572097ba58 100644 --- a/plugins/GSdx/GSTextureCacheSW.cpp +++ b/plugins/GSdx/GSTextureCacheSW.cpp @@ -25,6 +25,7 @@ GSTextureCacheSW::GSTextureCacheSW(GSState* state) : m_state(state) { + memset(m_pages, 0, sizeof(m_pages)); } GSTextureCacheSW::~GSTextureCacheSW() @@ -85,7 +86,25 @@ const GSTextureCacheSW::GSTexture* GSTextureCacheSW::Lookup(const GIFRegTEX0& TE if(page < MAX_PAGES) { - m_map[page][t] = true; + m_pages[page >> 5] |= 1 << (page & 31); + } + } + } + + for(int i = 0; i < countof(m_pages); i++) + { + if(uint32 p = m_pages[i]) + { + m_pages[i] = 0; + + hash_map* m = &m_map[i << 5]; + + for(int j = 0; j < 32; j++) + { + if(p & (1 << j)) + { + m[j][t] = true; + } } } } @@ -177,7 +196,6 @@ void GSTextureCacheSW::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, cons if(GSUtil::HasSharedBits(BITBLTBUF.DPSM, t->m_TEX0.PSM)) { t->m_valid[page] = 0; - t->m_complete = false; } } @@ -237,103 +255,81 @@ bool GSTextureCacheSW::GSTexture::Update(const GIFRegTEX0& TEX0, const GIFRegTEX GSVector4i r = rect.ralign(s); - if(r.left == 0 && r.top == 0 && r.right == tw && r.bottom == th) + if(r.eq(GSVector4i(0, 0, tw, th))) { m_complete = true; // lame, but better than nothing } - GSLocalMemory& mem = m_state->m_mem; - uint32 bp = TEX0.TBP0; uint32 bw = TEX0.TBW; - GSLocalMemory::readTextureBlock rtxb = psm.rtxbP; - - int bytes = psm.pal > 0 ? 1 : 4; - - uint32 pitch = (1 << m_tw) * bytes; - - uint8* dst = (uint8*)m_buff + pitch * r.top; + bool repeating = tw > (bw << 6); // TODO: bw == 0 uint32 blocks = 0; - if(tw <= (bw << 6)) + GSLocalMemory& mem = m_state->m_mem; + + GSLocalMemory::readTextureBlock rtxb = psm.rtxbP; + + int shift = psm.pal == 0 ? 2 : 0; + + uint32 pitch = (1 << m_tw) << shift; + + uint8* dst = (uint8*)m_buff + pitch * r.top; + + for(int y = r.top, o = pitch * s.y; y < r.bottom; y += s.y, dst += o) { - for(int y = r.top, o = pitch * s.y; y < r.bottom; y += s.y, dst += o) + uint32 base = psm.bn(0, y, bp, bw); + + for(int x = r.left; x < r.right; x += s.x) { - uint32 base = psm.bn(0, y, bp, bw); + uint32 block = base + psm.blockOffset[x >> 3]; - for(int x = r.left; x < r.right; x += s.x) + if(block < MAX_BLOCKS) { - uint32 block = base + psm.blockOffset[x >> 3]; + uint32 row = block >> 5; + uint32 col = 1 << (block & 31); - if(block < MAX_BLOCKS) + if((m_valid[row] & col) == 0) { - uint32 row = block >> 5; - uint32 col = 1 << (block & 31); - - if((m_valid[row] & col) == 0) + if(!repeating) { m_valid[row] |= col; - - (mem.*rtxb)(block, &dst[x * bytes], pitch, TEXA); - - blocks++; } + + (mem.*rtxb)(block, &dst[x << shift], pitch, TEXA); + + blocks++; } } } } - else + + if(blocks > 0) { - // unfortunatelly a block may be part of the same texture multiple times at different places (tw 1024 > tbw 640, between 640 -> 1024 it is repeated from the next row), - // so just can't set the block's bit to valid in one pass, even if 99.9% of the games don't address the repeated part at the right side - - // TODO: still bogus if those repeated parts aren't fetched together - - for(int y = r.top, o = pitch * s.y; y < r.bottom; y += s.y, dst += o) + if(repeating) { - uint32 base = psm.bn(0, y, bp, bw); - - for(int x = r.left; x < r.right; x += s.x) + for(int y = r.top; y < r.bottom; y += s.y) { - uint32 block = base + psm.blockOffset[x >> 3]; + uint32 base = psm.bn(0, y, bp, bw); - if(block < MAX_BLOCKS) + for(int x = r.left; x < r.right; x += s.x) { - uint32 row = block >> 5; - uint32 col = 1 << (block & 31); + uint32 block = base + psm.blockOffset[x >> 3]; - if((m_valid[row] & col) == 0) + if(block < MAX_BLOCKS) { - (mem.*rtxb)(block, &dst[x * bytes], pitch, TEXA); + uint32 row = block >> 5; + uint32 col = 1 << (block & 31); - blocks++; + m_valid[row] |= col; } } } } - for(int y = r.top; y < r.bottom; y += s.y) - { - uint32 base = psm.bn(0, y, bp, bw); - - for(int x = r.left; x < r.right; x += s.x) - { - uint32 block = base + psm.blockOffset[x >> 3]; - - if(block < MAX_BLOCKS) - { - uint32 row = block >> 5; - uint32 col = 1 << (block & 31); - - m_valid[row] |= col; - } - } - } + m_state->m_perfmon.Put(GSPerfMon::Unswizzle, s.x * s.y * blocks << shift); } - m_state->m_perfmon.Put(GSPerfMon::Unswizzle, s.x * s.y * bytes * blocks); - return true; } diff --git a/plugins/GSdx/GSTextureCacheSW.h b/plugins/GSdx/GSTextureCacheSW.h index ccb57495e4..454637770f 100644 --- a/plugins/GSdx/GSTextureCacheSW.h +++ b/plugins/GSdx/GSTextureCacheSW.h @@ -48,6 +48,7 @@ protected: GSState* m_state; hash_map m_textures; hash_map m_map[MAX_PAGES]; + uint32 m_pages[16]; public: GSTextureCacheSW(GSState* state); diff --git a/plugins/GSdx/GSTextureFX10.cpp b/plugins/GSdx/GSTextureFX10.cpp index 3750a5b9c8..4917d18406 100644 --- a/plugins/GSdx/GSTextureFX10.cpp +++ b/plugins/GSdx/GSTextureFX10.cpp @@ -288,7 +288,7 @@ void GSTextureFX10::UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSampl m_ps_ss[ssel] = ss0; } - if(sel.bpp == 3) + if(sel.bpp >= 3) { ss1 = m_palette_ss; } diff --git a/plugins/GSdx/GSTextureFX11.cpp b/plugins/GSdx/GSTextureFX11.cpp index 24e2b25dbb..b93d7e3673 100644 --- a/plugins/GSdx/GSTextureFX11.cpp +++ b/plugins/GSdx/GSTextureFX11.cpp @@ -292,7 +292,7 @@ void GSTextureFX11::UpdatePS(PSSelector sel, const PSConstantBuffer* cb, PSSampl m_ps_ss[ssel] = ss0; } - if(sel.bpp == 3) + if(sel.bpp >= 3) { ss1 = m_palette_ss; } diff --git a/plugins/GSdx/GSUtil.cpp b/plugins/GSdx/GSUtil.cpp index 4b38666b5c..7699d9d6ee 100644 --- a/plugins/GSdx/GSUtil.cpp +++ b/plugins/GSdx/GSUtil.cpp @@ -97,21 +97,6 @@ bool GSUtil::HasCompatibleBits(uint32 spsm, uint32 dpsm) return s_maps.CompatibleBitsField[spsm][dpsm]; } -bool GSUtil::IsRectInRect(const GSVector4i& inner, const GSVector4i& outer) -{ - return outer.left <= inner.left && inner.right <= outer.right && outer.top <= inner.top && inner.bottom <= outer.bottom; -} - -bool GSUtil::IsRectInRectH(const GSVector4i& inner, const GSVector4i& outer) -{ - return outer.top <= inner.top && inner.bottom <= outer.bottom; -} - -bool GSUtil::IsRectInRectV(const GSVector4i& inner, const GSVector4i& outer) -{ - return outer.left <= inner.left && inner.right <= outer.right; -} - bool GSUtil::CheckDirectX() { if(HINSTANCE hDll = LoadLibrary(format("d3dx9_%d.dll", D3DX_SDK_VERSION).c_str())) diff --git a/plugins/GSdx/GSUtil.h b/plugins/GSdx/GSUtil.h index f7d81539b4..8ab293b852 100644 --- a/plugins/GSdx/GSUtil.h +++ b/plugins/GSdx/GSUtil.h @@ -32,10 +32,6 @@ public: static bool HasSharedBits(uint32 sbp, uint32 spsm, uint32 dbp, uint32 dpsm); static bool HasCompatibleBits(uint32 spsm, uint32 dpsm); - static bool IsRectInRect(const GSVector4i& inner, const GSVector4i& outer); - static bool IsRectInRectH(const GSVector4i& inner, const GSVector4i& outer); - static bool IsRectInRectV(const GSVector4i& inner, const GSVector4i& outer); - static uint32 EncodePSM(uint32 psm) { switch(psm) diff --git a/plugins/GSdx/GSVector.h b/plugins/GSdx/GSVector.h index 2b6455e273..3e13c5c879 100644 --- a/plugins/GSdx/GSVector.h +++ b/plugins/GSdx/GSVector.h @@ -24,18 +24,6 @@ public: this->y = y; } - GSVector2T(const GSVector2T& v) - { - *this = v; - } - - const GSVector2T& operator = (const GSVector2T& v) - { - _mm_storel_epi64((__m128i*)this, _mm_loadl_epi64((__m128i*)&v)); - - return *this; - } - bool operator == (const GSVector2T& v) const { return x == v.x && y == v.y; @@ -1041,9 +1029,13 @@ public: return _mm_movemask_epi8(m) == 0xffff; } - bool anytrue() const + bool allfalse() const { - return _mm_movemask_epi8(m) != 0x0000; + #if _M_SSE >= 0x401 + return _mm_testz_si128(m, m); + #else + return _mm_movemask_epi8(m) == 0; + #endif } #if _M_SSE >= 0x401 @@ -2556,7 +2548,12 @@ public: bool allfalse() const { + #if _M_SSE >= 0x401 + __m128i a = _mm_castps_si128(m); + return _mm_testz_si128(a, a); + #else return _mm_movemask_ps(m) == 0; + #endif } // TODO: insert diff --git a/plugins/GSdx/res/tfx.fx b/plugins/GSdx/res/tfx.fx index 2bb2b3b968..1ae604a790 100644 --- a/plugins/GSdx/res/tfx.fx +++ b/plugins/GSdx/res/tfx.fx @@ -299,25 +299,27 @@ void atst(float4 c) { if(PS_ATE == 1) { + float a = trunc(c.a * 255); + if(PS_ATST == 0) { discard; } else if(PS_ATST == 2 || PS_ATST == 3) // l, le { - clip(AREF - c.a); + clip(AREF - a); } else if(PS_ATST == 4) // e { - clip(0.6f / 255 - abs(c.a - AREF)); // FIXME: 0.5f is too small + clip(0.5f - abs(a - AREF)); } else if(PS_ATST == 5 || PS_ATST == 6) // ge, g { - clip(c.a - AREF); + clip(a - AREF); } else if(PS_ATST == 7) // ne { - clip(abs(c.a - AREF) - 0.4f / 255); // FIXME: 0.5f is too much + clip(abs(a - AREF) - 0.5f); } } } @@ -481,7 +483,7 @@ float4 sample(float2 tc, float w) float4 t00, t01, t10, t11; - if(PS_BPP == 3) // 8HP + if(PS_BPP == 3) // 8H { float4 a; @@ -495,6 +497,38 @@ float4 sample(float2 tc, float w) t10 = Palette.Sample(PaletteSampler, a.z); t11 = Palette.Sample(PaletteSampler, a.w); } + else if(PS_BPP == 4) // 4HL + { + float4 a; + + a.x = Texture.Sample(TextureSampler, uv.xy).a; + a.y = Texture.Sample(TextureSampler, uv.zy).a; + a.z = Texture.Sample(TextureSampler, uv.xw).a; + a.w = Texture.Sample(TextureSampler, uv.zw).a; + + a = fmod(a, 1.0f / 16); + + t00 = Palette.Sample(PaletteSampler, a.x); + t01 = Palette.Sample(PaletteSampler, a.y); + t10 = Palette.Sample(PaletteSampler, a.z); + t11 = Palette.Sample(PaletteSampler, a.w); + } + else if(PS_BPP == 5) // 4HH + { + float4 a; + + a.x = Texture.Sample(TextureSampler, uv.xy).a; + a.y = Texture.Sample(TextureSampler, uv.zy).a; + a.z = Texture.Sample(TextureSampler, uv.xw).a; + a.w = Texture.Sample(TextureSampler, uv.zw).a; + + a = fmod(a * 16, 1.0f / 16); + + t00 = Palette.Sample(PaletteSampler, a.x); + t01 = Palette.Sample(PaletteSampler, a.y); + t10 = Palette.Sample(PaletteSampler, a.z); + t11 = Palette.Sample(PaletteSampler, a.w); + } else { t00 = Texture.Sample(TextureSampler, uv.xy); @@ -658,6 +692,42 @@ float4 sample(float2 tc, float w) t10 = tex1D(Palette, a.z); t11 = tex1D(Palette, a.w); } + else if(PS_BPP == 4) // 4HL + { + float4 a; + + a.x = tex2D(Texture, uv.xy).a; + a.y = tex2D(Texture, uv.zy).a; + a.z = tex2D(Texture, uv.xw).a; + a.w = tex2D(Texture, uv.zw).a; + + if(PS_RT == 1) a *= 0.5; + + a = fmod(a, 1.0f / 16); + + t00 = tex1D(Palette, a.x); + t01 = tex1D(Palette, a.y); + t10 = tex1D(Palette, a.z); + t11 = tex1D(Palette, a.w); + } + else if(PS_BPP == 5) // 4HH + { + float4 a; + + a.x = tex2D(Texture, uv.xy).a; + a.y = tex2D(Texture, uv.zy).a; + a.z = tex2D(Texture, uv.xw).a; + a.w = tex2D(Texture, uv.zw).a; + + if(PS_RT == 1) a *= 0.5; + + a = fmod(a * 16, 1.0f / 16); + + t00 = tex1D(Palette, a.x); + t01 = tex1D(Palette, a.y); + t10 = tex1D(Palette, a.z); + t11 = tex1D(Palette, a.w); + } else { t00 = tex2D(Texture, uv.xy); diff --git a/plugins/GSdx/xbyak/xbyak_util.h b/plugins/GSdx/xbyak/xbyak_util.h index 8eb2a8e952..da0ceb54f0 100644 --- a/plugins/GSdx/xbyak/xbyak_util.h +++ b/plugins/GSdx/xbyak/xbyak_util.h @@ -167,7 +167,7 @@ struct EnableSetEip : public Gen { Gen::call((void*)local::set_eip_to_esi); break; case Xbyak::Operand::EDI: - Gen::call((void*)local::set_eip_to_esi); + Gen::call((void*)local::set_eip_to_edi); break; case Xbyak::Operand::EBP: Gen::call((void*)local::set_eip_to_ebp); diff --git a/plugins/onepad/Linux/callbacks.c b/plugins/onepad/Linux/callbacks.c new file mode 100644 index 0000000000..6e4d979f59 --- /dev/null +++ b/plugins/onepad/Linux/callbacks.c @@ -0,0 +1,131 @@ +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include "callbacks.h" +#include "interface.h" +#include "support.h" + + +void +OnAbout_Ok (GtkDialog *dialog, + gint response_id, + gpointer user_data) +{ + +} + + +void +OnConf_Pad1 (GtkButton *button, + gpointer user_data) +{ + +} + + +void +OnConf_Pad2 (GtkButton *button, + gpointer user_data) +{ + +} + + +void +OnConf_Pad3 (GtkButton *button, + gpointer user_data) +{ + +} + + +void +OnConf_Pad4 (GtkButton *button, + gpointer user_data) +{ + +} + + +void +on_joydevicescombo_changed (GtkComboBox *combobox, + gpointer user_data) +{ + +} + + +void +OnConf_Key (GtkButton *button, + gpointer user_data) +{ + +} + + +void +on_checkbutton_reversery_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + +} + + +void +on_checkbutton_reverserx_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + +} + + +void +on_forcefeedback_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + +} + + +void +on_checkbutton_reverselx_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + +} + + +void +on_checkbutton_reversely_toggled (GtkToggleButton *togglebutton, + gpointer user_data) +{ + +} + + +void +OnConf_Ok (GtkButton *button, + gpointer user_data) +{ + +} + + +void +OnConf_Cancel (GtkButton *button, + gpointer user_data) +{ + +} + + +void +on_Remove (GtkButton *button, + gpointer user_data) +{ + +} + diff --git a/plugins/onepad/Linux/callbacks.h b/plugins/onepad/Linux/callbacks.h new file mode 100644 index 0000000000..1194f3ba9b --- /dev/null +++ b/plugins/onepad/Linux/callbacks.h @@ -0,0 +1,63 @@ +#include + + +void +OnAbout_Ok (GtkDialog *dialog, + gint response_id, + gpointer user_data); + +void +OnConf_Pad1 (GtkButton *button, + gpointer user_data); + +void +OnConf_Pad2 (GtkButton *button, + gpointer user_data); + +void +OnConf_Pad3 (GtkButton *button, + gpointer user_data); + +void +OnConf_Pad4 (GtkButton *button, + gpointer user_data); + +void +on_joydevicescombo_changed (GtkComboBox *combobox, + gpointer user_data); + +void +OnConf_Key (GtkButton *button, + gpointer user_data); + +void +on_checkbutton_reversery_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_checkbutton_reverserx_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_forcefeedback_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_checkbutton_reverselx_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +on_checkbutton_reversely_toggled (GtkToggleButton *togglebutton, + gpointer user_data); + +void +OnConf_Ok (GtkButton *button, + gpointer user_data); + +void +OnConf_Cancel (GtkButton *button, + gpointer user_data); + +void +on_Remove (GtkButton *button, + gpointer user_data); diff --git a/plugins/onepad/Linux/gui.cpp b/plugins/onepad/Linux/gui.cpp new file mode 100644 index 0000000000..769f493f79 --- /dev/null +++ b/plugins/onepad/Linux/gui.cpp @@ -0,0 +1,442 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + #include +#include +#include + +#include "joystick.h" + +#include "onepad.h" +#include "linux.h" + +extern "C" +{ +#include "interface.h" +#include "support.h" +#include "callbacks.h" +} + +extern string s_strIniPath; +GtkWidget *Conf, *About, *MsgDlg; +GtkWidget *s_devicecombo; + +GtkTreeStore *treestore; +GtkTreeModel *model; + +bool has_columns = false; + +extern string KeyName(int pad, int key); +extern const char* s_pGuiKeyMap[]; +extern void UpdateConf(int pad); + +enum +{ + COL_PAD = 0, + COL_BUTTON, + COL_KEY, + COL_VALUE, + NUM_COLS +}; + + +void populate_tree_view() +{ + GtkTreeIter toplevel; + + gtk_tree_store_clear(treestore); + + for (int pad = 0; pad < 2 * PADSUBKEYS; pad++) + { + for (int key = 0; key < PADKEYS; key++) + { + if (get_key(pad, key) != 0) + { + gtk_tree_store_append(treestore, &toplevel, NULL); + gtk_tree_store_set(treestore, &toplevel, + COL_PAD, pad, + COL_BUTTON, s_pGuiKeyMap[key], + COL_KEY, KeyName(pad, key).c_str(), + COL_VALUE, key, + -1); + } + } + } +} + +void create_a_column(GtkWidget *view, const char *name, int num, bool visible) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *col; + + col = gtk_tree_view_column_new(); + gtk_tree_view_column_set_title(col, name); + + /* pack tree view column into tree view */ + gtk_tree_view_append_column(GTK_TREE_VIEW(view), col); + + renderer = gtk_cell_renderer_text_new(); + + /* pack cell renderer into tree view column */ + gtk_tree_view_column_pack_start(col, renderer, TRUE); + + /* connect 'text' property of the cell renderer to + * model column that contains the first name */ + gtk_tree_view_column_add_attribute(col, renderer, "text", num); + gtk_tree_view_column_set_visible(col, visible); +} + +void create_columns(GtkWidget *view) +{ + GtkCellRenderer *renderer; + GtkTreeViewColumn *col; + + if (!has_columns) + { + create_a_column(view, "Pad #", COL_PAD, true); + create_a_column(view, "Pad Button", COL_BUTTON, true); + create_a_column(view, "Key Value", COL_KEY, true); + create_a_column(view, "Internal", COL_VALUE, false); + has_columns = true; + } +} + +void init_tree_view() +{ + GtkWidget *view; + + view = lookup_widget(Conf,"padtreeview"); + + treestore = gtk_tree_store_new(NUM_COLS, + G_TYPE_UINT, + G_TYPE_STRING, + G_TYPE_STRING, + G_TYPE_UINT); + + populate_tree_view(); + create_columns(view); + + model = GTK_TREE_MODEL(treestore); + + gtk_tree_view_set_model(GTK_TREE_VIEW(view), model); + + g_object_unref(model); /* destroy model automatically with view */ + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(view)), + GTK_SELECTION_SINGLE); + +} + +void destroy_tree_view() +{ + has_columns = false; + //g_object_unref(treestore); +} + +/*void add_tree_row(int pad, int key) +{ + GtkTreeIter toplevel; + + gtk_tree_store_append(treestore, &toplevel, NULL); + gtk_tree_store_set(treestore, &toplevel, + COL_PAD, pad, + COL_BUTTON, s_pGuiKeyMap[key], + COL_KEY, KeyName(pad, key).c_str(), + COL_VALUE, key, + -1); +} + +void delete_tree_row() +{ +}*/ + +void SaveConfig() +{ + FILE *f; + char cfg[255]; + + strcpy(cfg, s_strIniPath.c_str()); + f = fopen(cfg, "w"); + if (f == NULL) + { + printf("ZeroPAD: failed to save ini %s\n", s_strIniPath.c_str()); + return; + } + + for (int pad = 0; pad < 2 * PADSUBKEYS; pad++) + { + for (int key = 0; key < PADKEYS; key++) + { + fprintf(f, "[%d][%d] = 0x%lx\n", pad, key, get_key(pad,key)); + } + } + fprintf(f, "log = %d\n", conf.log); + fprintf(f, "options = %d\n", conf.options); + fclose(f); +} + +void LoadConfig() +{ + FILE *f; + char str[256]; + char cfg[255]; + + memset(&conf, 0, sizeof(conf)); + set_key(0, PAD_L2, XK_a); + set_key(0, PAD_R2, XK_semicolon); + set_key(0, PAD_L1, XK_w); + set_key(0, PAD_R1, XK_p); + set_key(0, PAD_TRIANGLE, XK_i); + set_key(0, PAD_CIRCLE, XK_l); + set_key(0, PAD_CROSS, XK_k); + set_key(0, PAD_SQUARE, XK_j); + set_key(0, PAD_SELECT, XK_v); + set_key(0, PAD_START, XK_n); + set_key(0, PAD_UP, XK_e); + set_key(0, PAD_RIGHT, XK_f); + set_key(0, PAD_DOWN, XK_d); + set_key(0, PAD_LEFT, XK_s); + conf.log = 0; + + strcpy(cfg, s_strIniPath.c_str()); + f = fopen(cfg, "r"); + if (f == NULL) + { + printf("OnePAD: failed to load ini %s\n", s_strIniPath.c_str()); + SaveConfig(); //save and return + return; + } + + for (int pad = 0; pad < 2 * PADSUBKEYS; pad++) + { + for (int key = 0; key < PADKEYS; key++) + { + sprintf(str, "[%d][%d] = 0x%%x\n", pad, key); + u32 temp; + + if (fscanf(f, str, &temp) == 0) temp = 0; + set_key(pad, key, temp); + } + } + fscanf(f, "log = %d\n", &conf.log); + fscanf(f, "options = %d\n", &conf.options); + fclose(f); +} + +void OnMsg_Ok() +{ + gtk_widget_destroy(MsgDlg); + gtk_main_quit(); +} + +// GUI event handlers +void on_joydevicescombo_changed(GtkComboBox *combobox, gpointer user_data) +{ + int joyid = gtk_combo_box_get_active(combobox); + + // unassign every joystick with this pad + for (int i = 0; i < (int)s_vjoysticks.size(); ++i) + { + if (s_vjoysticks[i]->GetPAD() == s_selectedpad) s_vjoysticks[i]->Assign(-1); + } + + if (joyid >= 0 && joyid < (int)s_vjoysticks.size()) s_vjoysticks[joyid]->Assign(s_selectedpad); +} + +void on_checkbutton_reverselx_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + int mask = PADOPTION_REVERTLX << (16 * s_selectedpad); + + if (gtk_toggle_button_get_active(togglebutton)) + conf.options |= mask; + else + conf.options &= ~mask; +} + +void on_checkbutton_reversely_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + int mask = PADOPTION_REVERTLY << (16 * s_selectedpad); + + if (gtk_toggle_button_get_active(togglebutton)) + conf.options |= mask; + else + conf.options &= ~mask; +} + +void on_checkbutton_reverserx_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + int mask = PADOPTION_REVERTRX << (16 * s_selectedpad); + if (gtk_toggle_button_get_active(togglebutton)) + conf.options |= mask; + else + conf.options &= ~mask; +} + +void on_checkbutton_reversery_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + int mask = PADOPTION_REVERTRY << (16 * s_selectedpad); + + if (gtk_toggle_button_get_active(togglebutton)) + conf.options |= mask; + else + conf.options &= ~mask; +} + +void on_forcefeedback_toggled(GtkToggleButton *togglebutton, gpointer user_data) +{ + int mask = PADOPTION_REVERTLX << (16 * s_selectedpad); + + if (gtk_toggle_button_get_active(togglebutton)) + { + conf.options |= mask; + + int joyid = gtk_combo_box_get_active(GTK_COMBO_BOX(s_devicecombo)); + + if (joyid >= 0 && joyid < (int)s_vjoysticks.size()) s_vjoysticks[joyid]->TestForce(); + } + else + { + conf.options &= ~mask; + } +} + +void SysMessage(char *fmt, ...) +{ + GtkWidget *Ok, *Txt; + GtkWidget *Box, *Box1; + va_list list; + char msg[512]; + + va_start(list, fmt); + vsprintf(msg, fmt, list); + va_end(list); + + if (msg[strlen(msg)-1] == '\n') msg[strlen(msg)-1] = 0; + + MsgDlg = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_position(GTK_WINDOW(MsgDlg), GTK_WIN_POS_CENTER); + gtk_window_set_title(GTK_WINDOW(MsgDlg), "ZeroPad"); + gtk_container_set_border_width(GTK_CONTAINER(MsgDlg), 5); + + Box = gtk_vbox_new(5, 0); + gtk_container_add(GTK_CONTAINER(MsgDlg), Box); + gtk_widget_show(Box); + + Txt = gtk_label_new(msg); + + gtk_box_pack_start(GTK_BOX(Box), Txt, FALSE, FALSE, 5); + gtk_widget_show(Txt); + + Box1 = gtk_hbutton_box_new(); + gtk_box_pack_start(GTK_BOX(Box), Box1, FALSE, FALSE, 0); + gtk_widget_show(Box1); + + Ok = gtk_button_new_with_label("Ok"); + gtk_signal_connect(GTK_OBJECT(Ok), "clicked", GTK_SIGNAL_FUNC(OnMsg_Ok), NULL); + gtk_container_add(GTK_CONTAINER(Box1), Ok); + GTK_WIDGET_SET_FLAGS(Ok, GTK_CAN_DEFAULT); + gtk_widget_show(Ok); + + gtk_widget_show(MsgDlg); + + gtk_main(); +} + +void on_Remove(GtkButton *button, gpointer user_data) +{ + GtkTreeSelection *selection; + GtkTreeIter iter; + GtkWidget *view; + + view = lookup_widget(Conf,"padtreeview"); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); + if (gtk_tree_selection_get_selected(selection, &model, &iter)) + { + int pad; + int key; + + gtk_tree_model_get(model, &iter, COL_PAD, &pad, COL_VALUE, &key,-1); + set_key(pad, key, 0); + init_tree_view(); + } + else + { + // Not selected. + } +} + +void OnConf_Pad1(GtkButton *button, gpointer user_data) +{ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) UpdateConf(0); +} + +void OnConf_Pad2(GtkButton *button, gpointer user_data) +{ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) UpdateConf(1); +} + +void OnConf_Pad3(GtkButton *button, gpointer user_data) +{ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) UpdateConf(2); +} + +void OnConf_Pad4(GtkButton *button, gpointer user_data) +{ + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button))) UpdateConf(3); +} + +void OnConf_Ok(GtkButton *button, gpointer user_data) +{ +// conf.analog = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(Analog)); + SaveConfig(); + destroy_tree_view(); + gtk_widget_destroy(Conf); + + gtk_main_quit(); +} + +void OnConf_Cancel(GtkButton *button, gpointer user_data) +{ + gtk_widget_destroy(Conf); + gtk_main_quit(); + LoadConfig(); // load previous config +} + +void OnAbout_Ok(GtkDialog *About, gint response_id, gpointer user_data) +{ + gtk_widget_destroy(GTK_WIDGET(About)); + gtk_main_quit(); +} + +EXPORT_C_(void) PADabout() +{ + + About = create_About(); + + gtk_widget_show_all(About); + gtk_main(); +} + +EXPORT_C_(s32) PADtest() +{ + return 0; +} \ No newline at end of file diff --git a/plugins/onepad/Linux/interface.c b/plugins/onepad/Linux/interface.c new file mode 100644 index 0000000000..520bb9c60a --- /dev/null +++ b/plugins/onepad/Linux/interface.c @@ -0,0 +1,710 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include +#include + +#include "callbacks.h" +#include "interface.h" +#include "support.h" + +#define GLADE_HOOKUP_OBJECT(component,widget,name) \ + g_object_set_data_full (G_OBJECT (component), name, \ + gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref) + +#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \ + g_object_set_data (G_OBJECT (component), name, widget) + +GtkWidget* +create_About (void) +{ + GtkWidget *About; + const gchar *authors[] = { + "Author: arcum42(@gmail.com)", + "Forked from ZeroPad, by:", + "zerofrog(@gmail.com)", + "Thanks to:", + " linuzappz ", + "florin sasu ", + "and SSSPSXPad, TwinPad authors", + NULL + }; + /* TRANSLATORS: Replace this string with your names, one name per line. */ + gchar *translators = _("translator-credits"); + + About = gtk_about_dialog_new (); + gtk_widget_set_name (About, "About"); + gtk_container_set_border_width (GTK_CONTAINER (About), 5); + gtk_window_set_destroy_with_parent (GTK_WINDOW (About), TRUE); + gtk_about_dialog_set_version (GTK_ABOUT_DIALOG (About), VERSION); + gtk_about_dialog_set_name (GTK_ABOUT_DIALOG (About), _("OnePAD")); + gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (About), authors); + gtk_about_dialog_set_translator_credits (GTK_ABOUT_DIALOG (About), translators); + + g_signal_connect ((gpointer) About, "response", + G_CALLBACK (OnAbout_Ok), + NULL); + + /* Store pointers to all widgets, for use by lookup_widget(). */ + GLADE_HOOKUP_OBJECT_NO_REF (About, About, "About"); + + return About; +} + +GtkWidget* +create_Conf (void) +{ + GtkWidget *Conf; + GtkWidget *dialog_vbox1; + GtkWidget *vbox1; + GtkWidget *frame1; + GtkWidget *alignment1; + GtkWidget *hbox1; + GtkWidget *PAD1; + GSList *PAD1_group = NULL; + GtkWidget *PAD2; + GtkWidget *PAD3; + GtkWidget *PAD4; + GtkWidget *label2; + GtkWidget *vbox2; + GtkWidget *label5; + GtkWidget *joydevicescombo; + GtkWidget *fixed1; + GtkWidget *vbox3; + GtkWidget *hbox3; + GtkWidget *fixed2; + GtkWidget *fixed3; + GtkWidget *Left; + GtkWidget *Up; + GtkWidget *Right; + GtkWidget *Down; + GtkWidget *L2; + GtkWidget *L1; + GtkWidget *Select; + GtkWidget *Start; + GtkWidget *L3; + GtkWidget *R3; + GtkWidget *Analog; + GtkWidget *Square; + GtkWidget *Triangle; + GtkWidget *Circle; + GtkWidget *Cross; + GtkWidget *R2; + GtkWidget *R1; + GtkWidget *label3; + GtkWidget *label6; + GtkWidget *L_Up; + GtkWidget *L_Left; + GtkWidget *Lx; + GtkWidget *Ly; + GtkWidget *L_Down; + GtkWidget *L_Right; + GtkWidget *checkbutton_reverselx; + GtkWidget *checkbutton_reversely; + GtkWidget *R_Up; + GtkWidget *R_Left; + GtkWidget *Rx; + GtkWidget *Ry; + GtkWidget *R_Right; + GtkWidget *R_Down; + GtkWidget *forcefeedback; + GtkWidget *checkbutton_reverserx; + GtkWidget *checkbutton_reversery; + GtkWidget *frame2; + GtkWidget *alignment2; + GtkWidget *scrolledwindow2; + GtkWidget *padtreeview; + GtkWidget *label7; + GtkWidget *remove_button; + GtkWidget *dialog_action_area1; + GtkWidget *okbutton1; + GtkWidget *cancelbutton1; + + Conf = gtk_dialog_new (); + gtk_widget_set_name (Conf, "Conf"); + gtk_window_set_title (GTK_WINDOW (Conf), _("OnePAD Configuration Dialog")); + gtk_window_set_type_hint (GTK_WINDOW (Conf), GDK_WINDOW_TYPE_HINT_DIALOG); + + dialog_vbox1 = GTK_DIALOG (Conf)->vbox; + gtk_widget_set_name (dialog_vbox1, "dialog_vbox1"); + gtk_widget_show (dialog_vbox1); + + vbox1 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox1, "vbox1"); + gtk_widget_show (vbox1); + gtk_box_pack_start (GTK_BOX (dialog_vbox1), vbox1, TRUE, TRUE, 0); + + frame1 = gtk_frame_new (NULL); + gtk_widget_set_name (frame1, "frame1"); + gtk_widget_show (frame1); + gtk_box_pack_start (GTK_BOX (vbox1), frame1, FALSE, FALSE, 0); + + alignment1 = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_set_name (alignment1, "alignment1"); + gtk_widget_show (alignment1); + gtk_container_add (GTK_CONTAINER (frame1), alignment1); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment1), 0, 0, 12, 0); + + hbox1 = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (hbox1, "hbox1"); + gtk_widget_show (hbox1); + gtk_container_add (GTK_CONTAINER (alignment1), hbox1); + + PAD1 = gtk_radio_button_new_with_mnemonic (NULL, _("PAD1")); + gtk_widget_set_name (PAD1, "PAD1"); + gtk_widget_show (PAD1); + gtk_box_pack_start (GTK_BOX (hbox1), PAD1, FALSE, FALSE, 0); + gtk_radio_button_set_group (GTK_RADIO_BUTTON (PAD1), PAD1_group); + PAD1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (PAD1)); + gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (PAD1), TRUE); + + PAD2 = gtk_radio_button_new_with_mnemonic (NULL, _("PAD2")); + gtk_widget_set_name (PAD2, "PAD2"); + gtk_widget_show (PAD2); + gtk_box_pack_start (GTK_BOX (hbox1), PAD2, FALSE, FALSE, 0); + gtk_radio_button_set_group (GTK_RADIO_BUTTON (PAD2), PAD1_group); + PAD1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (PAD2)); + + PAD3 = gtk_radio_button_new_with_mnemonic (NULL, _("PAD1 alt.")); + gtk_widget_set_name (PAD3, "PAD3"); + gtk_widget_show (PAD3); + gtk_box_pack_start (GTK_BOX (hbox1), PAD3, FALSE, FALSE, 0); + gtk_radio_button_set_group (GTK_RADIO_BUTTON (PAD3), PAD1_group); + PAD1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (PAD3)); + + PAD4 = gtk_radio_button_new_with_mnemonic (NULL, _("PAD2 alt.")); + gtk_widget_set_name (PAD4, "PAD4"); + gtk_widget_show (PAD4); + gtk_box_pack_start (GTK_BOX (hbox1), PAD4, FALSE, FALSE, 0); + gtk_radio_button_set_group (GTK_RADIO_BUTTON (PAD4), PAD1_group); + PAD1_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (PAD4)); + + label2 = gtk_label_new (_("Choose PAD to modify")); + gtk_widget_set_name (label2, "label2"); + gtk_widget_show (label2); + gtk_frame_set_label_widget (GTK_FRAME (frame1), label2); + gtk_label_set_use_markup (GTK_LABEL (label2), TRUE); + + vbox2 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox2, "vbox2"); + gtk_widget_show (vbox2); + gtk_box_pack_start (GTK_BOX (vbox1), vbox2, FALSE, TRUE, 0); + + label5 = gtk_label_new (_("Joystick to use for this PAD")); + gtk_widget_set_name (label5, "label5"); + gtk_widget_show (label5); + gtk_box_pack_start (GTK_BOX (vbox2), label5, FALSE, FALSE, 0); + + joydevicescombo = gtk_combo_box_entry_new_text (); + gtk_widget_set_name (joydevicescombo, "joydevicescombo"); + gtk_widget_show (joydevicescombo); + gtk_box_pack_start (GTK_BOX (vbox2), joydevicescombo, FALSE, TRUE, 0); + + fixed1 = gtk_fixed_new (); + gtk_widget_set_name (fixed1, "fixed1"); + gtk_widget_show (fixed1); + gtk_box_pack_start (GTK_BOX (vbox1), fixed1, TRUE, TRUE, 0); + + vbox3 = gtk_vbox_new (FALSE, 0); + gtk_widget_set_name (vbox3, "vbox3"); + gtk_widget_show (vbox3); + gtk_fixed_put (GTK_FIXED (fixed1), vbox3, 0, 0); + gtk_widget_set_size_request (vbox3, 0, 0); + + hbox3 = gtk_hbox_new (FALSE, 0); + gtk_widget_set_name (hbox3, "hbox3"); + gtk_widget_show (hbox3); + gtk_box_pack_start (GTK_BOX (vbox3), hbox3, FALSE, FALSE, 0); + + fixed2 = gtk_fixed_new (); + gtk_widget_set_name (fixed2, "fixed2"); + gtk_widget_show (fixed2); + gtk_box_pack_start (GTK_BOX (hbox3), fixed2, FALSE, FALSE, 0); + + fixed3 = gtk_fixed_new (); + gtk_widget_set_name (fixed3, "fixed3"); + gtk_widget_show (fixed3); + gtk_box_pack_start (GTK_BOX (hbox3), fixed3, FALSE, FALSE, 0); + + Left = gtk_button_new_with_mnemonic (_("Left")); + gtk_widget_set_name (Left, "Left"); + gtk_widget_show (Left); + gtk_fixed_put (GTK_FIXED (fixed1), Left, 320, 104); + gtk_widget_set_size_request (Left, 64, 24); + + Up = gtk_button_new_with_mnemonic (_("Up")); + gtk_widget_set_name (Up, "Up"); + gtk_widget_show (Up); + gtk_fixed_put (GTK_FIXED (fixed1), Up, 384, 80); + gtk_widget_set_size_request (Up, 64, 24); + + Right = gtk_button_new_with_mnemonic (_("Right")); + gtk_widget_set_name (Right, "Right"); + gtk_widget_show (Right); + gtk_fixed_put (GTK_FIXED (fixed1), Right, 448, 104); + gtk_widget_set_size_request (Right, 64, 24); + + Down = gtk_button_new_with_mnemonic (_("Down")); + gtk_widget_set_name (Down, "Down"); + gtk_widget_show (Down); + gtk_fixed_put (GTK_FIXED (fixed1), Down, 384, 128); + gtk_widget_set_size_request (Down, 64, 24); + + L2 = gtk_button_new_with_mnemonic (_("L2")); + gtk_widget_set_name (L2, "L2"); + gtk_widget_show (L2); + gtk_fixed_put (GTK_FIXED (fixed1), L2, 384, 8); + gtk_widget_set_size_request (L2, 64, 24); + + L1 = gtk_button_new_with_mnemonic (_("L1")); + gtk_widget_set_name (L1, "L1"); + gtk_widget_show (L1); + gtk_fixed_put (GTK_FIXED (fixed1), L1, 384, 32); + gtk_widget_set_size_request (L1, 64, 24); + + Select = gtk_button_new_with_mnemonic (_("Select")); + gtk_widget_set_name (Select, "Select"); + gtk_widget_show (Select); + gtk_fixed_put (GTK_FIXED (fixed1), Select, 520, 48); + gtk_widget_set_size_request (Select, 64, 24); + + Start = gtk_button_new_with_mnemonic (_("Start")); + gtk_widget_set_name (Start, "Start"); + gtk_widget_show (Start); + gtk_fixed_put (GTK_FIXED (fixed1), Start, 592, 48); + gtk_widget_set_size_request (Start, 64, 24); + + L3 = gtk_button_new_with_mnemonic (_("L3")); + gtk_widget_set_name (L3, "L3"); + gtk_widget_show (L3); + gtk_fixed_put (GTK_FIXED (fixed1), L3, 520, 8); + gtk_widget_set_size_request (L3, 64, 24); + + R3 = gtk_button_new_with_mnemonic (_("R3")); + gtk_widget_set_name (R3, "R3"); + gtk_widget_show (R3); + gtk_fixed_put (GTK_FIXED (fixed1), R3, 592, 8); + gtk_widget_set_size_request (R3, 64, 24); + + Analog = gtk_button_new_with_mnemonic (_("Analog")); + gtk_widget_set_name (Analog, "Analog"); + gtk_widget_show (Analog); + gtk_fixed_put (GTK_FIXED (fixed1), Analog, 552, 104); + gtk_widget_set_size_request (Analog, 64, 24); + + Square = gtk_button_new_with_mnemonic (_("Square")); + gtk_widget_set_name (Square, "Square"); + gtk_widget_show (Square); + gtk_fixed_put (GTK_FIXED (fixed1), Square, 648, 104); + gtk_widget_set_size_request (Square, 64, 24); + + Triangle = gtk_button_new_with_mnemonic (_("Triangle")); + gtk_widget_set_name (Triangle, "Triangle"); + gtk_widget_show (Triangle); + gtk_fixed_put (GTK_FIXED (fixed1), Triangle, 712, 80); + gtk_widget_set_size_request (Triangle, 64, 24); + + Circle = gtk_button_new_with_mnemonic (_("Circle")); + gtk_widget_set_name (Circle, "Circle"); + gtk_widget_show (Circle); + gtk_fixed_put (GTK_FIXED (fixed1), Circle, 776, 104); + gtk_widget_set_size_request (Circle, 64, 24); + + Cross = gtk_button_new_with_mnemonic (_("Cross")); + gtk_widget_set_name (Cross, "Cross"); + gtk_widget_show (Cross); + gtk_fixed_put (GTK_FIXED (fixed1), Cross, 712, 128); + gtk_widget_set_size_request (Cross, 64, 24); + + R2 = gtk_button_new_with_mnemonic (_("R2")); + gtk_widget_set_name (R2, "R2"); + gtk_widget_show (R2); + gtk_fixed_put (GTK_FIXED (fixed1), R2, 712, 8); + gtk_widget_set_size_request (R2, 64, 24); + + R1 = gtk_button_new_with_mnemonic (_("R1")); + gtk_widget_set_name (R1, "R1"); + gtk_widget_show (R1); + gtk_fixed_put (GTK_FIXED (fixed1), R1, 712, 32); + gtk_widget_set_size_request (R1, 64, 24); + + label3 = gtk_label_new (_("Analog Controls (move mouse or analog joystick to select)")); + gtk_widget_set_name (label3, "label3"); + gtk_widget_show (label3); + gtk_fixed_put (GTK_FIXED (fixed1), label3, 384, 168); + gtk_widget_set_size_request (label3, 400, 24); + gtk_label_set_line_wrap (GTK_LABEL (label3), TRUE); + gtk_label_set_single_line_mode (GTK_LABEL (label3), TRUE); + + label6 = gtk_label_new (_("(Note: The analog key controls and joystick controls do not work well together currently, and should not be mixed. )")); + gtk_widget_set_name (label6, "label6"); + gtk_widget_show (label6); + gtk_fixed_put (GTK_FIXED (fixed1), label6, 352, 192); + gtk_widget_set_size_request (label6, 448, 40); + gtk_label_set_justify (GTK_LABEL (label6), GTK_JUSTIFY_CENTER); + gtk_label_set_line_wrap (GTK_LABEL (label6), TRUE); + + L_Up = gtk_button_new_with_mnemonic (_("Up")); + gtk_widget_set_name (L_Up, "L_Up"); + gtk_widget_show (L_Up); + gtk_fixed_put (GTK_FIXED (fixed1), L_Up, 384, 240); + gtk_widget_set_size_request (L_Up, 64, 24); + + L_Left = gtk_button_new_with_mnemonic (_("Left")); + gtk_widget_set_name (L_Left, "L_Left"); + gtk_widget_show (L_Left); + gtk_fixed_put (GTK_FIXED (fixed1), L_Left, 320, 272); + gtk_widget_set_size_request (L_Left, 64, 24); + + Lx = gtk_button_new_with_mnemonic (_("Lx")); + gtk_widget_set_name (Lx, "Lx"); + gtk_widget_show (Lx); + gtk_fixed_put (GTK_FIXED (fixed1), Lx, 384, 264); + gtk_widget_set_size_request (Lx, 64, 24); + + Ly = gtk_button_new_with_mnemonic (_("Ly")); + gtk_widget_set_name (Ly, "Ly"); + gtk_widget_show (Ly); + gtk_fixed_put (GTK_FIXED (fixed1), Ly, 384, 288); + gtk_widget_set_size_request (Ly, 64, 24); + + L_Down = gtk_button_new_with_mnemonic (_("Down")); + gtk_widget_set_name (L_Down, "L_Down"); + gtk_widget_show (L_Down); + gtk_fixed_put (GTK_FIXED (fixed1), L_Down, 384, 312); + gtk_widget_set_size_request (L_Down, 64, 24); + + L_Right = gtk_button_new_with_mnemonic (_("Right")); + gtk_widget_set_name (L_Right, "L_Right"); + gtk_widget_show (L_Right); + gtk_fixed_put (GTK_FIXED (fixed1), L_Right, 448, 272); + gtk_widget_set_size_request (L_Right, 64, 24); + + checkbutton_reverselx = gtk_check_button_new_with_mnemonic (_("Reverse LX")); + gtk_widget_set_name (checkbutton_reverselx, "checkbutton_reverselx"); + gtk_widget_show (checkbutton_reverselx); + gtk_fixed_put (GTK_FIXED (fixed1), checkbutton_reverselx, 360, 344); + gtk_widget_set_size_request (checkbutton_reverselx, 111, 22); + + checkbutton_reversely = gtk_check_button_new_with_mnemonic (_("Reverse LY")); + gtk_widget_set_name (checkbutton_reversely, "checkbutton_reversely"); + gtk_widget_show (checkbutton_reversely); + gtk_fixed_put (GTK_FIXED (fixed1), checkbutton_reversely, 360, 368); + gtk_widget_set_size_request (checkbutton_reversely, 111, 22); + + R_Up = gtk_button_new_with_mnemonic (_("Up")); + gtk_widget_set_name (R_Up, "R_Up"); + gtk_widget_show (R_Up); + gtk_fixed_put (GTK_FIXED (fixed1), R_Up, 712, 240); + gtk_widget_set_size_request (R_Up, 64, 24); + + R_Left = gtk_button_new_with_mnemonic (_("Left")); + gtk_widget_set_name (R_Left, "R_Left"); + gtk_widget_show (R_Left); + gtk_fixed_put (GTK_FIXED (fixed1), R_Left, 648, 272); + gtk_widget_set_size_request (R_Left, 64, 24); + + Rx = gtk_button_new_with_mnemonic (_("Rx")); + gtk_widget_set_name (Rx, "Rx"); + gtk_widget_show (Rx); + gtk_fixed_put (GTK_FIXED (fixed1), Rx, 712, 264); + gtk_widget_set_size_request (Rx, 64, 24); + + Ry = gtk_button_new_with_mnemonic (_("Ry")); + gtk_widget_set_name (Ry, "Ry"); + gtk_widget_show (Ry); + gtk_fixed_put (GTK_FIXED (fixed1), Ry, 712, 288); + gtk_widget_set_size_request (Ry, 64, 24); + + R_Right = gtk_button_new_with_mnemonic (_("Right")); + gtk_widget_set_name (R_Right, "R_Right"); + gtk_widget_show (R_Right); + gtk_fixed_put (GTK_FIXED (fixed1), R_Right, 776, 272); + gtk_widget_set_size_request (R_Right, 64, 24); + + R_Down = gtk_button_new_with_mnemonic (_("Down")); + gtk_widget_set_name (R_Down, "R_Down"); + gtk_widget_show (R_Down); + gtk_fixed_put (GTK_FIXED (fixed1), R_Down, 712, 312); + gtk_widget_set_size_request (R_Down, 64, 24); + + forcefeedback = gtk_check_button_new_with_mnemonic (_("Enable Force\nFeedback")); + gtk_widget_set_name (forcefeedback, "forcefeedback"); + gtk_widget_show (forcefeedback); + gtk_fixed_put (GTK_FIXED (fixed1), forcefeedback, 528, 344); + gtk_widget_set_size_request (forcefeedback, 112, 48); + + checkbutton_reverserx = gtk_check_button_new_with_mnemonic (_("Reverse RX")); + gtk_widget_set_name (checkbutton_reverserx, "checkbutton_reverserx"); + gtk_widget_show (checkbutton_reverserx); + gtk_fixed_put (GTK_FIXED (fixed1), checkbutton_reverserx, 688, 344); + gtk_widget_set_size_request (checkbutton_reverserx, 111, 22); + + checkbutton_reversery = gtk_check_button_new_with_mnemonic (_("Reverse RY")); + gtk_widget_set_name (checkbutton_reversery, "checkbutton_reversery"); + gtk_widget_show (checkbutton_reversery); + gtk_fixed_put (GTK_FIXED (fixed1), checkbutton_reversery, 688, 368); + gtk_widget_set_size_request (checkbutton_reversery, 111, 22); + + frame2 = gtk_frame_new (NULL); + gtk_widget_set_name (frame2, "frame2"); + gtk_widget_show (frame2); + gtk_fixed_put (GTK_FIXED (fixed1), frame2, 0, 8); + gtk_widget_set_size_request (frame2, 312, 336); + + alignment2 = gtk_alignment_new (0.5, 0.5, 1, 1); + gtk_widget_set_name (alignment2, "alignment2"); + gtk_widget_show (alignment2); + gtk_container_add (GTK_CONTAINER (frame2), alignment2); + gtk_alignment_set_padding (GTK_ALIGNMENT (alignment2), 0, 0, 12, 0); + + scrolledwindow2 = gtk_scrolled_window_new (NULL, NULL); + gtk_widget_set_name (scrolledwindow2, "scrolledwindow2"); + gtk_widget_show (scrolledwindow2); + gtk_container_add (GTK_CONTAINER (alignment2), scrolledwindow2); + gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolledwindow2), GTK_SHADOW_IN); + + padtreeview = gtk_tree_view_new (); + gtk_widget_set_name (padtreeview, "padtreeview"); + gtk_widget_show (padtreeview); + gtk_container_add (GTK_CONTAINER (scrolledwindow2), padtreeview); + gtk_widget_set_extension_events (padtreeview, GDK_EXTENSION_EVENTS_ALL); + gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (padtreeview), TRUE); + gtk_tree_view_set_enable_search (GTK_TREE_VIEW (padtreeview), FALSE); + gtk_tree_view_set_hover_expand (GTK_TREE_VIEW (padtreeview), TRUE); + + label7 = gtk_label_new (_("Key Settings")); + gtk_widget_set_name (label7, "label7"); + gtk_widget_show (label7); + gtk_frame_set_label_widget (GTK_FRAME (frame2), label7); + + remove_button = gtk_button_new_with_mnemonic (_("Remove")); + gtk_widget_set_name (remove_button, "remove_button"); + gtk_widget_show (remove_button); + gtk_fixed_put (GTK_FIXED (fixed1), remove_button, 248, 352); + gtk_widget_set_size_request (remove_button, 0, 0); + + dialog_action_area1 = GTK_DIALOG (Conf)->action_area; + gtk_widget_set_name (dialog_action_area1, "dialog_action_area1"); + gtk_widget_show (dialog_action_area1); + gtk_button_box_set_layout (GTK_BUTTON_BOX (dialog_action_area1), GTK_BUTTONBOX_END); + + okbutton1 = gtk_button_new_from_stock ("gtk-ok"); + gtk_widget_set_name (okbutton1, "okbutton1"); + gtk_widget_show (okbutton1); + gtk_dialog_add_action_widget (GTK_DIALOG (Conf), okbutton1, GTK_RESPONSE_OK); + GTK_WIDGET_SET_FLAGS (okbutton1, GTK_CAN_DEFAULT); + + cancelbutton1 = gtk_button_new_from_stock ("gtk-cancel"); + gtk_widget_set_name (cancelbutton1, "cancelbutton1"); + gtk_widget_show (cancelbutton1); + gtk_dialog_add_action_widget (GTK_DIALOG (Conf), cancelbutton1, GTK_RESPONSE_CANCEL); + GTK_WIDGET_SET_FLAGS (cancelbutton1, GTK_CAN_DEFAULT); + + g_signal_connect ((gpointer) PAD1, "clicked", + G_CALLBACK (OnConf_Pad1), + NULL); + g_signal_connect ((gpointer) PAD2, "clicked", + G_CALLBACK (OnConf_Pad2), + NULL); + g_signal_connect ((gpointer) PAD3, "clicked", + G_CALLBACK (OnConf_Pad3), + NULL); + g_signal_connect ((gpointer) PAD4, "clicked", + G_CALLBACK (OnConf_Pad4), + NULL); + g_signal_connect ((gpointer) joydevicescombo, "changed", + G_CALLBACK (on_joydevicescombo_changed), + NULL); + g_signal_connect ((gpointer) Left, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Up, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Right, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Down, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L2, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L1, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Select, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Start, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L3, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) R3, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Analog, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Square, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Triangle, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Circle, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Cross, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) R2, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) R1, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L_Up, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L_Left, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Lx, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Ly, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L_Down, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) L_Right, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) checkbutton_reverselx, "toggled", + G_CALLBACK (on_checkbutton_reverselx_toggled), + NULL); + g_signal_connect ((gpointer) checkbutton_reversely, "toggled", + G_CALLBACK (on_checkbutton_reversely_toggled), + NULL); + g_signal_connect ((gpointer) R_Up, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) R_Left, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Rx, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) Ry, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) R_Right, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) R_Down, "clicked", + G_CALLBACK (OnConf_Key), + NULL); + g_signal_connect ((gpointer) forcefeedback, "toggled", + G_CALLBACK (on_forcefeedback_toggled), + NULL); + g_signal_connect ((gpointer) checkbutton_reverserx, "toggled", + G_CALLBACK (on_checkbutton_reverserx_toggled), + NULL); + g_signal_connect ((gpointer) checkbutton_reversery, "toggled", + G_CALLBACK (on_checkbutton_reversery_toggled), + NULL); + g_signal_connect ((gpointer) remove_button, "clicked", + G_CALLBACK (on_Remove), + NULL); + g_signal_connect ((gpointer) okbutton1, "clicked", + G_CALLBACK (OnConf_Ok), + NULL); + g_signal_connect ((gpointer) cancelbutton1, "clicked", + G_CALLBACK (OnConf_Cancel), + NULL); + + /* Store pointers to all widgets, for use by lookup_widget(). */ + GLADE_HOOKUP_OBJECT_NO_REF (Conf, Conf, "Conf"); + GLADE_HOOKUP_OBJECT_NO_REF (Conf, dialog_vbox1, "dialog_vbox1"); + GLADE_HOOKUP_OBJECT (Conf, vbox1, "vbox1"); + GLADE_HOOKUP_OBJECT (Conf, frame1, "frame1"); + GLADE_HOOKUP_OBJECT (Conf, alignment1, "alignment1"); + GLADE_HOOKUP_OBJECT (Conf, hbox1, "hbox1"); + GLADE_HOOKUP_OBJECT (Conf, PAD1, "PAD1"); + GLADE_HOOKUP_OBJECT (Conf, PAD2, "PAD2"); + GLADE_HOOKUP_OBJECT (Conf, PAD3, "PAD3"); + GLADE_HOOKUP_OBJECT (Conf, PAD4, "PAD4"); + GLADE_HOOKUP_OBJECT (Conf, label2, "label2"); + GLADE_HOOKUP_OBJECT (Conf, vbox2, "vbox2"); + GLADE_HOOKUP_OBJECT (Conf, label5, "label5"); + GLADE_HOOKUP_OBJECT (Conf, joydevicescombo, "joydevicescombo"); + GLADE_HOOKUP_OBJECT (Conf, fixed1, "fixed1"); + GLADE_HOOKUP_OBJECT (Conf, vbox3, "vbox3"); + GLADE_HOOKUP_OBJECT (Conf, hbox3, "hbox3"); + GLADE_HOOKUP_OBJECT (Conf, fixed2, "fixed2"); + GLADE_HOOKUP_OBJECT (Conf, fixed3, "fixed3"); + GLADE_HOOKUP_OBJECT (Conf, Left, "Left"); + GLADE_HOOKUP_OBJECT (Conf, Up, "Up"); + GLADE_HOOKUP_OBJECT (Conf, Right, "Right"); + GLADE_HOOKUP_OBJECT (Conf, Down, "Down"); + GLADE_HOOKUP_OBJECT (Conf, L2, "L2"); + GLADE_HOOKUP_OBJECT (Conf, L1, "L1"); + GLADE_HOOKUP_OBJECT (Conf, Select, "Select"); + GLADE_HOOKUP_OBJECT (Conf, Start, "Start"); + GLADE_HOOKUP_OBJECT (Conf, L3, "L3"); + GLADE_HOOKUP_OBJECT (Conf, R3, "R3"); + GLADE_HOOKUP_OBJECT (Conf, Analog, "Analog"); + GLADE_HOOKUP_OBJECT (Conf, Square, "Square"); + GLADE_HOOKUP_OBJECT (Conf, Triangle, "Triangle"); + GLADE_HOOKUP_OBJECT (Conf, Circle, "Circle"); + GLADE_HOOKUP_OBJECT (Conf, Cross, "Cross"); + GLADE_HOOKUP_OBJECT (Conf, R2, "R2"); + GLADE_HOOKUP_OBJECT (Conf, R1, "R1"); + GLADE_HOOKUP_OBJECT (Conf, label3, "label3"); + GLADE_HOOKUP_OBJECT (Conf, label6, "label6"); + GLADE_HOOKUP_OBJECT (Conf, L_Up, "L_Up"); + GLADE_HOOKUP_OBJECT (Conf, L_Left, "L_Left"); + GLADE_HOOKUP_OBJECT (Conf, Lx, "Lx"); + GLADE_HOOKUP_OBJECT (Conf, Ly, "Ly"); + GLADE_HOOKUP_OBJECT (Conf, L_Down, "L_Down"); + GLADE_HOOKUP_OBJECT (Conf, L_Right, "L_Right"); + GLADE_HOOKUP_OBJECT (Conf, checkbutton_reverselx, "checkbutton_reverselx"); + GLADE_HOOKUP_OBJECT (Conf, checkbutton_reversely, "checkbutton_reversely"); + GLADE_HOOKUP_OBJECT (Conf, R_Up, "R_Up"); + GLADE_HOOKUP_OBJECT (Conf, R_Left, "R_Left"); + GLADE_HOOKUP_OBJECT (Conf, Rx, "Rx"); + GLADE_HOOKUP_OBJECT (Conf, Ry, "Ry"); + GLADE_HOOKUP_OBJECT (Conf, R_Right, "R_Right"); + GLADE_HOOKUP_OBJECT (Conf, R_Down, "R_Down"); + GLADE_HOOKUP_OBJECT (Conf, forcefeedback, "forcefeedback"); + GLADE_HOOKUP_OBJECT (Conf, checkbutton_reverserx, "checkbutton_reverserx"); + GLADE_HOOKUP_OBJECT (Conf, checkbutton_reversery, "checkbutton_reversery"); + GLADE_HOOKUP_OBJECT (Conf, frame2, "frame2"); + GLADE_HOOKUP_OBJECT (Conf, alignment2, "alignment2"); + GLADE_HOOKUP_OBJECT (Conf, scrolledwindow2, "scrolledwindow2"); + GLADE_HOOKUP_OBJECT (Conf, padtreeview, "padtreeview"); + GLADE_HOOKUP_OBJECT (Conf, label7, "label7"); + GLADE_HOOKUP_OBJECT (Conf, remove_button, "remove_button"); + GLADE_HOOKUP_OBJECT_NO_REF (Conf, dialog_action_area1, "dialog_action_area1"); + GLADE_HOOKUP_OBJECT (Conf, okbutton1, "okbutton1"); + GLADE_HOOKUP_OBJECT (Conf, cancelbutton1, "cancelbutton1"); + + return Conf; +} + diff --git a/plugins/onepad/Linux/interface.h b/plugins/onepad/Linux/interface.h new file mode 100644 index 0000000000..3672165062 --- /dev/null +++ b/plugins/onepad/Linux/interface.h @@ -0,0 +1,6 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +GtkWidget* create_About (void); +GtkWidget* create_Conf (void); diff --git a/plugins/onepad/Linux/linux.cpp b/plugins/onepad/Linux/linux.cpp new file mode 100644 index 0000000000..d7928bd4f5 --- /dev/null +++ b/plugins/onepad/Linux/linux.cpp @@ -0,0 +1,406 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "linux.h" + +Display *GSdsp; + +const char* s_pGuiKeyMap[] = +{ + "L2", "R2", "L1", "R1", + "Triangle", "Circle", "Cross", "Square", + "Select", "L3", "R3", "Start", + "Up", "Right", "Down", "Left", + "Lx", "Rx", "Ly", "Ry", + "L_Up", "L_Right", "L_Down", "L_Left", + "R_Up", "R_Right", "R_Down", "R_Left" +}; + +s32 _PADopen(void *pDsp) +{ + GSdsp = *(Display**)pDsp; + SetAutoRepeat(false); + + return 0; +} + +void _PADclose() +{ + SetAutoRepeat(true); + + vector::iterator it = s_vjoysticks.begin(); + + // Delete everything in the vector vjoysticks. + while (it != s_vjoysticks.end()) + { + delete *it; + it ++; + } + + s_vjoysticks.clear(); +} + +int _GetJoystickIdFromPAD(int pad) +{ + // select the right joystick id + int joyid = -1; + + for (int p = 0; p < PADSUBKEYS; p++) + { + for (int i = 0; i < PADKEYS; ++i) + { + u32 temp = get_key(PadEnum[pad][p],i); + KeyType k = type_of_key(temp); + + if (k == PAD_JOYSTICK || k == PAD_JOYBUTTONS) + { + joyid = key_to_joystick_id(temp); + return joyid; + } + } + } + + if (!JoystickIdWithinBounds(joyid)) + { + // get first unused joystick + for (joyid = 0; joyid < s_vjoysticks.size(); ++joyid) + { + if (s_vjoysticks[joyid]->GetPAD() < 0) break; + } + } + + return joyid; +} + +EXPORT_C_(void) PADupdate(int pad) +{ + // Poll keyboard. + PollForKeyboardInput(pad); + + // joystick info + SDL_JoystickUpdate(); + + for (int i = 0; i < PADKEYS; i++) + { + int key = get_key(PadEnum[pad][0], i); + + if (JoystickIdWithinBounds(key_to_joystick_id(key))) + { + JoystickInfo* pjoy = s_vjoysticks[key_to_joystick_id(key)]; + int pad = (pjoy)->GetPAD(); + KeyType k = type_of_key(key); + + switch (k) + { + case PAD_JOYBUTTONS: + { + int value = SDL_JoystickGetButton((pjoy)->GetJoy(), key_to_button(key)); + + if (value) + clear_bit(status[pad], i); // released + else + set_bit(status[pad], i); // pressed + break; + } + case PAD_JOYSTICK: + { + int value = SDL_JoystickGetAxis((pjoy)->GetJoy(), key_to_axis(key)); + + switch (i) + { + case PAD_LX: + case PAD_LY: + case PAD_RX: + case PAD_RY: + if (abs(value) > (pjoy)->GetDeadzone(value)) + Analog::ConfigurePad(i, pad, value); + else + Analog::ResetPad(i, pad); + break; + } + break; + } + #ifdef EXPERIMENTAL_POV_CODE + case PAD_HAT: + { + int value = SDL_JoystickGetHat((pjoy)->GetJoy(), key_to_axis(key)); + + //PAD_LOG("Hat = %d for key %d\n", key_to_hat_dir(key), key); + if ((value != SDL_HAT_CENTERED) && (key_to_hat_dir(key) == value)) + { + if ((value == SDL_HAT_UP) || (value == SDL_HAT_RIGHT) || (value == SDL_HAT_DOWN) ||(value == SDL_HAT_LEFT)) + { + set_bit(status[pad], i); + PAD_LOG("Registered %s. Set (%d)\n", HatName(value), i); + } + else + { + clear_bit(status[pad], i); + } + } + else + { + clear_bit(status[pad], i); + } + break; + } + #endif + case PAD_POV: + { + int value = SDL_JoystickGetAxis((pjoy)->GetJoy(), key_to_axis(key)); + + if (key_to_pov_sign(key) && (value < -2048)) + clear_bit(status[pad], i); + else if (!key_to_pov_sign(key) && (value > 2048)) + clear_bit(status[pad], i); + else + set_bit(status[pad], i); + break; + } + default: break; + } + } + } +} + +string KeyName(int pad, int key) +{ + string tmp; + KeyType k = type_of_key(get_key(pad, key)); + + switch (k) + { + case PAD_KEYBOARD: + { + char* pstr = KeysymToChar(pad_to_key(get_key(pad, key))); + if (pstr != NULL) tmp = pstr; + break; + } + case PAD_JOYBUTTONS: + { + int button = key_to_button(get_key(pad, key)); + tmp.resize(28); + + sprintf(&tmp[0], "JBut %d", button); + break; + } + case PAD_JOYSTICK: + { + int axis = key_to_axis(get_key(pad, key)); + tmp.resize(28); + + sprintf(&tmp[0], "JAxis %d", axis); + break; + } +#ifdef EXPERIMENTAL_POV_CODE + case PAD_HAT: + { + int axis = key_to_axis(get_key(pad, key)); + tmp.resize(28); + + switch(key_to_hat_dir(get_key(pad, key))) + { + case SDL_HAT_UP: + sprintf(&tmp[0], "JPOVU-%d", axis); + break; + + case SDL_HAT_RIGHT: + sprintf(&tmp[0], "JPOVR-%d", axis); + break; + + case SDL_HAT_DOWN: + sprintf(&tmp[0], "JPOVD-%d", axis); + break; + + case SDL_HAT_LEFT: + sprintf(&tmp[0], "JPOVL-%d", axis); + break; + } + break; + } +#endif + case PAD_POV: + { + tmp.resize(28); + sprintf(&tmp[0], "JPOV %d%s", key_to_axis(get_key(pad, key)), key_to_pov_sign(get_key(pad, key)) ? "-" : "+"); + break; + } + default: break; + } + return tmp; +} + +void UpdateConf(int pad) +{ + initLogging(); + s_selectedpad = pad; + init_tree_view(); + int i; + GtkWidget *Btn; + for (i = 0; i < ArraySize(s_pGuiKeyMap); i++) + { + + if (s_pGuiKeyMap[i] == NULL) continue; + + Btn = lookup_widget(Conf, s_pGuiKeyMap[i]); + if (Btn == NULL) + { + PAD_LOG("OnePAD: cannot find key %s\n", s_pGuiKeyMap[i]); + continue; + } + + gtk_object_set_user_data(GTK_OBJECT(Btn), (void*)(PADKEYS * pad + i)); + } + + // check bounds + int joyid = _GetJoystickIdFromPAD(pad); + + if (JoystickIdWithinBounds(joyid)) + gtk_combo_box_set_active(GTK_COMBO_BOX(s_devicecombo), joyid); // select the combo + else + gtk_combo_box_set_active(GTK_COMBO_BOX(s_devicecombo), s_vjoysticks.size()); // no gamepad + + int padopts = conf.options >> (16 * pad); + + set_checked(Conf, "checkbutton_reverselx", padopts & PADOPTION_REVERTLX); + set_checked(Conf, "checkbutton_reversely", padopts & PADOPTION_REVERTLY); + set_checked(Conf, "checkbutton_reverserx", padopts & PADOPTION_REVERTRX); + set_checked(Conf, "checkbutton_reversery", padopts & PADOPTION_REVERTRY); + set_checked(Conf, "forcefeedback", padopts & PADOPTION_FORCEFEEDBACK); +} + +int GetLabelId(GtkWidget *label) +{ + if (label == NULL) + { + PAD_LOG("couldn't find correct label\n"); + return -1; + } + + return (int)(uptr)gtk_object_get_user_data(GTK_OBJECT(label)); +} + +void OnConf_Key(GtkButton *button, gpointer user_data) +{ + bool captured = false; + + const char* buttonname = gtk_widget_get_name(GTK_WIDGET(button)); + GtkWidget* label = lookup_widget(Conf, buttonname); + + int id = GetLabelId(label); + + if (id == -1) return; + + int pad = id / PADKEYS; + int key = id % PADKEYS; + + // save the joystick states + UpdateJoysticks(); + + while (!captured) + { + vector::iterator itjoy; + char *tmp; + + u32 pkey = get_key(pad, key); + if (PollX11Keyboard(tmp, pkey)) + { + set_key(pad, key, pkey); + captured = true; + break; + } + + SDL_JoystickUpdate(); + + itjoy = s_vjoysticks.begin(); + while ((itjoy != s_vjoysticks.end()) && (!captured)) + { + int jbutton, direction; + + pkey = get_key(pad, key); + if ((*itjoy)->PollButtons(jbutton, pkey)) + { + set_key(pad, key, pkey); + captured = true; + break; + } + + bool negative = false; + bool pov = (!((key == PAD_RY) || (key == PAD_LY) || (key == PAD_RX) || (key == PAD_LX))); + + if ((*itjoy)->PollAxes(pov, jbutton, negative, pkey)) + { + set_key(pad, key, pkey); + captured = true; + break; + } + +#ifdef EXPERIMENTAL_POV_CODE + if ((*itjoy)->PollHats(jbutton, direction, pkey)) + { + set_key(pad, key, pkey); + captured = true; + break; + } +#endif + itjoy++; + } + } + + init_tree_view(); +} + +EXPORT_C_(void) PADconfigure() +{ + char strcurdir[256]; + getcwd(strcurdir, 256); + s_strIniPath = strcurdir; + s_strIniPath += "/inis/OnePAD.ini"; + + LoadConfig(); + + Conf = create_Conf(); + + // recreate + JoystickInfo::EnumerateJoysticks(s_vjoysticks); + + s_devicecombo = lookup_widget(Conf, "joydevicescombo"); + + // fill the combo + char str[255]; + vector::iterator it = s_vjoysticks.begin(); + + // Delete everything in the vector vjoysticks. + while (it != s_vjoysticks.end()) + { + sprintf(str, "%d: %s - but: %d, axes: %d, hats: %d", (*it)->GetId(), (*it)->GetName().c_str(), + (*it)->GetNumButtons(), (*it)->GetNumAxes(), (*it)->GetNumHats()); + gtk_combo_box_append_text(GTK_COMBO_BOX(s_devicecombo), str); + it++; + } + + gtk_combo_box_append_text(GTK_COMBO_BOX(s_devicecombo), "No Gamepad"); + + UpdateConf(0); + + gtk_widget_show_all(Conf); + gtk_main(); +} diff --git a/plugins/onepad/Linux/linux.h b/plugins/onepad/Linux/linux.h new file mode 100644 index 0000000000..da9642eb6a --- /dev/null +++ b/plugins/onepad/Linux/linux.h @@ -0,0 +1,45 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "joystick.h" +#include "keyboard.h" +#include "onepad.h" + +#include +#include +#include +#include + + +extern "C" +{ +#include "interface.h" +#include "support.h" +#include "callbacks.h" +} + +extern GtkWidget *Conf, *s_devicecombo; +extern string s_strIniPath; +extern void init_tree_view(); +extern void destroy_tree_view(); + +#define is_checked(main_widget, widget_name) (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)))) +#define set_checked(main_widget,widget_name, state) gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON(lookup_widget(main_widget, widget_name)), state) diff --git a/plugins/onepad/Linux/openpad.glade b/plugins/onepad/Linux/openpad.glade new file mode 100644 index 0000000000..d0e9014f78 --- /dev/null +++ b/plugins/onepad/Linux/openpad.glade @@ -0,0 +1,1136 @@ + + + + + + + 5 + True + True + OnePAD + False + Author: arcum42(@gmail.com) + +Forked from ZeroPad, by: +zerofrog(@gmail.com) +Thanks to: + linuzappz <linuzappz@hotmail.com> +florin sasu <florinsasu@hotmail.com> +and SSSPSXPad, TwinPad authors + translator-credits + + + + + True + OnePAD Configuration Dialog + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + True + False + False + GDK_WINDOW_TYPE_HINT_DIALOG + GDK_GRAVITY_NORTH_WEST + True + False + True + + + + True + False + 0 + + + + True + GTK_BUTTONBOX_END + + + + True + True + True + gtk-ok + True + GTK_RELIEF_NORMAL + True + -5 + + + + + + + True + True + True + gtk-cancel + True + GTK_RELIEF_NORMAL + True + -6 + + + + + + 0 + False + True + GTK_PACK_END + + + + + + True + False + 0 + + + + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + False + 0 + + + + True + True + PAD1 + True + GTK_RELIEF_NORMAL + True + True + False + True + + + + 0 + False + False + + + + + + True + True + PAD2 + True + GTK_RELIEF_NORMAL + True + False + False + True + PAD1 + + + + 0 + False + False + + + + + + True + True + PAD1 alt. + True + GTK_RELIEF_NORMAL + True + False + False + True + PAD1 + + + + 0 + False + False + + + + + + True + True + PAD2 alt. + True + GTK_RELIEF_NORMAL + True + False + False + True + PAD1 + + + + 0 + False + False + + + + + + + + + + True + <b>Choose PAD to modify</b> + False + True + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + False + False + + + + + + True + False + 0 + + + + True + Joystick to use for this PAD + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 0 + False + False + + + + + + True + + False + True + True + + + + 0 + False + True + + + + + 0 + False + True + + + + + + True + + + + 0 + 0 + True + False + 0 + + + + True + False + 0 + + + + True + + + 0 + False + False + + + + + + True + + + 0 + False + False + + + + + 0 + False + False + + + + + 0 + 0 + + + + + + 64 + 24 + True + True + Left + True + GTK_RELIEF_NORMAL + True + + + + 320 + 104 + + + + + + 64 + 24 + True + True + Up + True + GTK_RELIEF_NORMAL + True + + + + 384 + 80 + + + + + + 64 + 24 + True + True + Right + True + GTK_RELIEF_NORMAL + True + + + + 448 + 104 + + + + + + 64 + 24 + True + True + Down + True + GTK_RELIEF_NORMAL + True + + + + 384 + 128 + + + + + + 64 + 24 + True + True + L2 + True + GTK_RELIEF_NORMAL + True + + + + 384 + 8 + + + + + + 64 + 24 + True + True + L1 + True + GTK_RELIEF_NORMAL + True + + + + 384 + 32 + + + + + + 64 + 24 + True + True + Select + True + GTK_RELIEF_NORMAL + True + + + + 520 + 48 + + + + + + 64 + 24 + True + True + Start + True + GTK_RELIEF_NORMAL + True + + + + 592 + 48 + + + + + + 64 + 24 + True + True + L3 + True + GTK_RELIEF_NORMAL + True + + + + 520 + 8 + + + + + + 64 + 24 + True + True + R3 + True + GTK_RELIEF_NORMAL + True + + + + 592 + 8 + + + + + + 64 + 24 + True + True + Analog + True + GTK_RELIEF_NORMAL + True + + + + 552 + 104 + + + + + + 64 + 24 + True + True + Square + True + GTK_RELIEF_NORMAL + True + + + + 648 + 104 + + + + + + 64 + 24 + True + True + Triangle + True + GTK_RELIEF_NORMAL + True + + + + 712 + 80 + + + + + + 64 + 24 + True + True + Circle + True + GTK_RELIEF_NORMAL + True + + + + 776 + 104 + + + + + + 64 + 24 + True + True + Cross + True + GTK_RELIEF_NORMAL + True + + + + 712 + 128 + + + + + + 64 + 24 + True + True + R2 + True + GTK_RELIEF_NORMAL + True + + + + 712 + 8 + + + + + + 64 + 24 + True + True + R1 + True + GTK_RELIEF_NORMAL + True + + + + 712 + 32 + + + + + + 400 + 24 + True + Analog Controls (move mouse or analog joystick to select) + False + False + GTK_JUSTIFY_LEFT + True + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + True + 0 + + + 384 + 168 + + + + + + 448 + 40 + True + (Note: The analog key controls and joystick controls do not work well together currently, and should not be mixed. ) + False + False + GTK_JUSTIFY_CENTER + True + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + 352 + 192 + + + + + + 64 + 24 + True + True + Up + True + GTK_RELIEF_NORMAL + True + + + + 384 + 240 + + + + + + 64 + 24 + True + True + Left + True + GTK_RELIEF_NORMAL + True + + + + 320 + 272 + + + + + + 64 + 24 + True + True + Lx + True + GTK_RELIEF_NORMAL + True + + + + 384 + 264 + + + + + + 64 + 24 + True + True + Ly + True + GTK_RELIEF_NORMAL + True + + + + 384 + 288 + + + + + + 64 + 24 + True + True + Down + True + GTK_RELIEF_NORMAL + True + + + + 384 + 312 + + + + + + 64 + 24 + True + True + Right + True + GTK_RELIEF_NORMAL + True + + + + 448 + 272 + + + + + + 111 + 22 + True + True + Reverse LX + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 360 + 344 + + + + + + 111 + 22 + True + True + Reverse LY + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 360 + 368 + + + + + + 64 + 24 + True + True + Up + True + GTK_RELIEF_NORMAL + True + + + + 712 + 240 + + + + + + 64 + 24 + True + True + Left + True + GTK_RELIEF_NORMAL + True + + + + 648 + 272 + + + + + + 64 + 24 + True + True + Rx + True + GTK_RELIEF_NORMAL + True + + + + 712 + 264 + + + + + + 64 + 24 + True + True + Ry + True + GTK_RELIEF_NORMAL + True + + + + 712 + 288 + + + + + + 64 + 24 + True + True + Right + True + GTK_RELIEF_NORMAL + True + + + + 776 + 272 + + + + + + 64 + 24 + True + True + Down + True + GTK_RELIEF_NORMAL + True + + + + 712 + 312 + + + + + + 112 + 48 + True + True + Enable Force +Feedback + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 528 + 344 + + + + + + 111 + 22 + True + True + Reverse RX + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 688 + 344 + + + + + + 111 + 22 + True + True + Reverse RY + True + GTK_RELIEF_NORMAL + True + False + False + True + + + + 688 + 368 + + + + + + 312 + 336 + True + 0 + 0.5 + GTK_SHADOW_ETCHED_IN + + + + True + 0.5 + 0.5 + 1 + 1 + 0 + 0 + 12 + 0 + + + + True + True + GTK_POLICY_ALWAYS + GTK_POLICY_ALWAYS + GTK_SHADOW_IN + GTK_CORNER_TOP_LEFT + + + + True + True + GDK_EXTENSION_EVENTS_ALL + True + True + False + False + False + False + True + + + + + + + + + + True + Key Settings + False + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + PANGO_ELLIPSIZE_NONE + -1 + False + 0 + + + label_item + + + + + 0 + 8 + + + + + + 0 + 0 + True + True + Remove + True + GTK_RELIEF_NORMAL + True + + + + 248 + 352 + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/plugins/onepad/Linux/openpad.gladep b/plugins/onepad/Linux/openpad.gladep new file mode 100644 index 0000000000..543d022d0d --- /dev/null +++ b/plugins/onepad/Linux/openpad.gladep @@ -0,0 +1,12 @@ + + + + + Linux + linux + FALSE + TRUE + FALSE + FALSE + FALSE + diff --git a/plugins/onepad/Linux/support.c b/plugins/onepad/Linux/support.c new file mode 100644 index 0000000000..00aff29822 --- /dev/null +++ b/plugins/onepad/Linux/support.c @@ -0,0 +1,144 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +#include + +#include "support.h" + +GtkWidget* +lookup_widget (GtkWidget *widget, + const gchar *widget_name) +{ + GtkWidget *parent, *found_widget; + + for (;;) + { + if (GTK_IS_MENU (widget)) + parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); + else + parent = widget->parent; + if (!parent) + parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); + if (parent == NULL) + break; + widget = parent; + } + + found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), + widget_name); + if (!found_widget) + g_warning ("Widget not found: %s", widget_name); + return found_widget; +} + +static GList *pixmaps_directories = NULL; + +/* Use this function to set the directory containing installed pixmaps. */ +void +add_pixmap_directory (const gchar *directory) +{ + pixmaps_directories = g_list_prepend (pixmaps_directories, + g_strdup (directory)); +} + +/* This is an internally used function to find pixmap files. */ +static gchar* +find_pixmap_file (const gchar *filename) +{ + GList *elem; + + /* We step through each of the pixmaps directory to find it. */ + elem = pixmaps_directories; + while (elem) + { + gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data, + G_DIR_SEPARATOR_S, filename); + if (g_file_test (pathname, G_FILE_TEST_EXISTS)) + return pathname; + g_free (pathname); + elem = elem->next; + } + return NULL; +} + +/* This is an internally used function to create pixmaps. */ +GtkWidget* +create_pixmap (GtkWidget *widget, + const gchar *filename) +{ + gchar *pathname = NULL; + GtkWidget *pixmap; + + if (!filename || !filename[0]) + return gtk_image_new (); + + pathname = find_pixmap_file (filename); + + if (!pathname) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return gtk_image_new (); + } + + pixmap = gtk_image_new_from_file (pathname); + g_free (pathname); + return pixmap; +} + +/* This is an internally used function to create pixmaps. */ +GdkPixbuf* +create_pixbuf (const gchar *filename) +{ + gchar *pathname = NULL; + GdkPixbuf *pixbuf; + GError *error = NULL; + + if (!filename || !filename[0]) + return NULL; + + pathname = find_pixmap_file (filename); + + if (!pathname) + { + g_warning (_("Couldn't find pixmap file: %s"), filename); + return NULL; + } + + pixbuf = gdk_pixbuf_new_from_file (pathname, &error); + if (!pixbuf) + { + fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", + pathname, error->message); + g_error_free (error); + } + g_free (pathname); + return pixbuf; +} + +/* This is used to set ATK action descriptions. */ +void +glade_set_atk_action_description (AtkAction *action, + const gchar *action_name, + const gchar *description) +{ + gint n_actions, i; + + n_actions = atk_action_get_n_actions (action); + for (i = 0; i < n_actions; i++) + { + if (!strcmp (atk_action_get_name (action, i), action_name)) + atk_action_set_description (action, i, description); + } +} + diff --git a/plugins/onepad/Linux/support.h b/plugins/onepad/Linux/support.h new file mode 100644 index 0000000000..a32649e53c --- /dev/null +++ b/plugins/onepad/Linux/support.h @@ -0,0 +1,69 @@ +/* + * DO NOT EDIT THIS FILE - it is generated by Glade. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* + * Standard gettext macros. + */ +#ifdef ENABLE_NLS +# include +# undef _ +# define _(String) dgettext (PACKAGE, String) +# define Q_(String) g_strip_context ((String), gettext (String)) +# ifdef gettext_noop +# define N_(String) gettext_noop (String) +# else +# define N_(String) (String) +# endif +#else +# define textdomain(String) (String) +# define gettext(String) (String) +# define dgettext(Domain,Message) (Message) +# define dcgettext(Domain,Message,Type) (Message) +# define bindtextdomain(Domain,Directory) (Domain) +# define _(String) (String) +# define Q_(String) g_strip_context ((String), (String)) +# define N_(String) (String) +#endif + + +/* + * Public Functions. + */ + +/* + * This function returns a widget in a component created by Glade. + * Call it with the toplevel widget in the component (i.e. a window/dialog), + * or alternatively any widget in the component, and the name of the widget + * you want returned. + */ +GtkWidget* lookup_widget (GtkWidget *widget, + const gchar *widget_name); + + +/* Use this function to set the directory containing installed pixmaps. */ +void add_pixmap_directory (const gchar *directory); + + +/* + * Private Functions. + */ + +/* This is used to create the pixmaps used in the interface. */ +GtkWidget* create_pixmap (GtkWidget *widget, + const gchar *filename); + +/* This is used to create the pixbufs used in the interface. */ +GdkPixbuf* create_pixbuf (const gchar *filename); + +/* This is used to set ATK action descriptions. */ +void glade_set_atk_action_description (AtkAction *action, + const gchar *action_name, + const gchar *description); + diff --git a/plugins/onepad/Makefile.am b/plugins/onepad/Makefile.am new file mode 100644 index 0000000000..623f0e6dfc --- /dev/null +++ b/plugins/onepad/Makefile.am @@ -0,0 +1,26 @@ +# Create a shared library libOnePAD +AUTOMAKE_OPTIONS = foreign +noinst_LIBRARIES = libOnePAD.a +INCLUDES = -I@srcdir@/../../common/include + +libOnePAD_a_CXXFLAGS = $(shell pkg-config --cflags gtk+-2.0) +libOnePAD_a_CFLAGS = $(shell pkg-config --cflags gtk+-2.0) + +# Create a shared object by faking an exe (thanks to ODE makefiles) +traplibdir=$(prefix) + +if DEBUGBUILD +preext=d +endif + +EXEEXT=$(preext)@so_ext@ + +traplib_PROGRAMS=libOnePAD +libOnePAD_SOURCES= +libOnePAD_DEPENDENCIES = libOnePAD.a +libOnePAD_LDFLAGS= @SHARED_LDFLAGS@ +libOnePAD_LDFLAGS+=-Wl,-soname,@ZEROPAD_SONAME@ +libOnePAD_LDADD=$(libOnePAD_a_OBJECTS) + +libOnePAD_a_SOURCES = joystick.cpp analog.cpp analog.h onepad.cpp onepad.h controller.cpp controller.h \ +Linux/gui.cpp Linux/linux.cpp Linux/support.c Linux/interface.c keyboard.cpp keyboard.h diff --git a/plugins/onepad/Windows/placeholder b/plugins/onepad/Windows/placeholder new file mode 100644 index 0000000000..e69de29bb2 diff --git a/plugins/onepad/aclocal.m4 b/plugins/onepad/aclocal.m4 new file mode 100644 index 0000000000..3ca3cc648f --- /dev/null +++ b/plugins/onepad/aclocal.m4 @@ -0,0 +1,973 @@ +# generated automatically by aclocal 1.11 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, +[m4_warning([this file was generated for autoconf 2.63. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# Figure out how to run the assembler. -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_PROG_AS +# ---------- +AC_DEFUN([AM_PROG_AS], +[# By default we simply use the C compiler to build assembly code. +AC_REQUIRE([AC_PROG_CC]) +test "${CCAS+set}" = set || CCAS=$CC +test "${CCASFLAGS+set}" = set || CCASFLAGS=$CFLAGS +AC_ARG_VAR([CCAS], [assembler compiler command (defaults to CC)]) +AC_ARG_VAR([CCASFLAGS], [assembler compiler flags (defaults to CFLAGS)]) +_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES([CCAS])])dnl +]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/plugins/onepad/analog.cpp b/plugins/onepad/analog.cpp new file mode 100644 index 0000000000..2eef28a9fb --- /dev/null +++ b/plugins/onepad/analog.cpp @@ -0,0 +1,165 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + #include "analog.h" +PADAnalog g_lanalog[NUM_OF_PADS], g_ranalog[NUM_OF_PADS]; + +namespace Analog +{ + u8 Pad(int padvalue, u8 i) + { + switch (padvalue) + { + case PAD_LX: + return g_lanalog[i].x; + break; + + case PAD_RX: + return g_ranalog[i].x; + break; + + case PAD_LY: + return g_lanalog[i].y; + break; + + case PAD_RY: + return g_ranalog[i].y; + break; + + default: + return 0; + break; + } + } + + void SetPad(int padvalue, u8 i, u8 value) + { + switch (padvalue) + { + case PAD_LX: + g_lanalog[i].x = value; + break; + + case PAD_RX: + g_ranalog[i].x = value; + break; + + case PAD_LY: + g_lanalog[i].y = value; + break; + + case PAD_RY: + g_ranalog[i].y = value; + break; + + default: + break; + } + } + + void InvertPad(int padvalue, u8 i) + { + SetPad(padvalue, i, -Pad(padvalue, i)); + } + + void ResetPad(int padvalue, u8 i) + { + SetPad(padvalue, i, 0x80); + } + + void Init() + { + for (int i = 0; i < 2; ++i) + { + ResetPad(PAD_LX, i); + ResetPad(PAD_LY, i); + ResetPad(PAD_RX, i); + ResetPad(PAD_RY, i); + } + } + + bool RevertPad(u8 padvalue) + { + switch (padvalue) + { + case PAD_LX: + return ((conf.options & PADOPTION_REVERTLX) != 0); + break; + + case PAD_RX: + return ((conf.options & PADOPTION_REVERTRX) != 0); + break; + + case PAD_LY: + return ((conf.options & PADOPTION_REVERTLY) != 0); + break; + + case PAD_RY: + return ((conf.options & PADOPTION_REVERTRY) != 0); + break; + + default: + return false; + break; + } + } + + void ConfigurePad(int padvalue, u8 i, int value) + { + int temp = Pad(padvalue, i); + SetPad(padvalue, i, value / 256); + if (RevertPad(padvalue)) InvertPad(padvalue, i); + SetPad(padvalue, i, Pad(padvalue, i) + 0x80); + + //PAD_LOG("Setting pad[%d]@%d to %d from %d\n", padvalue, i, value, temp); + } + int AnalogToPad(int padvalue) + { + switch (padvalue) + { + case PAD_R_LEFT: + return PAD_RX; + break; + case PAD_R_UP: + return PAD_RY; + break; + case PAD_L_LEFT: + return PAD_LX; + break; + case PAD_L_UP: + return PAD_LY; + break; + case PAD_R_DOWN: + return PAD_RY; + break; + case PAD_R_RIGHT: + return PAD_RX; + break; + case PAD_L_DOWN: + return PAD_LY; + break; + case PAD_L_RIGHT: + return PAD_LX; + break; + } + return 0; + } +} diff --git a/plugins/onepad/analog.h b/plugins/onepad/analog.h new file mode 100644 index 0000000000..62875cb1d0 --- /dev/null +++ b/plugins/onepad/analog.h @@ -0,0 +1,36 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + #define NUM_OF_PADS 2 + + #include "onepad.h" + namespace Analog +{ + extern void Init(); + extern u8 Pad(int padvalue, u8 i); + extern void SetPad(int padvalue, u8 i, u8 value); + extern void InvertPad(int padvalue, u8 i); + extern bool RevertPad(u8 padvalue); + extern void ResetPad(int padvalue, u8 i); + extern void ConfigurePad(int padvalue, u8 i, int value); + extern int KeypadToPad(u8 keypress); + extern int AnalogToPad(int padvalue); +} \ No newline at end of file diff --git a/plugins/onepad/bitwise.h b/plugins/onepad/bitwise.h new file mode 100644 index 0000000000..02cfa8a058 --- /dev/null +++ b/plugins/onepad/bitwise.h @@ -0,0 +1,44 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + template + static void __forceinline set_bit(T &value, int bit) + { + value |= (1 << bit); + } + + template + static void __forceinline clear_bit(T &value, int bit) + { + value &= ~(1 << bit); + } + + template + static void __forceinline toggle_bit(T &value, int bit) + { + value ^= (1 << bit); + } + + template + static bool __forceinline test_bit(T &value, int bit) + { + return (value & (1 << bit)); + } \ No newline at end of file diff --git a/plugins/onepad/build.sh b/plugins/onepad/build.sh new file mode 100755 index 0000000000..4ef06178a4 --- /dev/null +++ b/plugins/onepad/build.sh @@ -0,0 +1,29 @@ +#!/bin/sh + +curdir=`pwd` + +echo ---------------- +echo Building OnePAD +echo ---------------- + +if [ $# -gt 0 ] && [ $1 = "all" ] +then + +#if possible +aclocal +automake -a +autoconf +chmod +x configure +./configure --prefix=${PCSX2PLUGINS} +make clean +make install + +else +make $@ +fi + +if [ $? -ne 0 ] +then +exit 1 +fi + diff --git a/plugins/onepad/configure.ac b/plugins/onepad/configure.ac new file mode 100644 index 0000000000..3e182a17cc --- /dev/null +++ b/plugins/onepad/configure.ac @@ -0,0 +1,73 @@ +AC_INIT(OnePAD,0.1,arcum42@gmail.com) + +AM_INIT_AUTOMAKE(OnePAD,0.1) + +AC_PROG_CC([gcc g++ cl KCC CC cxx cc++ xlC aCC c++]) +AC_PROG_CXX([gcc g++ cl KCC CC cxx cc++ xlC aCC c++]) +AC_PROG_CPP([gcc g++ cl KCC CC cxx cc++ xlC aCC c++]) + +AC_PROG_INSTALL +AC_PROG_RANLIB + +dnl necessary for compiling assembly +AM_PROG_AS + +AC_SUBST(ONEPAD_CURRENT, 0) +AC_SUBST(ONEPAD_REVISION, 1) +AC_SUBST(ONEPAD_AGE, 0) +AC_SUBST(ONEPAD_RELEASE, [$ONEPAD_CURRENT].[$ONEPAD_REVISION].[$ONEPAD_AGE]) +AC_SUBST(ONEPAD_SONAME, libOnePAD.so.[$ONEPAD_CURRENT].[$ONEPAD_REVISION].[$ONEPAD_AGE]) + +CFLAGS= +CXXFLAGS= +CCASFLAGS= + +dnl Check for debug build +AC_MSG_CHECKING(debug build) +AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug], [debug build]), + debug=$enableval,debug=no) +if test "x$debug" == xyes +then + AC_DEFINE(PCSX2_DEBUG,1,[PCSX2_DEBUG]) + CFLAGS+="-g -m32 -fpic " + CXXFLAGS+="-g -m32 -fpic " + CCASFLAGS+=" -m32 -fpic " +else + AC_DEFINE(NDEBUG,1,[NDEBUG]) + CFLAGS+="-O2 -fomit-frame-pointer -m32 -fpic " + CXXFLAGS+="-O2 -fomit-frame-pointer -m32 -fpic " + CCASFLAGS+=" -m32 -fpic " +fi +AM_CONDITIONAL(DEBUGBUILD, test x$debug = xyes) +AC_MSG_RESULT($debug) + + +AC_CHECK_FUNCS([ _aligned_malloc _aligned_free ], AC_DEFINE(HAVE_ALIGNED_MALLOC)) + +AC_CHECK_LIB(SDL,SDL_Init,[]) + +dnl gtk +AC_MSG_CHECKING(gtk2+) +AC_CHECK_PROG(GTK_CONFIG, pkg-config, pkg-config) +LIBS+=$(pkg-config --libs gtk+-2.0 sdl) +CFLAGS+="$(pkg-config --cflags gtk+-2.0 sdl) " +CXXFLAGS+="$(pkg-config --cflags gtk+-2.0 sdl) " + +dnl AC_CHECK_HEADER([SDL/SDL.h], [AC_DEFINE(JOYSTICK_SUPPORT,1)]) + +dnl assuming linux environment +so_ext=".so.$ONEPAD_RELEASE" +SHARED_LDFLAGS="-shared" +AC_SUBST(so_ext) +AC_SUBST(SHARED_LDFLAGS) + +AC_CHECK_LIB(stdc++,main,[LIBS="$LIBS -lstdc++"]) +AC_CHECK_LIB(dl,main,[LIBS="$LIBS -ldl"]) + + +AC_OUTPUT([ + Makefile + ]) + +echo "Configuration:" +echo " Debug build? $debug" \ No newline at end of file diff --git a/plugins/onepad/controller.cpp b/plugins/onepad/controller.cpp new file mode 100644 index 0000000000..d4d22deb05 --- /dev/null +++ b/plugins/onepad/controller.cpp @@ -0,0 +1,93 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "onepad.h" +#include "controller.h" + +__forceinline int set_key(int pad, int index, int value) +{ + conf.keys[pad][index] = value; +} + +__forceinline int get_key(int pad, int index) +{ + return conf.keys[pad][index]; +} + +__forceinline KeyType type_of_key(int key) + { + if (key < 0x10000) return PAD_KEYBOARD; + else if (key >= 0x10000 && key < 0x20000) return PAD_JOYBUTTONS; + else if (key >= 0x20000 && key < 0x30000) return PAD_JOYSTICK; + else if (key >= 0x30000 && key < 0x40000) return PAD_POV; + else if (key >= 0x40000 && key < 0x50000) return PAD_HAT; + else return PAD_NULL; + } + + __forceinline int pad_to_key(int key) + { + return ((key) & 0xffff); +} + +__forceinline int key_to_joystick_id(int key) +{ + return (((key) & 0xf000) >> 12); +} + +__forceinline int key_to_button(int key) +{ + return ((key) & 0xff); +} + +__forceinline int key_to_axis(int key) +{ + return ((key) & 0xff); +} + +__forceinline int button_to_key(int joy_id, int button_id) +{ + return (0x10000 | ((joy_id) << 12) | (button_id)); +} + +__forceinline int joystick_to_key(int joy_id, int axis_id) +{ + return (0x20000 | ((joy_id) << 12) | (axis_id)); +} + +__forceinline int pov_to_key(int joy_id, int sign, int axis_id) +{ + return (0x30000 | ((joy_id) << 12) | ((sign) << 8) | (axis_id)); +} + +__forceinline int hat_to_key(int joy_id, int dir, int axis_id) +{ + return (0x40000 | ((joy_id) << 12) | ((dir) << 8) | (axis_id)); +} + +__forceinline int key_to_pov_sign(int key) +{ + return (((key) & 0x100) >> 8); +} + +__forceinline int key_to_hat_dir(int key) +{ + return (((key) & ~ 0x40000) >> 8); +} \ No newline at end of file diff --git a/plugins/onepad/controller.h b/plugins/onepad/controller.h new file mode 100644 index 0000000000..84b90e3183 --- /dev/null +++ b/plugins/onepad/controller.h @@ -0,0 +1,82 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __CONTROLLER_H__ +#define __CONTROLLER_H__ + +#ifdef __LINUX__ +#define PADKEYS 28 +#else +#define PADKEYS 20 +#endif + +#ifdef _WIN32 +#define PADSUBKEYS 1 +#else +#define PADSUBKEYS 2 +#endif + +enum KeyType +{ + PAD_KEYBOARD = 0, + PAD_JOYBUTTONS, + PAD_JOYSTICK, + PAD_POV, + PAD_HAT, + PAD_NULL = -1 +}; + + +extern int set_key(int pad, int index, int value); +extern int get_key(int pad, int index); + +extern KeyType type_of_key(int key); +extern int pad_to_key(int key); +extern int key_to_joystick_id(int key); +extern int key_to_button(int key); +extern int key_to_axis(int key); +extern int button_to_key(int joy_id, int button_id); +extern int joystick_to_key(int joy_id, int axis_id); +extern int pov_to_key(int joy_id, int sign, int axis_id); +extern int hat_to_key(int joy_id, int dir, int axis_id); +extern int key_to_pov_sign(int key); +extern int key_to_hat_dir(int key); + +//#define EXPERIMENTAL_POV_CODE +extern int PadEnum[2][2]; + +typedef struct +{ + u32 keys[2 * PADSUBKEYS][PADKEYS]; + u32 log; + u32 options; // upper 16 bits are for pad2 +} PADconf; + + +typedef struct +{ + u8 x, y; +} PADAnalog; + +extern PADconf conf; +extern PADAnalog g_lanalog[2], g_ranalog[2]; + +#endif \ No newline at end of file diff --git a/plugins/onepad/depcomp b/plugins/onepad/depcomp new file mode 100644 index 0000000000..88b3a13969 --- /dev/null +++ b/plugins/onepad/depcomp @@ -0,0 +1,529 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2005-05-14.22 + +# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mecanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/plugins/onepad/install-sh b/plugins/onepad/install-sh new file mode 120000 index 0000000000..205f21c6b8 --- /dev/null +++ b/plugins/onepad/install-sh @@ -0,0 +1 @@ +/usr/share/automake-1.11/install-sh \ No newline at end of file diff --git a/plugins/onepad/joystick.cpp b/plugins/onepad/joystick.cpp new file mode 100644 index 0000000000..2cbbc312a2 --- /dev/null +++ b/plugins/onepad/joystick.cpp @@ -0,0 +1,288 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "joystick.h" + +////////////////////////// +// Joystick definitions // +////////////////////////// + +int s_selectedpad = 0; +vector s_vjoysticks; +static u32 s_bSDLInit = false; + +void UpdateJoysticks() +{ + vector::iterator itjoy = s_vjoysticks.begin(); + + SDL_JoystickUpdate(); + + // Save everything in the vector s_vjoysticks. + while (itjoy != s_vjoysticks.end()) + { + (*itjoy)->SaveState(); + itjoy++; + } +} + +const char *HatName(int value) +{ + switch(value) + { + case SDL_HAT_CENTERED: return "SDL_HAT_CENTERED"; + case SDL_HAT_UP: return "SDL_HAT_UP"; + case SDL_HAT_RIGHT: return "SDL_HAT_RIGHT"; + case SDL_HAT_DOWN: return "SDL_HAT_DOWN"; + case SDL_HAT_LEFT: return "SDL_HAT_LEFT"; + case SDL_HAT_RIGHTUP: return "SDL_HAT_RIGHTUP"; + case SDL_HAT_RIGHTDOWN: return "SDL_HAT_RIGHTDOWN"; + case SDL_HAT_LEFTUP: return "SDL_HAT_LEFTUP"; + case SDL_HAT_LEFTDOWN: return "SDL_HAT_LEFTDOWN"; + default: return "Unknown"; + } + + return "Unknown"; +} + +bool JoystickIdWithinBounds(int joyid) +{ + return ((joyid >= 0) && (joyid < (int)s_vjoysticks.size())); +} +// opens handles to all possible joysticks +void JoystickInfo::EnumerateJoysticks(vector& vjoysticks) +{ + + if (!s_bSDLInit) + { + if (SDL_Init(SDL_INIT_JOYSTICK) < 0) return; + SDL_JoystickEventState(SDL_QUERY); + s_bSDLInit = true; + } + + vector::iterator it = vjoysticks.begin(); + + // Delete everything in the vector vjoysticks. + while (it != vjoysticks.end()) + { + delete *it; + it ++; + } + + vjoysticks.resize(SDL_NumJoysticks()); + + for (int i = 0; i < (int)vjoysticks.size(); ++i) + { + vjoysticks[i] = new JoystickInfo(); + vjoysticks[i]->Init(i, true); + } + + // set the pads + for (int pad = 0; pad < 2; ++pad) + { + // select the right joystick id + int joyid = -1; + + for (int i = 0; i < PADKEYS; ++i) + { + KeyType k = type_of_key(get_key(pad,i)); + if (k == PAD_JOYSTICK || k == PAD_JOYBUTTONS) + { + joyid = key_to_joystick_id(get_key(pad,i)); + break; + } + } + + if ((joyid >= 0) && (joyid < (int)s_vjoysticks.size())) s_vjoysticks[joyid]->Assign(pad); + } + +} + +JoystickInfo::JoystickInfo() +{ + joy = NULL; + + _id = -1; + pad = -1; + axisrange = 0x7fff; + deadzone = 2000; +} + +void JoystickInfo::Destroy() +{ + if (joy != NULL) + { + if (SDL_JoystickOpened(_id)) SDL_JoystickClose(joy); + joy = NULL; + } +} + +bool JoystickInfo::Init(int id, bool bStartThread) +{ + Destroy(); + _id = id; + + joy = SDL_JoystickOpen(id); + if (joy == NULL) + { + PAD_LOG("failed to open joystick %d\n", id); + return false; + } + + numaxes = SDL_JoystickNumAxes(joy); + numbuttons = SDL_JoystickNumButtons(joy); + numhats = SDL_JoystickNumHats(joy); + devname = SDL_JoystickName(id); + + vaxisstate.resize(numaxes); + vbuttonstate.resize(numbuttons); + vhatstate.resize(numhats); + + //PAD_LOG("There are %d buttons, %d axises, and %d hats.\n", numbuttons, numaxes, numhats); + return true; +} + +// assigns a joystick to a pad +void JoystickInfo::Assign(int newpad) +{ + if (pad == newpad) return; + pad = newpad; + + if (pad >= 0) + { + for (int i = 0; i < PADKEYS; ++i) + { + KeyType k = type_of_key(get_key(pad,i)); + + if (k == PAD_JOYBUTTONS) + { + set_key(pad, i, button_to_key(_id, key_to_button(get_key(pad,i)))); + } + else if (k == PAD_JOYSTICK) + { + set_key(pad, i, joystick_to_key(_id, key_to_button(get_key(pad,i)))); + } + } + } +} + +void JoystickInfo::SaveState() +{ + for (int i = 0; i < numbuttons; ++i) + SetButtonState(i, SDL_JoystickGetButton(joy, i)); + for (int i = 0; i < numaxes; ++i) + SetAxisState(i, SDL_JoystickGetAxis(joy, i)); + for (int i = 0; i < numhats; ++i) + SetHatState(i, SDL_JoystickGetHat(joy, i)); +} + +void JoystickInfo::TestForce() +{ +} + +bool JoystickInfo::PollButtons(int &jbutton, u32 &pkey) +{ + // MAKE sure to look for changes in the state!! + for (int i = 0; i < GetNumButtons(); ++i) + { + int but = SDL_JoystickGetButton(GetJoy(), i); + + if (but != GetButtonState(i)) + { + if (!but) // released, we don't really want this + { + SetButtonState(i, 0); + break; + } + + pkey = button_to_key(GetId(), i); + jbutton = i; + return true; + } + } + + return false; +} + +bool JoystickInfo::PollAxes(bool pov, int &jbutton, bool &negative, u32 &pkey) +{ + for (int i = 0; i < GetNumAxes(); ++i) + { + int value = SDL_JoystickGetAxis(GetJoy(), i); + + if (value != GetAxisState(i)) + { + PAD_LOG("Change in joystick %d: %d.\n", i, value); + + if (abs(value) <= GetAxisState(i)) // we don't want this + { + // released, we don't really want this + SetAxisState(i, value); + break; + } + + if (abs(value) > 0x3fff) + { + jbutton = i; + + if (pov) + { + negative = (value < 0); + pkey = pov_to_key(GetId(), negative, i); + } + else // axis + { + pkey = joystick_to_key(GetId(), i); + } + return true; + } + } + } + return false; +} + +bool JoystickInfo::PollHats(int &jbutton, int &dir, u32 &pkey) +{ +#ifdef EXPERIMENTAL_POV_CODE + for (int i = 0; i < GetNumHats(); ++i) + { + int value = SDL_JoystickGetHat(GetJoy(), i); + + if (value != SDL_HAT_CENTERED) + { + switch (value) + { + case SDL_HAT_UP: + case SDL_HAT_RIGHT: + case SDL_HAT_DOWN: + case SDL_HAT_LEFT: + pkey = hat_to_key(GetId(), value, i); + jbutton = i; + dir = value; + PAD_LOG("Hat Pressed!"); + return true; + default: + break; + } + } + } +#endif + return false; +} diff --git a/plugins/onepad/joystick.h b/plugins/onepad/joystick.h new file mode 100644 index 0000000000..9b9b3afdce --- /dev/null +++ b/plugins/onepad/joystick.h @@ -0,0 +1,151 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __JOYSTICK_H__ +#define __JOYSTICK_H__ + +#ifdef __LINUX__ +#include +#else +#include +#endif + +#include "onepad.h" + +// holds all joystick info +class JoystickInfo +{ + public: + JoystickInfo(); + ~JoystickInfo() + { + Destroy(); + } + + void Destroy(); + // opens handles to all possible joysticks + static void EnumerateJoysticks(vector& vjoysticks); + + bool Init(int id, bool bStartThread = true); // opens a handle and gets information + void Assign(int pad); // assigns a joystick to a pad + + void TestForce(); + + bool PollButtons(int &jbutton, u32 &pkey); + + bool PollAxes(bool pov, int &jbutton, bool &negative, u32 &pkey); + + bool PollHats(int &jbutton, int &dir, u32 &pkey); + + const string& GetName() + { + return devname; + } + + int GetNumButtons() + { + return numbuttons; + } + + int GetNumAxes() + { + return numaxes; + } + + int GetNumHats() + { + return numhats; + } + + int GetId() + { + return _id; + } + + int GetPAD() + { + return pad; + } + + int GetDeadzone(int axis) + { + return deadzone; + } + + void SaveState(); + + int GetButtonState(int i) + { + return vbuttonstate[i]; + } + + int GetAxisState(int i) + { + return vaxisstate[i]; + } + + int GetHatState(int i) + { + //PAD_LOG("Getting POV State of %d.\n", i); + return vhatstate[i]; + } + + void SetButtonState(int i, int state) + { + vbuttonstate[i] = state; + } + + void SetAxisState(int i, int value) + { + vaxisstate[i] = value; + } + + void SetHatState(int i, int value) + { + //PAD_LOG("We should set %d to %d.\n", i, value); + vhatstate[i] = value; + } + + SDL_Joystick* GetJoy() + { + return joy; + } + + private: + + string devname; // pretty device name + int _id; + int numbuttons, numaxes, numhats; + int axisrange, deadzone; + int pad; + + vector vbuttonstate, vaxisstate, vhatstate; + + SDL_Joystick* joy; +}; + + +extern int s_selectedpad; +extern vector s_vjoysticks; +extern void UpdateJoysticks(); +extern const char *HatName(int value); +extern bool JoystickIdWithinBounds(int joyid); +#endif diff --git a/plugins/onepad/keyboard.cpp b/plugins/onepad/keyboard.cpp new file mode 100644 index 0000000000..4429bfeb08 --- /dev/null +++ b/plugins/onepad/keyboard.cpp @@ -0,0 +1,284 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + /* + * Theoretically, this header is for anything to do with keyboard input. + * Pragmatically, event handing's going in here too. + */ + + #include "keyboard.h" + + +__forceinline int FindKey(int key, int pad) +{ + for (int p = 0; p < PADSUBKEYS; p++) + for (int i = 0; i < PADKEYS; i++) + if (key == get_key(PadEnum[pad][p], i)) return i; + return -1; +} + +char* KeysymToChar(int keysym) +{ + #ifdef __LINUX__ + return XKeysymToString(keysym); +#else + LPWORD temp; + + ToAscii((UINT) keysym, NULL, NULL, temp, NULL); + return (char*)temp; + #endif +} + +void PollForKeyboardInput(int pad) +{ + #ifdef __LINUX__ + PollForX11KeyboardInput(pad); +#endif +} + +void SetAutoRepeat(bool autorep) +{ + #ifdef __LINUX__ + if (autorep) + XAutoRepeatOn(GSdsp); + else + XAutoRepeatOff(GSdsp); +#endif +} + + #ifdef __LINUX__ +void PollForX11KeyboardInput(int pad) +{ + XEvent E; + KeySym key; + int keyPress = 0, keyRelease = 0; + int i; + + // keyboard input + while (XPending(GSdsp) > 0) + { + XNextEvent(GSdsp, &E); + switch (E.type) + { + case KeyPress: + key = XLookupKeysym((XKeyEvent *) & E, 0); + + i = FindKey(key, pad); + + // Analog controls. + if ((i > PAD_RY) && (i <= PAD_R_LEFT)) + { + switch (i) + { + case PAD_R_LEFT: + case PAD_R_UP: + case PAD_L_LEFT: + case PAD_L_UP: + Analog::ConfigurePad(Analog::AnalogToPad(i), pad, DEF_VALUE); + break; + case PAD_R_RIGHT: + case PAD_R_DOWN: + case PAD_L_RIGHT: + case PAD_L_DOWN: + Analog::ConfigurePad(Analog::AnalogToPad(i), pad, -DEF_VALUE); + break; + } + i += 0xff00; + } + + if (i != -1) + { + clear_bit(keyRelease, i); + set_bit(keyPress, i); + } + //PAD_LOG("Key pressed:%d\n", i); + + event.evt = KEYPRESS; + event.key = key; + break; + + case KeyRelease: + key = XLookupKeysym((XKeyEvent *) & E, 0); + + i = FindKey(key, pad); + + // Analog Controls. + if ((i > PAD_RY) && (i <= PAD_R_LEFT)) + { + Analog::ResetPad(Analog::AnalogToPad(i), pad); + i += 0xff00; + } + + if (i != -1) + { + clear_bit(keyPress, i); + set_bit(keyRelease, i); + } + + event.evt = KEYRELEASE; + event.key = key; + break; + + case FocusIn: + XAutoRepeatOff(GSdsp); + break; + + case FocusOut: + XAutoRepeatOn(GSdsp); + break; + } + } + + UpdateKeys(pad, keyPress, keyRelease); +} + +bool PollX11Keyboard(char* &temp, u32 &pkey) +{ + GdkEvent *ev = gdk_event_get(); + + if (ev != NULL) + { + if (ev->type == GDK_KEY_PRESS) + { + + if (ev->key.keyval == GDK_Escape) + { + temp = "Unknown"; + pkey = NULL; + } + else + { + temp = KeysymToChar(ev->key.keyval); + pkey = ev->key.keyval; + } + + return true; + } + } + + return false; +} +#else +LRESULT WINAPI PADwndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + int keyPress[2] = {0}, keyRelease[2] = {0}; + static bool lbutton = false, rbutton = false; + + switch (msg) + { + case WM_KEYDOWN: + if (lParam & 0x40000000) return TRUE; + + for (int pad = 0; pad < 2; ++pad) + { + for (int i = 0; i < PADKEYS; i++) + { + if (wParam == get_key(pad, i)) + { + set_bit(keyPress[pad], i); + clear_bit(keyRelease[pad], i); + break; + } + } + } + + event.evt = KEYPRESS; + event.key = wParam; + break; + + case WM_KEYUP: + for (int pad = 0; pad < 2; ++pad) + { + for (int i = 0; i < PADKEYS; i++) + { + if (wParam == get_key(pad,i)) + { + set_bit(keyRelease[pad], i); + clear_bit(keyPress[pad], i); + break; + } + } + } + + + event.evt = KEYRELEASE; + event.key = wParam; + break; + + /*case WM_LBUTTONDOWN: + lbutton = true; + break; + + case WM_LBUTTONUP: + g_lanalog[0].x = 0x80; + g_lanalog[0].y = 0x80; + g_lanalog[1].x = 0x80; + g_lanalog[1].y = 0x80; + lbutton = false; + break; + + case WM_RBUTTONDOWN: + rbutton = true; + break; + + case WM_RBUTTONUP: + g_ranalog[0].x = 0x80; + g_ranalog[0].y = 0x80; + g_ranalog[1].x = 0x80; + g_ranalog[1].y = 0x80; + rbutton = false; + break; + + case WM_MOUSEMOVE: + if (lbutton) + { + g_lanalog[0].x = LOWORD(lParam) & 254; + g_lanalog[0].y = HIWORD(lParam) & 254; + g_lanalog[1].x = LOWORD(lParam) & 254; + g_lanalog[1].y = HIWORD(lParam) & 254; + } + if (rbutton) + { + g_ranalog[0].x = LOWORD(lParam) & 254; + g_ranalog[0].y = HIWORD(lParam) & 254; + g_ranalog[1].x = LOWORD(lParam) & 254; + g_ranalog[1].y = HIWORD(lParam) & 254; + } + break;*/ + + case WM_DESTROY: + case WM_QUIT: + event.evt = KEYPRESS; + event.key = VK_ESCAPE; + return GSwndProc(hWnd, msg, wParam, lParam); + + default: + return GSwndProc(hWnd, msg, wParam, lParam); + } + + for (int pad = 0; pad < 2; ++pad) + { + UpdateKeys(pad, keyPress[pad], keyRelease[pad]); + } + + return TRUE; +} +#endif diff --git a/plugins/onepad/keyboard.h b/plugins/onepad/keyboard.h new file mode 100644 index 0000000000..a43b32da95 --- /dev/null +++ b/plugins/onepad/keyboard.h @@ -0,0 +1,47 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + + #ifndef __KEYBOARD_H__ + #define __KEYBOARD_H__ + +#include "onepad.h" + +#ifdef __LINUX__ + +#include "Linux/linux.h" + +extern Display *GSdsp; +extern void PollForX11KeyboardInput(int pad); +extern bool PollX11Keyboard(char* &temp, u32 &pkey); + +#else + +extern WNDPROC GSwndProc; +extern HWND GShwnd; + +#endif + +extern char* KeysymToChar(int keysym); +extern void PollForKeyboardInput(int pad); +extern void SetAutoRepeat(bool autorep); +extern __forceinline int FindKey(int key, int pad); + + #endif \ No newline at end of file diff --git a/plugins/onepad/missing b/plugins/onepad/missing new file mode 120000 index 0000000000..20bc5b0ed9 --- /dev/null +++ b/plugins/onepad/missing @@ -0,0 +1 @@ +/usr/share/automake-1.11/missing \ No newline at end of file diff --git a/plugins/onepad/mkinstalldirs b/plugins/onepad/mkinstalldirs new file mode 100644 index 0000000000..259dbfcd35 --- /dev/null +++ b/plugins/onepad/mkinstalldirs @@ -0,0 +1,158 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2005-06-29.22 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +errstatus=0 +dirmode= + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit $? + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit $? + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + case $file in + /*) pathcomp=/ ;; + *) pathcomp= ;; + esac + oIFS=$IFS + IFS=/ + set fnord $file + shift + IFS=$oIFS + + for d + do + test "x$d" = x && continue + + pathcomp=$pathcomp$d + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr= + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp=$pathcomp/ + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/plugins/onepad/onepad.cpp b/plugins/onepad/onepad.cpp new file mode 100644 index 0000000000..1a8ed56f72 --- /dev/null +++ b/plugins/onepad/onepad.cpp @@ -0,0 +1,602 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include +#include +#include +#include +#include + +#include "onepad.h" + +#ifndef _WIN32 + +#include +#else +#include "svnrev.h" +#endif + +char libraryName[256]; + +PADconf conf; + +keyEvent event; + +u16 status[2]; +int pressure; +static keyEvent s_event; +string s_strIniPath = "inis/OnePAD.ini"; + +const u32 version = PS2E_PAD_VERSION; +const u32 revision = 0; +const u32 build = 1; // increase that with each version + +int PadEnum[2][2] = {{0, 2}, {1, 3}}; + +u32 pads = 0; +u8 stdpar[2][20] = { + {0xff, 0x5a, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00}, + {0xff, 0x5a, 0xff, 0xff, 0x80, 0x80, 0x80, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00} +}; +u8 cmd40[2][8] = { + {0xff, 0x5a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x5a}, + {0xff, 0x5a, 0x00, 0x00, 0x02, 0x00, 0x00, 0x5a} +}; +u8 cmd41[2][8] = { + {0xff, 0x5a, 0xff, 0xff, 0x03, 0x00, 0x00, 0x5a}, + {0xff, 0x5a, 0xff, 0xff, 0x03, 0x00, 0x00, 0x5a} +}; +u8 unk46[2][8] = { + {0xFF, 0x5A, 0x00, 0x00, 0x01, 0x02, 0x00, 0x0A}, + {0xFF, 0x5A, 0x00, 0x00, 0x01, 0x02, 0x00, 0x0A} +}; +u8 unk47[2][8] = { + {0xff, 0x5a, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00}, + {0xff, 0x5a, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00} +}; +u8 unk4c[2][8] = { + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} +}; +u8 unk4d[2][8] = { + {0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, + {0xff, 0x5a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff} +}; +u8 cmd4f[2][8] = { + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a}, + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a} +}; +u8 stdcfg[2][8] = { + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} +}; // 2 & 3 = 0 +u8 stdmode[2][8] = { + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0xff, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} +}; +u8 stdmodel[2][8] = { + {0xff, + 0x5a, + 0x03, // 03 - dualshock2, 01 - dualshock + 0x02, // number of modes + 0x01, // current mode: 01 - analog, 00 - digital + 0x02, + 0x01, + 0x00}, + {0xff, + 0x5a, + 0x03, // 03 - dualshock2, 01 - dualshock + 0x02, // number of modes + 0x01, // current mode: 01 - analog, 00 - digital + 0x02, + 0x01, + 0x00} +}; + +u8 *buf; +int padID[2]; +int padMode[2]; +int curPad; +int curByte; +int curCmd; +int cmdLen; +int ds2mode = 0; // DS Mode at start +FILE *padLog = NULL; + +pthread_spinlock_t s_mutexStatus; +u32 s_keyPress[2], s_keyRelease[2]; + +static void InitLibraryName() +{ +#ifdef _WIN32 +# ifdef PUBLIC + + // Public Release! + // Output a simplified string that's just our name: + + strcpy(libraryName, "OnePAD"); + +# elif defined( SVN_REV_UNKNOWN ) + + // Unknown revision. + // Output a name that includes devbuild status but not + // subversion revision tags: + + strcpy(libraryName, "OnePAD" +# ifdef PCSX2_DEBUG + "-Debug" +# endif + ); +# else + + // Use TortoiseSVN's SubWCRev utility's output + // to label the specific revision: + + sprintf_s(libraryName, "OnePAD r%d%s" +# ifdef PCSX2_DEBUG + "-Debug" +# else + "-Dev" +# endif + , SVN_REV, + SVN_MODS ? "m" : "" + ); +# endif +#else +// I'll fix up SVN support later. --arcum42 + + strcpy(libraryName, "OnePAD" +# ifdef PCSX2_DEBUG + "-Debug" +# endif + ); +#endif +} + +EXPORT_C_(u32) PS2EgetLibType() +{ + return PS2E_LT_PAD; +} + +EXPORT_C_(char*) PS2EgetLibName() +{ + InitLibraryName(); + return libraryName; +} + +EXPORT_C_(u32) PS2EgetLibVersion2(u32 type) +{ + return (version << 16) | (revision << 8) | build; +} + +void __Log(const char *fmt, ...) +{ + va_list list; + + //if (padLog == NULL || !conf.log) return; + if (padLog == NULL) return; + va_start(list, fmt); + vfprintf(padLog, fmt, list); + va_end(list); +} + +void __LogToConsole(const char *fmt, ...) +{ + va_list list; + + va_start(list, fmt); + + if (padLog != NULL) vfprintf(padLog, fmt, list); + + printf("OnePAD: "); + vprintf(fmt, list); + va_end(list); +} + +void initLogging() +{ +#ifdef PAD_LOG + if (padLog == NULL) + { + padLog = fopen("logs/padLog.txt", "w"); + if (padLog) setvbuf(padLog, NULL, _IONBF, 0); + } + PAD_LOG("PADinit\n"); +#endif +} + +EXPORT_C_(s32) PADinit(u32 flags) +{ + initLogging(); + + pads |= flags; + status[0] = 0xffff; + status[1] = 0xffff; + +#ifdef __LINUX__ + char strcurdir[256]; + getcwd(strcurdir, 256); + s_strIniPath = strcurdir; + s_strIniPath += "/inis/OnePAD.ini"; +#endif + + LoadConfig(); + + PADsetMode(0, 0); + PADsetMode(1, 0); + + pressure = 100; + Analog::Init(); + + return 0; +} + +EXPORT_C_(void) PADshutdown() +{ +#ifdef PAD_LOG + if (padLog != NULL) + { + fclose(padLog); + padLog = NULL; + } +#endif +} + +EXPORT_C_(s32) PADopen(void *pDsp) +{ + memset(&event, 0, sizeof(event)); + + pthread_spin_init(&s_mutexStatus, PTHREAD_PROCESS_PRIVATE); + s_keyPress[0] = s_keyPress[1] = 0; + s_keyRelease[0] = s_keyRelease[1] = 0; + +#ifdef __LINUX__ + JoystickInfo::EnumerateJoysticks(s_vjoysticks); +#endif + return _PADopen(pDsp); +} + +EXPORT_C_(void) PADclose() +{ + pthread_spin_destroy(&s_mutexStatus); + _PADclose(); +} + +void _PADupdate(int pad) +{ + pthread_spin_lock(&s_mutexStatus); + status[pad] |= s_keyRelease[pad]; + status[pad] &= ~s_keyPress[pad]; + s_keyRelease[pad] = 0; + s_keyPress[pad] = 0; + pthread_spin_unlock(&s_mutexStatus); +} + +void UpdateKeys(int pad, int keyPress, int keyRelease) +{ + pthread_spin_lock(&s_mutexStatus); + s_keyPress[pad] |= keyPress; + s_keyPress[pad] &= ~keyRelease; + s_keyRelease[pad] |= keyRelease; + s_keyRelease[pad] &= ~keyPress; + pthread_spin_unlock(&s_mutexStatus); +} + +EXPORT_C_(u32) PADquery() +{ + return 3; // both +} + +void PADsetMode(int pad, int mode) +{ + padMode[pad] = mode; + switch (ds2mode) + { + case 0: // dualshock + switch (mode) + { + case 0: // digital + padID[pad] = 0x41; + break; + + case 1: // analog + padID[pad] = 0x73; + break; + } + break; + + case 1: // dualshock2 + switch (mode) + { + case 0: // digital + padID[pad] = 0x41; + break; + + case 1: // analog + padID[pad] = 0x79; + break; + } + break; + } +} + +EXPORT_C_(u8) PADstartPoll(int pad) +{ + //PAD_LOG("PADstartPoll: %d\n", pad); + + curPad = pad - 1; + curByte = 0; + + return 0xff; +} + +u8 _PADpoll(u8 value) +{ + u8 button_check = 0, button_check2 = 0; + const int avg_pressure = (pressure * 255) / 100; + + if (curByte == 0) + { + curByte++; + + //PAD_LOG("PADpoll: cmd: %x\n", value); + + curCmd = value; + switch (value) + { + case CMD_SET_VREF_PARAM: // DUALSHOCK2 ENABLER + cmdLen = 8; + buf = cmd40[curPad]; + return 0xf3; + + case CMD_QUERY_DS2_ANALOG_MODE: // QUERY_DS2_ANALOG_MODE + cmdLen = 8; + buf = cmd41[curPad]; + return 0xf3; + + case CMD_READ_DATA_AND_VIBRATE: // READ_DATA + + _PADupdate(curPad); + + stdpar[curPad][2] = status[curPad] >> 8; + stdpar[curPad][3] = status[curPad] & 0xff; + stdpar[curPad][4] = Analog::Pad(PAD_RX, curPad); + stdpar[curPad][5] = Analog::Pad(PAD_RY, curPad); + stdpar[curPad][6] = Analog::Pad(PAD_LX, curPad); + stdpar[curPad][7] = Analog::Pad(PAD_LY, curPad); + + if (padMode[curPad] == 1) + cmdLen = 20; + else + cmdLen = 4; + + button_check2 = stdpar[curPad][2] >> 4; + switch (stdpar[curPad][3]) + { + case 0xBF: // X + stdpar[curPad][14] = avg_pressure; + break; + + case 0xDF: // Circle + stdpar[curPad][13] = avg_pressure; + break; + + case 0xEF: // Triangle + stdpar[curPad][12] = avg_pressure; + break; + + case 0x7F: // Square + stdpar[curPad][15] = avg_pressure; + break; + + case 0xFB: // L1 + stdpar[curPad][16] = avg_pressure; + break; + + case 0xF7: // R1 + stdpar[curPad][17] = avg_pressure; + break; + + case 0xFE: // L2 + stdpar[curPad][18] = avg_pressure; + break; + + case 0xFD: // R2 + stdpar[curPad][19] = avg_pressure; + break; + + default: + stdpar[curPad][14] = 0x00; // Not pressed + stdpar[curPad][13] = 0x00; // Not pressed + stdpar[curPad][12] = 0x00; // Not pressed + stdpar[curPad][15] = 0x00; // Not pressed + stdpar[curPad][16] = 0x00; // Not pressed + stdpar[curPad][17] = 0x00; // Not pressed + stdpar[curPad][18] = 0x00; // Not pressed + stdpar[curPad][19] = 0x00; // Not pressed + break; + } + switch (button_check2) + { + case 0xE: // UP + stdpar[curPad][10] = avg_pressure; + break; + + case 0xB: // DOWN + stdpar[curPad][11] = avg_pressure; + break; + + case 0x7: // LEFT + stdpar[curPad][9] = avg_pressure; + break; + + case 0xD: // RIGHT + stdpar[curPad][8] = avg_pressure; + break; + + default: + stdpar[curPad][8] = 0x00; // Not pressed + stdpar[curPad][9] = 0x00; // Not pressed + stdpar[curPad][10] = 0x00; // Not pressed + stdpar[curPad][11] = 0x00; // Not pressed + break; + } + buf = stdpar[curPad]; + return padID[curPad]; + + case CMD_CONFIG_MODE: // CONFIG_MODE + cmdLen = 8; + buf = stdcfg[curPad]; + if (stdcfg[curPad][3] == 0xff) + return 0xf3; + else + return padID[curPad]; + + case CMD_SET_MODE_AND_LOCK: // SET_MODE_AND_LOCK + cmdLen = 8; + buf = stdmode[curPad]; + return 0xf3; + + case CMD_QUERY_MODEL_AND_MODE: // QUERY_MODEL_AND_MODE + cmdLen = 8; + buf = stdmodel[curPad]; + buf[4] = padMode[curPad]; + return 0xf3; + + case CMD_QUERY_ACT: // ?? + cmdLen = 8; + buf = unk46[curPad]; + return 0xf3; + + case CMD_QUERY_COMB: // ?? + cmdLen = 8; + buf = unk47[curPad]; + return 0xf3; + + case CMD_QUERY_MODE: // QUERY_MODE ?? + cmdLen = 8; + buf = unk4c[curPad]; + return 0xf3; + + case CMD_VIBRATION_TOGGLE: + cmdLen = 8; + buf = unk4d[curPad]; + return 0xf3; + + case CMD_SET_DS2_NATIVE_MODE: // SET_DS2_NATIVE_MODE + cmdLen = 8; + padID[curPad] = 0x79; // setting ds2 mode + ds2mode = 1; // Set DS2 Mode + buf = cmd4f[curPad]; + return 0xf3; + + default: + PAD_LOG("*PADpoll*: unknown cmd %x\n", value); + break; + } + } + + switch (curCmd) + { + case CMD_CONFIG_MODE: + if (curByte == 2) + { + switch (value) + { + case 0: + buf[2] = 0; + buf[3] = 0; + break; + case 1: + buf[2] = 0xff; + buf[3] = 0xff; + break; + } + } + break; + + case CMD_SET_MODE_AND_LOCK: + if (curByte == 2) + { + PADsetMode(curPad, value); + } + break; + + case CMD_QUERY_ACT: + if (curByte == 2) + { + switch (value) + { + case 0: // default + buf[5] = 0x2; + buf[6] = 0x0; + buf[7] = 0xA; + break; + case 1: // Param std conf change + buf[5] = 0x1; + buf[6] = 0x1; + buf[7] = 0x14; + break; + } + } + break; + + case CMD_QUERY_MODE: + if (curByte == 2) + { + switch (value) + { + case 0: // mode 0 - digital mode + buf[5] = 0x4; + break; + + case 1: // mode 1 - analog mode + buf[5] = 0x7; + break; + } + } + break; + } + + if (curByte >= cmdLen) return 0; + return buf[curByte++]; +} + +EXPORT_C_(u8) PADpoll(u8 value) +{ + u8 ret; + + ret = _PADpoll(value); + //PAD_LOG("PADpoll: %x (%d: %x)\n", value, curByte, ret); + return ret; +} + +// PADkeyEvent is called every vsync (return NULL if no event) +keyEvent* CALLBACK PADkeyEvent() +{ + s_event = event; + event.evt = 0; + return &s_event; +} diff --git a/plugins/onepad/onepad.h b/plugins/onepad/onepad.h new file mode 100644 index 0000000000..8056ac2619 --- /dev/null +++ b/plugins/onepad/onepad.h @@ -0,0 +1,168 @@ +/* OnePAD - author: arcum42(@gmail.com) + * Copyright (C) 2009 + * + * Based on ZeroPAD, author zerofrog@gmail.com + * Copyright (C) 2006-2007 + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef __PAD_H__ +#define __PAD_H__ + +#include +#include + +#ifdef _WIN32 +#include +#include + +#else + +#include +#include +#include + +#endif + +#include +#include +#include +#include +using namespace std; + +#define PADdefs +#include "PS2Edefs.h" + +#ifdef __LINUX__ +#include "joystick.h" +#endif +#include "analog.h" +#include "bitwise.h" +#include "controller.h" + +extern char libraryName[256]; + +enum PadOptions +{ + PADOPTION_FORCEFEEDBACK = 0x1, + PADOPTION_REVERTLX = 0x2, + PADOPTION_REVERTLY = 0x4, + PADOPTION_REVERTRX = 0x8, + PADOPTION_REVERTRY = 0x10 +}; + +extern FILE *padLog; +extern void initLogging(); +#define PAD_LOG __Log +//#define PAD_LOG __LogToConsole + +enum PadCommands +{ + CMD_SET_VREF_PARAM = 0x40, + CMD_QUERY_DS2_ANALOG_MODE = 0x41, + CMD_READ_DATA_AND_VIBRATE = 0x42, + CMD_CONFIG_MODE = 0x43, + CMD_SET_MODE_AND_LOCK = 0x44, + CMD_QUERY_MODEL_AND_MODE = 0x45, + CMD_QUERY_ACT = 0x46, // ?? + CMD_QUERY_COMB = 0x47, // ?? + CMD_QUERY_MODE = 0x4C, // QUERY_MODE ?? + CMD_VIBRATION_TOGGLE = 0x4D, + CMD_SET_DS2_NATIVE_MODE = 0x4F // SET_DS2_NATIVE_MODE +}; + +enum gamePadValues +{ + PAD_R_LEFT = 27, + PAD_R_DOWN = 26, + PAD_R_RIGHT = 25, + PAD_R_UP = 24, + PAD_L_LEFT = 23, + PAD_L_DOWN = 22, + PAD_L_RIGHT = 21, + PAD_L_UP = 20, + PAD_RY = 19, + PAD_LY = 18, + PAD_RX = 17, + PAD_LX = 16, + PAD_LEFT = 15, + PAD_DOWN = 14, + PAD_RIGHT = 13, + PAD_UP = 12, + PAD_START = 11, + PAD_R3 = 10, + PAD_L3 = 9, + PAD_SELECT = 8, + PAD_SQUARE = 7, + PAD_CROSS = 6, + PAD_CIRCLE = 5, + PAD_TRIANGLE = 4, + PAD_R1 = 3, + PAD_L1 = 2, + PAD_R2 = 1, + PAD_L2 = 0 +}; + +// Activate bolche's analog controls hack +// DEF_VALUE is the strength you press the control. +// Code taken from http://forums.pcsx2.net/thread-4699.html + +#define DEF_VALUE 32766 + +/* end of pad.h */ + +extern keyEvent event; + +extern u16 status[2]; +extern u32 pads; + +int POV(u32 direction, u32 angle); +s32 _PADopen(void *pDsp); +void _PADclose(); +void _KeyPress(int pad, u32 key); +void _KeyRelease(int pad, u32 key); +void PADsetMode(int pad, int mode); +void _PADupdate(int pad); + +void __Log(const char *fmt, ...); +void __LogToConsole(const char *fmt, ...); +void LoadConfig(); +void SaveConfig(); + +void SysMessage(char *fmt, ...); +void UpdateKeys(int pad, int keyPress, int keyRelease); + +#ifdef __cplusplus + +#ifdef _MSC_VER +#define EXPORT_C_(type) extern "C" __declspec(dllexport) type CALLBACK +#else +#define EXPORT_C_(type) extern "C" type +#endif + +#else + +#ifdef _MSC_VER +#define EXPORT_C_(type) __declspec(dllexport) type __stdcall +#else +#define EXPORT_C_(type) type +#endif + +#endif + +#endif + + diff --git a/plugins/zerospu2/zerospu2.cpp b/plugins/zerospu2/zerospu2.cpp index ead28339a7..e1953f8813 100644 --- a/plugins/zerospu2/zerospu2.cpp +++ b/plugins/zerospu2/zerospu2.cpp @@ -128,7 +128,7 @@ static void InitLibraryName() strcpy( libraryName, "ZeroSPU2" # ifdef PCSX2_DEBUG "-Debug" -# elseif ZEROSPU2_DEVBUILD +# elif defined( ZEROSPU2_DEVBUILD ) "-Dev" # endif ); @@ -140,7 +140,7 @@ static void InitLibraryName() sprintf_s( libraryName, "ZeroSPU2 r%d%s" # ifdef PCSX2_DEBUG "-Debug" -# elif ZEROSPU2_DEVBUILD +# elif defined( ZEROSPU2_DEVBUILD ) "-Dev" # endif ,SVN_REV, @@ -153,7 +153,7 @@ static void InitLibraryName() strcpy( libraryName, "ZeroSPU2 Playground" # ifdef PCSX2_DEBUG "-Debug" -# elif ZEROSPU2_DEVBUILD +# elif defined( ZEROSPU2_DEVBUILD ) "-Dev" # endif );