From 73d6a8aca0f36d247f977c3d49a8eb6e1c767d4a Mon Sep 17 00:00:00 2001 From: cottonvibes Date: Sat, 7 Feb 2009 01:20:44 +0000 Subject: [PATCH] - renamed pcsx2pg.ini to pcsx2.ini - made pcsx2 to default to MTGS mode "on" instead of "off" - renamed "Mega VU" recs to "Micro VU" recs since the team thought "Mega" sounded lame ;p git-svn-id: http://pcsx2.googlecode.com/svn/trunk@439 96395faa-99c1-11dd-bbfe-3dabce05a288 --- pcsx2/Misc.h | 2 +- pcsx2/windows/VCprojects/pcsx2_2008.vcproj | 14 +- pcsx2/windows/ini.cpp | 4 +- pcsx2/x86/{megaVU.cpp => microVU.cpp} | 123 +++++++++--------- pcsx2/x86/{megaVU.h => microVU.h} | 41 +++--- .../{megaVU_Upper.cpp => microVU_Lower.cpp} | 2 +- .../{megaVU_Tables.cpp => microVU_Tables.cpp} | 7 +- .../x86/{megaVU_Tables.h => microVU_Tables.h} | 14 +- .../{megaVU_Lower.cpp => microVU_Upper.cpp} | 2 +- 9 files changed, 104 insertions(+), 105 deletions(-) rename pcsx2/x86/{megaVU.cpp => microVU.cpp} (65%) rename pcsx2/x86/{megaVU.h => microVU.h} (73%) rename pcsx2/x86/{megaVU_Upper.cpp => microVU_Lower.cpp} (93%) rename pcsx2/x86/{megaVU_Tables.cpp => microVU_Tables.cpp} (96%) rename pcsx2/x86/{megaVU_Tables.h => microVU_Tables.h} (94%) rename pcsx2/x86/{megaVU_Lower.cpp => microVU_Upper.cpp} (93%) diff --git a/pcsx2/Misc.h b/pcsx2/Misc.h index c565cd14f8..aee267d74f 100644 --- a/pcsx2/Misc.h +++ b/pcsx2/Misc.h @@ -68,7 +68,7 @@ extern SessionOverrideFlags g_Session; ////////////////////////////////////////////////////////////////////////// // Pcsx2 User Configuration Options! -//#define PCSX2_MEGAVU // Use Mega VU recs instead of Zero VU Recs +//#define PCSX2_MICROVU // Use Micro VU recs instead of Zero VU Recs #define PCSX2_GSMULTITHREAD 1 // uses multi-threaded gs #define PCSX2_EEREC 0x10 #define PCSX2_VU0REC 0x20 diff --git a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj index cf261d7680..8462b56464 100644 --- a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj +++ b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj @@ -2325,30 +2325,30 @@ > diff --git a/pcsx2/windows/ini.cpp b/pcsx2/windows/ini.cpp index 6550996f8d..ce8ba15b67 100644 --- a/pcsx2/windows/ini.cpp +++ b/pcsx2/windows/ini.cpp @@ -49,7 +49,7 @@ static void GetConfigFilename( string& dest ) // Our current working directory can change, so we use the one we detected // at startup: - Path::Combine( dest, g_WorkingFolder, CONFIG_DIR "\\pcsx2pg.ini" ); + Path::Combine( dest, g_WorkingFolder, CONFIG_DIR "\\pcsx2.ini" ); } } @@ -128,7 +128,7 @@ public: //cpu SetCurrentSection( "Cpu" ); - Entry( "Options", Conf.Options, PCSX2_EEREC|PCSX2_VU0REC|PCSX2_VU1REC ); + Entry( "Options", Conf.Options, PCSX2_EEREC|PCSX2_VU0REC|PCSX2_VU1REC|PCSX2_GSMULTITHREAD ); Entry( "sseMXCSR", Conf.sseMXCSR, DEFAULT_sseMXCSR ); Entry( "sseVUMXCSR", Conf.sseVUMXCSR, DEFAULT_sseVUMXCSR ); Entry( "eeOptions", Conf.eeOptions, DEFAULT_eeOptions ); diff --git a/pcsx2/x86/megaVU.cpp b/pcsx2/x86/microVU.cpp similarity index 65% rename from pcsx2/x86/megaVU.cpp rename to pcsx2/x86/microVU.cpp index c166a76d0f..a1406ed9ca 100644 --- a/pcsx2/x86/megaVU.cpp +++ b/pcsx2/x86/microVU.cpp @@ -1,4 +1,4 @@ -/* Pcsx2-Playground - Pc Ps2 Emulator +/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2009 Pcsx2-Playground Team * * This program is free software; you can redistribute it and/or modify @@ -16,25 +16,24 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -// Mega VU(micro) recompiler! - author: cottonvibes(@gmail.com) +// Micro VU recompiler! - author: cottonvibes(@gmail.com) -#include "PrecompiledHeader.h" -#include "megaVU.h" -#ifdef PCSX2_MEGAVU +#include "microVU.h" +#ifdef PCSX2_MICROVU //------------------------------------------------------------------ -// Mega VU - Global Variables +// VU Micro - Global Variables //------------------------------------------------------------------ -megaVU megaVU0; -megaVU megaVU1; +microVU microVU0; +microVU microVU1; //------------------------------------------------------------------ -// Mega VU - Main Functions +// Micro VU - Main Functions //------------------------------------------------------------------ // Only run this once! ;) -__forceinline void mVUinit(megaVU* mVU, VURegs* vuRegsPtr, const int vuIndex) { +__forceinline void mVUinit(microVU* mVU, VURegs* vuRegsPtr, const int vuIndex) { mVU->regs = vuRegsPtr; mVU->index = vuIndex; @@ -45,7 +44,7 @@ __forceinline void mVUinit(megaVU* mVU, VURegs* vuRegsPtr, const int vuIndex) { for (int i; i <= mVU->prog.max; i++) { for (u32 j; j < mVU->progSize; j++) { - mVU->prog.prog[i].block[j] = new megaBlockManager(); + mVU->prog.prog[i].block[j] = new microBlockManager(); } } @@ -53,13 +52,13 @@ __forceinline void mVUinit(megaVU* mVU, VURegs* vuRegsPtr, const int vuIndex) { } // Will Optimize later -__forceinline void mVUreset(megaVU* mVU) { +__forceinline void mVUreset(microVU* mVU) { mVUclose(mVU); // Close // Dynarec Cache - mVU->cache = SysMmap(mVU->cacheAddr, mVU->cacheSize, 0x10000000, "Mega VU"); - if ( mVU->cache == NULL ) throw Exception::OutOfMemory(fmt_string( "megaVU Error: failed to allocate recompiler memory! (addr: 0x%x)", params (u32)mVU->cache)); + mVU->cache = SysMmapEx(mVU->cacheAddr, mVU->cacheSize, 0x10000000, "Mega VU"); + if ( mVU->cache == NULL ) throw Exception::OutOfMemory(fmt_string( "microVU Error: failed to allocate recompiler memory! (addr: 0x%x)", params (u32)mVU->cache)); // Other Variables ZeroMemory(&mVU->prog, sizeof(mVU->prog)); @@ -70,7 +69,7 @@ __forceinline void mVUreset(megaVU* mVU) { } // Free Allocated Resources -__forceinline void mVUclose(megaVU* mVU) { +__forceinline void mVUclose(microVU* mVU) { if ( mVU->cache ) { SysMunmap( mVU->cache, mVU->cacheSize ); mVU->cache = NULL; } @@ -82,7 +81,7 @@ __forceinline void mVUclose(megaVU* mVU) { } // Clears Block Data in specified range (Caches current microProgram if a difference has been found) -__forceinline void mVUclear(megaVU* mVU, u32 addr, u32 size) { +__forceinline void mVUclear(microVU* mVU, u32 addr, u32 size) { int i = addr/8; int end = i+((size+(8-(size&7)))/8); // ToDo: Can be simplified to addr+size if Size is always a multiple of 8 @@ -103,12 +102,12 @@ __forceinline void mVUclear(megaVU* mVU, u32 addr, u32 size) { } // Executes for number of cycles -void* mVUexecute(megaVU* mVU, u32 startPC, u32 cycles) { +void* mVUexecute(microVU* mVU, u32 startPC, u32 cycles) { return NULL; } // Executes till finished -void* mVUexecuteF(megaVU* mVU, u32 startPC) { +void* mVUexecuteF(microVU* mVU, u32 startPC) { //if (!mProg.finished) { // runMicroProgram(startPC); //} @@ -119,11 +118,11 @@ void* mVUexecuteF(megaVU* mVU, u32 startPC) { } //------------------------------------------------------------------ -// Mega VU - Private Functions +// Micro VU - Private Functions //------------------------------------------------------------------ // Finds the least used program -__forceinline int mVUfindLeastUsedProg(megaVU* mVU) { +__forceinline int mVUfindLeastUsedProg(microVU* mVU) { if (mVU->prog.total < mVU->prog.max) { mVU->prog.total++; return mVU->prog.total; @@ -142,14 +141,14 @@ __forceinline int mVUfindLeastUsedProg(megaVU* mVU) { } // Caches Micro Program if appropriate -__forceinline void mVUcacheProg(megaVU* mVU) { +__forceinline void mVUcacheProg(microVU* mVU) { if (!mVU->prog.prog[mVU->prog.cur].cached) { // If uncached, then cache memcpy_fast(mVU->prog.prog[mVU->prog.cur].data, mVU->regs->Micro, mVU->microSize); } } // Searches for Cached Micro Program and sets prog.cur (returns -1 if no program found) -__forceinline int mVUsearchProg(megaVU* mVU) { +__forceinline int mVUsearchProg(microVU* mVU) { if (mVU->prog.cleared) { // If cleared, we need to search for new program for (int i = 0; i <= mVU->prog.total; i++) { if (!memcmp_mmx(mVU->prog.prog[i].data, mVU->regs->Micro, mVU->microSize)) { @@ -167,38 +166,38 @@ __forceinline int mVUsearchProg(megaVU* mVU) { //------------------------------------------------------------------ // Runs till finished -__declspec(naked) void runVU0(megaVU* mVU, u32 startPC) { +__declspec(naked) void runVU0(microVU* mVU, u32 startPC) { __asm { mov eax, dword ptr [esp] - mov megaVU0.x86callstack, eax + mov microVU0.x86callstack, eax add esp, 4 call mVUexecuteF /*backup cpu state*/ - mov megaVU0.x86ebp, ebp - mov megaVU0.x86esi, esi - mov megaVU0.x86edi, edi - mov megaVU0.x86ebx, ebx - /*mov megaVU0.x86esp, esp*/ + mov microVU0.x86ebp, ebp + mov microVU0.x86esi, esi + mov microVU0.x86edi, edi + mov microVU0.x86ebx, ebx + /*mov microVU0.x86esp, esp*/ ldmxcsr g_sseVUMXCSR jmp eax } } -__declspec(naked) void runVU1(megaVU* mVU, u32 startPC) { +__declspec(naked) void runVU1(microVU* mVU, u32 startPC) { __asm { mov eax, dword ptr [esp] - mov megaVU1.x86callstack, eax + mov microVU1.x86callstack, eax add esp, 4 call mVUexecuteF /*backup cpu state*/ - mov megaVU1.x86ebp, ebp - mov megaVU1.x86esi, esi - mov megaVU1.x86edi, edi - mov megaVU1.x86ebx, ebx - /*mov megaVU1.x86esp, esp*/ + mov microVU1.x86ebp, ebp + mov microVU1.x86esi, esi + mov microVU1.x86edi, edi + mov microVU1.x86ebx, ebx + /*mov microVU1.x86esp, esp*/ ldmxcsr g_sseVUMXCSR @@ -207,38 +206,38 @@ __declspec(naked) void runVU1(megaVU* mVU, u32 startPC) { } // Runs for number of cycles -__declspec(naked) void runVU0(megaVU* mVU, u32 startPC, u32 cycles) { +__declspec(naked) void runVU0(microVU* mVU, u32 startPC, u32 cycles) { __asm { mov eax, dword ptr [esp] - mov megaVU0.x86callstack, eax + mov microVU0.x86callstack, eax add esp, 4 call mVUexecute /*backup cpu state*/ - mov megaVU0.x86ebp, ebp - mov megaVU0.x86esi, esi - mov megaVU0.x86edi, edi - mov megaVU0.x86ebx, ebx - /*mov megaVU0.x86esp, esp*/ + mov microVU0.x86ebp, ebp + mov microVU0.x86esi, esi + mov microVU0.x86edi, edi + mov microVU0.x86ebx, ebx + /*mov microVU0.x86esp, esp*/ ldmxcsr g_sseVUMXCSR jmp eax } } -__declspec(naked) void runVU1(megaVU* mVU, u32 startPC, u32 cycles) { +__declspec(naked) void runVU1(microVU* mVU, u32 startPC, u32 cycles) { __asm { mov eax, dword ptr [esp] - mov megaVU1.x86callstack, eax + mov microVU1.x86callstack, eax add esp, 4 call mVUexecute /*backup cpu state*/ - mov megaVU1.x86ebp, ebp - mov megaVU1.x86esi, esi - mov megaVU1.x86edi, edi - mov megaVU1.x86ebx, ebx - /*mov megaVU1.x86esp, esp*/ + mov microVU1.x86ebp, ebp + mov microVU1.x86esi, esi + mov microVU1.x86edi, edi + mov microVU1.x86ebx, ebx + /*mov microVU1.x86esp, esp*/ ldmxcsr g_sseVUMXCSR @@ -250,33 +249,33 @@ __declspec(naked) void runVU1(megaVU* mVU, u32 startPC, u32 cycles) { //------------------------------------------------------------------ __forceinline void initVUrec(VURegs* vuRegs, int vuIndex) { - if (!vuIndex) mVUinit(&megaVU0, vuRegs, 0); - else mVUinit(&megaVU1, vuRegs, 1); + if (!vuIndex) mVUinit(µVU0, vuRegs, 0); + else mVUinit(µVU1, vuRegs, 1); } __forceinline void closeVUrec(int vuIndex) { - if (!vuIndex) mVUclose(&megaVU0); - else mVUclose(&megaVU1); + if (!vuIndex) mVUclose(µVU0); + else mVUclose(µVU1); } __forceinline void resetVUrec(int vuIndex) { - if (!vuIndex) mVUreset(&megaVU0); - else mVUreset(&megaVU1); + if (!vuIndex) mVUreset(µVU0); + else mVUreset(µVU1); } __forceinline void clearVUrec(u32 addr, u32 size, int vuIndex) { - if (!vuIndex) mVUclear(&megaVU0, addr, size); - else mVUclear(&megaVU1, addr, size); + if (!vuIndex) mVUclear(µVU0, addr, size); + else mVUclear(µVU1, addr, size); } __forceinline void runVUrec(u32 startPC, int vuIndex) { - if (!vuIndex) runVU0(&megaVU0, startPC); - else runVU1(&megaVU1, startPC); + if (!vuIndex) runVU0(µVU0, startPC); + else runVU1(µVU1, startPC); } __forceinline void runVUrec(u32 startPC, u32 cycles, int vuIndex) { - if (!vuIndex) runVU0(&megaVU0, startPC, cycles); - else runVU1(&megaVU1, startPC, cycles); + if (!vuIndex) runVU0(µVU0, startPC, cycles); + else runVU1(µVU1, startPC, cycles); } #endif // PCSX2_MEGAVU diff --git a/pcsx2/x86/megaVU.h b/pcsx2/x86/microVU.h similarity index 73% rename from pcsx2/x86/megaVU.h rename to pcsx2/x86/microVU.h index 835abb46ab..eaea63d7fc 100644 --- a/pcsx2/x86/megaVU.h +++ b/pcsx2/x86/microVU.h @@ -1,4 +1,4 @@ -/* Pcsx2-Playground - Pc Ps2 Emulator +/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2009 Pcsx2-Playground Team * * This program is free software; you can redistribute it and/or modify @@ -17,12 +17,13 @@ */ #pragma once +#include "PrecompiledHeader.h" #include "Common.h" #include "VU.h" -#include "megaVU_Tables.h" +#include "microVU_Tables.h" //#include -struct megaBlock { +struct microBlock { u32 pipelineState; // FMACx|y|z|w | FDiv | EFU | IALU | BRANCH // Still thinking of how I'm going to do this u32 x86ptrStart; u32 x86ptrEnd; @@ -31,19 +32,19 @@ struct megaBlock { }; #define mMaxBlocks 32 // Max Blocks With Different Pipeline States (For n = 1, 2, 4, 8, 16, etc...) -class megaBlockManager { +class microBlockManager { private: static const int MaxBlocks = mMaxBlocks - 1; u32 startPC; u32 endPC; int listSize; // Total Items - 1 int callerSize; // Total Callers - 1 - megaBlock blockList[mMaxBlocks]; - megaBlock callersList[mMaxBlocks]; // Foreign Blocks that call Local Blocks + microBlock blockList[mMaxBlocks]; + microBlock callersList[mMaxBlocks]; // Foreign Blocks that call Local Blocks public: - megaBlockManager() { init(); } - ~megaBlockManager() { close(); } + microBlockManager() { init(); } + ~microBlockManager() { close(); } void init() { listSize = -1; callerSize = -1; @@ -58,7 +59,7 @@ public: blockList[listSize].x86ptrStart = x86ptrStart; } } - megaBlock* search(u32 pipelineState) { + microBlock* search(u32 pipelineState) { for (int i = 0; i < listSize; i++) { if (blockList[i].pipelineState == pipelineState) return &blockList[i]; } @@ -80,7 +81,7 @@ struct microProgram { u8 data[progSize]; u32 used; // Number of times its been used int cached; // Has been Cached? - megaBlockManager* block[progSize]; + microBlockManager* block[progSize]; }; #define mMaxProg 16 // The amount of Micro Programs Recs will 'remember' (For n = 1, 2, 4, 8, 16, etc...) @@ -94,7 +95,7 @@ struct microProgManager { int finished; // Completed MicroProgram to E-bit Termination }; -struct megaVU { +struct microVU { int index; // VU Index (VU0 or VU1) u32 microSize; // VU Micro Memory Size u32 progSize; // VU Micro Program Size (microSize/8) @@ -120,13 +121,13 @@ extern void (*mVU_UPPER_OPCODE[64])( VURegs* VU, s32 info ); extern void (*mVU_LOWER_OPCODE[128])( VURegs* VU, s32 info ); //void invalidateBlocks(u32 addr, u32 size); // Invalidates Blocks in the range [addr, addr+size) -__forceinline void mVUinit(megaVU* mVU, VURegs* vuRegsPtr, const int vuIndex); -__forceinline void mVUreset(megaVU* mVU); -__forceinline void mVUclose(megaVU* mVU); -__forceinline void mVUclear(megaVU* mVU, u32 addr, u32 size); // Clears part of a Micro Program (must use before modifying micro program!) -void* mVUexecute(megaVU* mVU, u32 startPC, u32 cycles); // Recompiles/Executes code for the number of cycles indicated (will always run for >= 'cycles' amount unless 'finished') -void* mVUexecuteF(megaVU* mVU, u32 startPC); // Recompiles/Executes code till finished +__forceinline void mVUinit(microVU* mVU, VURegs* vuRegsPtr, const int vuIndex); +__forceinline void mVUreset(microVU* mVU); +__forceinline void mVUclose(microVU* mVU); +__forceinline void mVUclear(microVU* mVU, u32 addr, u32 size); // Clears part of a Micro Program (must use before modifying micro program!) +void* mVUexecute(microVU* mVU, u32 startPC, u32 cycles); // Recompiles/Executes code for the number of cycles indicated (will always run for >= 'cycles' amount unless 'finished') +void* mVUexecuteF(microVU* mVU, u32 startPC); // Recompiles/Executes code till finished -__forceinline int mVUfindLeastUsedProg(megaVU* mVU); -__forceinline int mVUsearchProg(megaVU* mVU); -__forceinline void mVUcacheProg(megaVU* mVU); +__forceinline int mVUfindLeastUsedProg(microVU* mVU); +__forceinline int mVUsearchProg(microVU* mVU); +__forceinline void mVUcacheProg(microVU* mVU); diff --git a/pcsx2/x86/megaVU_Upper.cpp b/pcsx2/x86/microVU_Lower.cpp similarity index 93% rename from pcsx2/x86/megaVU_Upper.cpp rename to pcsx2/x86/microVU_Lower.cpp index ff5336096f..74cd64b17c 100644 --- a/pcsx2/x86/megaVU_Upper.cpp +++ b/pcsx2/x86/microVU_Lower.cpp @@ -1,4 +1,4 @@ -/* Pcsx2-Playground - Pc Ps2 Emulator +/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2009 Pcsx2-Playground Team * * This program is free software; you can redistribute it and/or modify diff --git a/pcsx2/x86/megaVU_Tables.cpp b/pcsx2/x86/microVU_Tables.cpp similarity index 96% rename from pcsx2/x86/megaVU_Tables.cpp rename to pcsx2/x86/microVU_Tables.cpp index 0ff0f89360..fb3759bbe3 100644 --- a/pcsx2/x86/megaVU_Tables.cpp +++ b/pcsx2/x86/microVU_Tables.cpp @@ -1,4 +1,4 @@ -/* Pcsx2-Playground - Pc Ps2 Emulator +/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2009 Pcsx2-Playground Team * * This program is free software; you can redistribute it and/or modify @@ -16,10 +16,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -#include "PrecompiledHeader.h" -#include "megaVU.h" +#include "microVU.h" -#ifdef PCSX2_MEGAVU_lulz +#ifdef PCSX2_MICROVU_lulz void mVU_UPPER_FD_00(VURegs* VU, s32 info); void mVU_UPPER_FD_01(VURegs* VU, s32 info); diff --git a/pcsx2/x86/megaVU_Tables.h b/pcsx2/x86/microVU_Tables.h similarity index 94% rename from pcsx2/x86/megaVU_Tables.h rename to pcsx2/x86/microVU_Tables.h index 6c2a7bc025..deee5d5ed6 100644 --- a/pcsx2/x86/megaVU_Tables.h +++ b/pcsx2/x86/microVU_Tables.h @@ -1,4 +1,4 @@ -/* Pcsx2-Playground - Pc Ps2 Emulator +/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2009 Pcsx2-Playground Team * * This program is free software; you can redistribute it and/or modify @@ -99,12 +99,12 @@ void mVU_MAXx(VURegs *vuRegs, int info); void mVU_MAXy(VURegs *vuRegs, int info); void mVU_MAXz(VURegs *vuRegs, int info); void mVU_MAXw(VURegs *vuRegs, int info); -void mVU_MIN(VURegs *vuRegs, int info); -void mVU_MINi(VURegs *vuRegs, int info); -void mVU_MINx(VURegs *vuRegs, int info); -void mVU_MINy(VURegs *vuRegs, int info); -void mVU_MINz(VURegs *vuRegs, int info); -void mVU_MINw(VURegs *vuRegs, int info); +void mVU_MINI(VURegs *vuRegs, int info); +void mVU_MINIi(VURegs *vuRegs, int info); +void mVU_MINIx(VURegs *vuRegs, int info); +void mVU_MINIy(VURegs *vuRegs, int info); +void mVU_MINIz(VURegs *vuRegs, int info); +void mVU_MINIw(VURegs *vuRegs, int info); void mVU_OPMULA(VURegs *vuRegs, int info); void mVU_OPMSUB(VURegs *vuRegs, int info); void mVU_NOP(VURegs *vuRegs, int info); diff --git a/pcsx2/x86/megaVU_Lower.cpp b/pcsx2/x86/microVU_Upper.cpp similarity index 93% rename from pcsx2/x86/megaVU_Lower.cpp rename to pcsx2/x86/microVU_Upper.cpp index ff5336096f..74cd64b17c 100644 --- a/pcsx2/x86/megaVU_Lower.cpp +++ b/pcsx2/x86/microVU_Upper.cpp @@ -1,4 +1,4 @@ -/* Pcsx2-Playground - Pc Ps2 Emulator +/* Pcsx2 - Pc Ps2 Emulator * Copyright (C) 2009 Pcsx2-Playground Team * * This program is free software; you can redistribute it and/or modify