wxgui: Moved some more files around in Common/Utilities, and merged against trunk.

git-svn-id: http://pcsx2.googlecode.com/svn/branches/wxgui@1460 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2009-07-03 20:48:11 +00:00
commit fb6a8939b0
86 changed files with 9050 additions and 1718 deletions

View File

@ -1,84 +1,84 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="Utilities" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="../../deps/debug/libUtilities.a" prefix_auto="0" extension_auto="0" />
<Option working_dir="" />
<Option object_output="./.objs/debug/" />
<Option type="2" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Compiler>
<Add option="-Wall" />
<Add option="-g" />
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=yes --cflags`" />
<Add directory="../../include/Utilities" />
<Add directory="../../include" />
</Compiler>
</Target>
<Target title="Release">
<Option output="../../deps/release/libUtilities.a" prefix_auto="0" extension_auto="0" />
<Option working_dir="" />
<Option object_output="./.objs/release/" />
<Option type="2" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Compiler>
<Add option="-O2" />
<Add option="-Wall" />
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=no --cflags`" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
<Target title="Devel">
<Option output="../../deps/devel/libUtilities.a" prefix_auto="0" extension_auto="0" />
<Option working_dir="" />
<Option object_output="./.objs/devel/" />
<Option type="2" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Compiler>
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=yes --cflags`" />
</Compiler>
</Target>
</Build>
<Unit filename="../../include/Utilities/Console.h" />
<Unit filename="../../include/Utilities/Dependencies.h" />
<Unit filename="../../include/Utilities/Exceptions.h" />
<Unit filename="../../include/Utilities/General.h" />
<Unit filename="../../include/Utilities/MemcpyFast.h" />
<Unit filename="../../include/Utilities/RedtapeWindows.h" />
<Unit filename="../../include/Utilities/SafeArray.h" />
<Unit filename="../../include/Utilities/StringHelpers.h" />
<Unit filename="../../include/Utilities/Threading.h" />
<Unit filename="../../include/Utilities/lnx_memzero.h" />
<Unit filename="../../include/Utilities/win_memzero.h" />
<Unit filename="../../include/intrin_x86.h" />
<Unit filename="../../src/Utilities/AlignedMalloc.cpp" />
<Unit filename="../../src/Utilities/Console.cpp" />
<Unit filename="../../src/Utilities/Exceptions.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxHostSys.cpp" />
<Unit filename="../../src/Utilities/LnxMisc.cpp" />
<Unit filename="../../src/Utilities/LnxThreads.cpp" />
<Unit filename="../../src/Utilities/PrecompiledHeader.cpp" />
<Unit filename="../../src/Utilities/PrecompiledHeader.h" />
<Unit filename="../../src/Utilities/StringHelpers.cpp" />
<Unit filename="../../src/Utilities/ThreadTools.cpp" />
<Unit filename="../../src/Utilities/vssprintf.cpp" />
<Unit filename="../../src/Utilities/x86/MemcpyFast.S" />
<Extensions>
<envvars />
<code_completion>
<search_path add="/usr/include/wx-2.8" />
</code_completion>
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
<Option title="Utilities" />
<Option pch_mode="2" />
<Option compiler="gcc" />
<Build>
<Target title="Debug">
<Option output="../../deps/debug/libUtilities.a" prefix_auto="0" extension_auto="0" />
<Option working_dir="" />
<Option object_output="./.objs/debug/" />
<Option type="2" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Compiler>
<Add option="-Wall" />
<Add option="-g" />
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=yes --cflags`" />
<Add directory="../../include/Utilities" />
<Add directory="../../include" />
</Compiler>
</Target>
<Target title="Release">
<Option output="../../deps/release/libUtilities.a" prefix_auto="0" extension_auto="0" />
<Option working_dir="" />
<Option object_output="./.objs/release/" />
<Option type="2" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Compiler>
<Add option="-O2" />
<Add option="-Wall" />
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=no --cflags`" />
</Compiler>
<Linker>
<Add option="-s" />
</Linker>
</Target>
<Target title="Devel">
<Option output="../../deps/devel/libUtilities.a" prefix_auto="0" extension_auto="0" />
<Option working_dir="" />
<Option object_output="./.objs/devel/" />
<Option type="2" />
<Option compiler="gcc" />
<Option createDefFile="1" />
<Compiler>
<Add option="`wx-config --version=2.8 --static=no --unicode=yes --debug=yes --cflags`" />
</Compiler>
</Target>
</Build>
<Unit filename="../../include/Utilities/Console.h" />
<Unit filename="../../include/Utilities/Dependencies.h" />
<Unit filename="../../include/Utilities/Exceptions.h" />
<Unit filename="../../include/Utilities/General.h" />
<Unit filename="../../include/Utilities/MemcpyFast.h" />
<Unit filename="../../include/Utilities/RedtapeWindows.h" />
<Unit filename="../../include/Utilities/SafeArray.h" />
<Unit filename="../../include/Utilities/StringHelpers.h" />
<Unit filename="../../include/Utilities/Threading.h" />
<Unit filename="../../include/Utilities/lnx_memzero.h" />
<Unit filename="../../include/Utilities/win_memzero.h" />
<Unit filename="../../include/intrin_x86.h" />
<Unit filename="../../src/Utilities/AlignedMalloc.cpp" />
<Unit filename="../../src/Utilities/Console.cpp" />
<Unit filename="../../src/Utilities/Exceptions.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxHostSys.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxMisc.cpp" />
<Unit filename="../../src/Utilities/Linux/LnxThreads.cpp" />
<Unit filename="../../src/Utilities/PrecompiledHeader.cpp" />
<Unit filename="../../src/Utilities/PrecompiledHeader.h" />
<Unit filename="../../src/Utilities/StringHelpers.cpp" />
<Unit filename="../../src/Utilities/ThreadTools.cpp" />
<Unit filename="../../src/Utilities/vssprintf.cpp" />
<Unit filename="../../src/Utilities/x86/MemcpyFast.S" />
<Extensions>
<envvars />
<code_completion>
<search_path add="/usr/include/wx-2.8" />
</code_completion>
<debugger />
</Extensions>
</Project>
</CodeBlocks_project_file>

View File

@ -227,11 +227,11 @@
>
</File>
<File
RelativePath="..\..\src\Utilities\WinMisc.cpp"
RelativePath="..\..\src\Utilities\Windows\WinMisc.cpp"
>
</File>
<File
RelativePath="..\..\src\Utilities\WinThreads.cpp"
RelativePath="..\..\src\Utilities\Windows\WinThreads.cpp"
>
</File>
<Filter
@ -266,7 +266,7 @@
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\Utilities\LnxMisc.cpp"
RelativePath="..\..\src\Utilities\Linux\LnxMisc.cpp"
>
<FileConfiguration
Name="Debug|Win32"
@ -294,7 +294,7 @@
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\Utilities\LnxThreads.cpp"
RelativePath="..\..\src\Utilities\Linux\LnxThreads.cpp"
>
<FileConfiguration
Name="Debug|Win32"

View File

@ -60,6 +60,7 @@ namespace Threading
pthread_mutex_t mutex;
MutexLock();
MutexLock( bool isRecursive );
~MutexLock();
void Lock();

View File

@ -16,7 +16,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "PrecompiledHeader.h"
#include "../PrecompiledHeader.h"
#include <ctype.h>
#include <time.h>

View File

@ -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"

View File

@ -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 );

View File

@ -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;

View File

@ -17,7 +17,7 @@
*/
#include "PrecompiledHeader.h"
#include "../PrecompiledHeader.h"
#include "RedtapeWindows.h"
#include "x86emitter/tools.h"
#include "Threading.h"

View File

@ -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
}

View File

@ -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}}

View File

@ -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}}

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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 programs 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 teams 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

View File

@ -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.

View File

@ -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}

View File

@ -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)

View File

@ -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;

View File

@ -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];

View File

@ -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 <wx/statline.h>
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 <wx/statline.h>
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

View File

@ -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:

View File

@ -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;

View File

@ -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))

View File

@ -90,6 +90,8 @@ __forceinline DataType __fastcall MemOp_r0(u32 addr)
jNO_DEFAULT;
}
return 0; // technically unreachable, but suppresses warnings.
}
// ------------------------------------------------------------------------

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="windows-1253"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Version="9,00"
Name="pcsx2"
ProjectGUID="{1CEFD830-2B76-4596-A4EE-BCD7280A60BD}"
RootNamespace="pcsx2"
@ -854,19 +854,11 @@
>
</File>
<File
RelativePath="..\..\Docs\PS2Edefs.txt"
RelativePath="..\..\Docs\PCSX2 FAQ 0.9.6.rtf"
>
</File>
<File
RelativePath="..\..\Docs\readme 0.9.4.txt"
>
</File>
<File
RelativePath="..\..\Docs\readme Playground.txt"
>
</File>
<File
RelativePath="..\..\Docs\RemoteDebugging.txt"
RelativePath="..\..\Docs\PCSX2 readme 0.9.6.rtf"
>
</File>
</Filter>

View File

@ -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<vuIndex>(smallidx); // Clear old data if overwriting old program
mVUcacheProg<vuIndex>(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<vuIndex>(smallidx); // Clear old data if overwriting old program
mVUcacheProg<vuIndex>(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<vuIndex>(z);
mVU->prog.prog[z].used = 0;
mVU->prog.prog[z].last_used = 0;
}
mVU->prog.total = 0;
mVUcacheProg<vuIndex>(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;
}

View File

@ -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<mProgSize> 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<mProgSize> 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)

View File

@ -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);
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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<u32 pSize>
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)

View File

@ -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_);
}

View File

@ -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) { \

View File

@ -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<uint32, CRC::Game*> CRC::m_map;

View File

@ -34,6 +34,7 @@ public:
KyuuketsuKitanMoonties,
PiaCarroteYoukosoGPGakuenPrincess,
KazokuKeikakuKokoroNoKizuna,
DuelSaviorDestiny,
FFX,
FFX2,
FFXII,
@ -70,6 +71,9 @@ public:
SonicUnleashed,
SimpsonsGame,
Genji,
StarOcean3,
ValkyrieProfile2,
RadiataStories,
TitleCount,
};

View File

@ -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)

View File

@ -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;

View File

@ -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

View File

@ -54,9 +54,9 @@ GSTextureCache::Source* GSTextureCache::LookupSource(const GIFRegTEX0& TEX0, con
Source* src = NULL;
const hash_map<Source*, bool>& map = m_src.m_map[TEX0.TBP0 >> 5];
hash_map<Source*, bool>& m = m_src.m_map[TEX0.TBP0 >> 5];
for(hash_map<Source*, bool>::const_iterator i = map.begin(); i != map.end(); i++)
for(hash_map<Source*, bool>::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<Source*, bool>& map = m_src.m_map[bp >> 5];
const hash_map<Source*, bool>& m = m_src.m_map[bp >> 5];
for(hash_map<Source*, bool>::const_iterator i = map.begin(); i != map.end(); )
for(hash_map<Source*, bool>::const_iterator i = m.begin(); i != m.end(); )
{
hash_map<Source*, bool>::const_iterator j = i++;
@ -267,9 +267,9 @@ void GSTextureCache::InvalidateVideoMem(const GIFRegBITBLTBUF& BITBLTBUF, const
if(page < MAX_PAGES)
{
const hash_map<Source*, bool>& map = m_src.m_map[page];
const hash_map<Source*, bool>& m = m_src.m_map[page];
for(hash_map<Source*, bool>::const_iterator i = map.begin(); i != map.end(); )
for(hash_map<Source*, bool>::const_iterator i = m.begin(); i != m.end(); )
{
hash_map<Source*, bool>::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<GSVector4i::Outside>(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<Source*, bool>* 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;

View File

@ -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<Source*, bool> m_surfaces;
hash_map<Source*, bool> 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();

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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<GSTexture*, bool>* 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<GSVector4i::Outside>(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;
}

View File

@ -48,6 +48,7 @@ protected:
GSState* m_state;
hash_map<GSTexture*, bool> m_textures;
hash_map<GSTexture*, bool> m_map[MAX_PAGES];
uint32 m_pages[16];
public:
GSTextureCacheSW(GSState* state);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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()))

View File

@ -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)

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -0,0 +1,131 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <gtk/gtk.h>
#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)
{
}

View File

@ -0,0 +1,63 @@
#include <gtk/gtk.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);

View File

@ -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 <string.h>
#include <gtk/gtk.h>
#include <pthread.h>
#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;
}

View File

@ -0,0 +1,710 @@
/*
* DO NOT EDIT THIS FILE - it is generated by Glade.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
#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 <linuzappz@hotmail.com>",
"florin sasu <florinsasu@hotmail.com>",
"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 (_("<b>Choose PAD to modify</b>"));
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;
}

View File

@ -0,0 +1,6 @@
/*
* DO NOT EDIT THIS FILE - it is generated by Glade.
*/
GtkWidget* create_About (void);
GtkWidget* create_Conf (void);

View File

@ -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<JoystickInfo*>::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<JoystickInfo*>::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<JoystickInfo*>::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();
}

View File

@ -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 <string.h>
#include <gtk/gtk.h>
#include <gdk/gdkkeysyms.h>
#include <pthread.h>
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)

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,12 @@
<?xml version="1.0" standalone="no"?> <!--*- mode: xml -*-->
<!DOCTYPE glade-project SYSTEM "http://glade.gnome.org/glade-project-2.0.dtd">
<glade-project>
<name>Linux</name>
<program_name>linux</program_name>
<gnome_support>FALSE</gnome_support>
<use_widget_names>TRUE</use_widget_names>
<output_main_file>FALSE</output_main_file>
<output_build_files>FALSE</output_build_files>
<backup_source_files>FALSE</backup_source_files>
</glade-project>

View File

@ -0,0 +1,144 @@
/*
* DO NOT EDIT THIS FILE - it is generated by Glade.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <gtk/gtk.h>
#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);
}
}

View File

@ -0,0 +1,69 @@
/*
* DO NOT EDIT THIS FILE - it is generated by Glade.
*/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <gtk/gtk.h>
/*
* Standard gettext macros.
*/
#ifdef ENABLE_NLS
# include <libintl.h>
# 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);

View File

@ -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

View File

973
plugins/onepad/aclocal.m4 vendored Normal file
View File

@ -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 <conftest.tar])
grep GrepMe conftest.dir/file >/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

165
plugins/onepad/analog.cpp Normal file
View File

@ -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;
}
}

36
plugins/onepad/analog.h Normal file
View File

@ -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);
}

44
plugins/onepad/bitwise.h Normal file
View File

@ -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 <class T>
static void __forceinline set_bit(T &value, int bit)
{
value |= (1 << bit);
}
template <class T>
static void __forceinline clear_bit(T &value, int bit)
{
value &= ~(1 << bit);
}
template <class T>
static void __forceinline toggle_bit(T &value, int bit)
{
value ^= (1 << bit);
}
template <class T>
static bool __forceinline test_bit(T &value, int bit)
{
return (value & (1 << bit));
}

29
plugins/onepad/build.sh Executable file
View File

@ -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

View File

@ -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"

View File

@ -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);
}

View File

@ -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

529
plugins/onepad/depcomp Normal file
View File

@ -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 <oliva@dcc.unicamp.br>.
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 <bug-automake@gnu.org>.
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:

1
plugins/onepad/install-sh Symbolic link
View File

@ -0,0 +1 @@
/usr/share/automake-1.11/install-sh

288
plugins/onepad/joystick.cpp Normal file
View File

@ -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<JoystickInfo*> s_vjoysticks;
static u32 s_bSDLInit = false;
void UpdateJoysticks()
{
vector<JoystickInfo*>::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<JoystickInfo*>& vjoysticks)
{
if (!s_bSDLInit)
{
if (SDL_Init(SDL_INIT_JOYSTICK) < 0) return;
SDL_JoystickEventState(SDL_QUERY);
s_bSDLInit = true;
}
vector<JoystickInfo*>::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;
}

151
plugins/onepad/joystick.h Normal file
View File

@ -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 <SDL/SDL.h>
#else
#include <SDL.h>
#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<JoystickInfo*>& 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<int> vbuttonstate, vaxisstate, vhatstate;
SDL_Joystick* joy;
};
extern int s_selectedpad;
extern vector<JoystickInfo*> s_vjoysticks;
extern void UpdateJoysticks();
extern const char *HatName(int value);
extern bool JoystickIdWithinBounds(int joyid);
#endif

284
plugins/onepad/keyboard.cpp Normal file
View File

@ -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

47
plugins/onepad/keyboard.h Normal file
View File

@ -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

1
plugins/onepad/missing Symbolic link
View File

@ -0,0 +1 @@
/usr/share/automake-1.11/missing

View File

@ -0,0 +1,158 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
scriptversion=2005-06-29.22
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain.
#
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
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 <bug-automake@gnu.org>."
# 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:

602
plugins/onepad/onepad.cpp Normal file
View File

@ -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 <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <stdarg.h>
#include "onepad.h"
#ifndef _WIN32
#include <unistd.h>
#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;
}

168
plugins/onepad/onepad.h Normal file
View File

@ -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 <stdio.h>
#include <assert.h>
#ifdef _WIN32
#include <windows.h>
#include <windowsx.h>
#else
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/keysym.h>
#endif
#include <vector>
#include <map>
#include <string>
#include <pthread.h>
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

View File

@ -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
);