mirror of https://github.com/PCSX2/pcsx2.git
wxgui: separated core emulation options from user interface options (mostly! some interdependencies remain), and stripped out some of the old framelimiting toggle/cycle code, which will be replaced with a better framelimiter system soon.
git-svn-id: http://pcsx2.googlecode.com/svn/branches/wxgui@1602 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
bafd21140f
commit
4836aac1f5
|
@ -31,7 +31,6 @@
|
||||||
|
|
||||||
#include "Pcsx2Types.h"
|
#include "Pcsx2Types.h"
|
||||||
#include "Pcsx2Defs.h"
|
#include "Pcsx2Defs.h"
|
||||||
#include "Pcsx2Config.h"
|
|
||||||
|
|
||||||
// Indicate to use the new versions.
|
// Indicate to use the new versions.
|
||||||
#define NEW_PLUGIN_APIS
|
#define NEW_PLUGIN_APIS
|
||||||
|
|
|
@ -25,6 +25,8 @@
|
||||||
#include "IsoFStools.h"
|
#include "IsoFStools.h"
|
||||||
#include "CDVD_internal.h"
|
#include "CDVD_internal.h"
|
||||||
#include "CDVDisoReader.h"
|
#include "CDVDisoReader.h"
|
||||||
|
#include "gs.h" // for gsRegionMode
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
static cdvdStruct cdvd;
|
static cdvdStruct cdvd;
|
||||||
|
|
||||||
|
@ -861,7 +863,7 @@ u8 monthmap[13] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
|
||||||
|
|
||||||
void cdvdVsync() {
|
void cdvdVsync() {
|
||||||
cdvd.RTCcount++;
|
cdvd.RTCcount++;
|
||||||
if (cdvd.RTCcount < ((Config.PsxType & 1) ? 50 : 60)) return;
|
if (cdvd.RTCcount < ((gsRegionMode == Region_NTSC) ? 60 : 50)) return;
|
||||||
cdvd.RTCcount = 0;
|
cdvd.RTCcount = 0;
|
||||||
|
|
||||||
cdvd.RTC.second++;
|
cdvd.RTC.second++;
|
||||||
|
@ -1113,7 +1115,7 @@ static void cdvdWrite04(u8 rt) { // NCOMMAND
|
||||||
CDR_LOG( "CdRead > startSector=%d, nSectors=%d, RetryCnt=%x, Speed=%x(%x), ReadMode=%x(%x) (1074=%x)",
|
CDR_LOG( "CdRead > startSector=%d, nSectors=%d, RetryCnt=%x, Speed=%x(%x), ReadMode=%x(%x) (1074=%x)",
|
||||||
cdvd.Sector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, cdvd.Param[9], cdvd.ReadMode, cdvd.Param[10], psxHu32(0x1074));
|
cdvd.Sector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, cdvd.Param[9], cdvd.ReadMode, cdvd.Param[10], psxHu32(0x1074));
|
||||||
|
|
||||||
if( Config.cdvdPrint )
|
if( EmuConfig.CdvdVerboseReads )
|
||||||
Console::WriteLn("CdRead: Reading Sector %d(%d Blocks of Size %d) at Speed=%dx",
|
Console::WriteLn("CdRead: Reading Sector %d(%d Blocks of Size %d) at Speed=%dx",
|
||||||
params cdvd.Sector, cdvd.nSectors,cdvd.BlockSize,cdvd.Speed);
|
params cdvd.Sector, cdvd.nSectors,cdvd.BlockSize,cdvd.Speed);
|
||||||
|
|
||||||
|
@ -1160,7 +1162,7 @@ static void cdvdWrite04(u8 rt) { // NCOMMAND
|
||||||
CDR_LOG( "CdReadCDDA > startSector=%d, nSectors=%d, RetryCnt=%x, Speed=%xx(%x), ReadMode=%x(%x) (1074=%x)",
|
CDR_LOG( "CdReadCDDA > startSector=%d, nSectors=%d, RetryCnt=%x, Speed=%xx(%x), ReadMode=%x(%x) (1074=%x)",
|
||||||
cdvd.Sector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, cdvd.Param[9], cdvd.ReadMode, cdvd.Param[10], psxHu32(0x1074));
|
cdvd.Sector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, cdvd.Param[9], cdvd.ReadMode, cdvd.Param[10], psxHu32(0x1074));
|
||||||
|
|
||||||
if( Config.cdvdPrint )
|
if( EmuConfig.CdvdVerboseReads )
|
||||||
Console::WriteLn("CdAudioRead: Reading Sector %d(%d Blocks of Size %d) at Speed=%dx",
|
Console::WriteLn("CdAudioRead: Reading Sector %d(%d Blocks of Size %d) at Speed=%dx",
|
||||||
params cdvd.Sector, cdvd.nSectors,cdvd.BlockSize,cdvd.Speed);
|
params cdvd.Sector, cdvd.nSectors,cdvd.BlockSize,cdvd.Speed);
|
||||||
|
|
||||||
|
@ -1195,7 +1197,7 @@ static void cdvdWrite04(u8 rt) { // NCOMMAND
|
||||||
CDR_LOG( "DvdRead > startSector=%d, nSectors=%d, RetryCnt=%x, Speed=%x(%x), ReadMode=%x(%x) (1074=%x)",
|
CDR_LOG( "DvdRead > startSector=%d, nSectors=%d, RetryCnt=%x, Speed=%x(%x), ReadMode=%x(%x) (1074=%x)",
|
||||||
cdvd.Sector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, cdvd.Param[9], cdvd.ReadMode, cdvd.Param[10], psxHu32(0x1074));
|
cdvd.Sector, cdvd.nSectors, cdvd.RetryCnt, cdvd.Speed, cdvd.Param[9], cdvd.ReadMode, cdvd.Param[10], psxHu32(0x1074));
|
||||||
|
|
||||||
if( Config.cdvdPrint )
|
if( EmuConfig.CdvdVerboseReads )
|
||||||
Console::WriteLn("DvdRead: Reading Sector %d(%d Blocks of Size %d) at Speed=%dx",
|
Console::WriteLn("DvdRead: Reading Sector %d(%d Blocks of Size %d) at Speed=%dx",
|
||||||
params cdvd.Sector, cdvd.nSectors,cdvd.BlockSize,cdvd.Speed);
|
params cdvd.Sector, cdvd.nSectors,cdvd.BlockSize,cdvd.Speed);
|
||||||
|
|
||||||
|
|
|
@ -135,8 +135,6 @@ struct cdvdStruct {
|
||||||
|
|
||||||
struct CDVD_API
|
struct CDVD_API
|
||||||
{
|
{
|
||||||
struct
|
|
||||||
{
|
|
||||||
void (CALLBACK *close)();
|
void (CALLBACK *close)();
|
||||||
|
|
||||||
// Don't need init or shutdown. iso/nodisc have no init/shutdown and plugin's
|
// Don't need init or shutdown. iso/nodisc have no init/shutdown and plugin's
|
||||||
|
@ -145,8 +143,6 @@ struct CDVD_API
|
||||||
// Don't need pluign specific things like freeze, test, or other stuff here.
|
// Don't need pluign specific things like freeze, test, or other stuff here.
|
||||||
// Those are handled by the plugin manager specifically.
|
// Those are handled by the plugin manager specifically.
|
||||||
|
|
||||||
} Common;
|
|
||||||
|
|
||||||
_CDVDopen open;
|
_CDVDopen open;
|
||||||
_CDVDreadTrack readTrack;
|
_CDVDreadTrack readTrack;
|
||||||
_CDVDgetBuffer getBuffer;
|
_CDVDgetBuffer getBuffer;
|
||||||
|
|
|
@ -292,7 +292,7 @@ s32 DoCDVDopen(const char* pTitleFilename)
|
||||||
int ret = CDVD->open(pTitleFilename);
|
int ret = CDVD->open(pTitleFilename);
|
||||||
int cdtype = DoCDVDdetectDiskType();
|
int cdtype = DoCDVDdetectDiskType();
|
||||||
|
|
||||||
if ((Config.Blockdump) && (cdtype != CDVD_TYPE_NODISC))
|
if (EmuConfig.CdvdDumpBlocks && (cdtype != CDVD_TYPE_NODISC))
|
||||||
{
|
{
|
||||||
// TODO: Add a blockdumps configurable folder, and use that instead of CWD().
|
// TODO: Add a blockdumps configurable folder, and use that instead of CWD().
|
||||||
|
|
||||||
|
@ -347,8 +347,8 @@ void DoCDVDclose()
|
||||||
{
|
{
|
||||||
CheckNullCDVD();
|
CheckNullCDVD();
|
||||||
if(blockDumpFile) isoClose(blockDumpFile);
|
if(blockDumpFile) isoClose(blockDumpFile);
|
||||||
if( CDVD->Common.close != NULL )
|
if( CDVD->close != NULL )
|
||||||
CDVD->Common.close();
|
CDVD->close();
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 DoCDVDreadSector(u8* buffer, u32 lsn, int mode)
|
s32 DoCDVDreadSector(u8* buffer, u32 lsn, int mode)
|
||||||
|
@ -503,10 +503,7 @@ wxString NODISCgetUniqueFilename()
|
||||||
|
|
||||||
CDVD_API CDVDapi_NoDisc =
|
CDVD_API CDVDapi_NoDisc =
|
||||||
{
|
{
|
||||||
{
|
|
||||||
NODISCclose,
|
NODISCclose,
|
||||||
},
|
|
||||||
|
|
||||||
NODISCopen,
|
NODISCopen,
|
||||||
NODISCreadTrack,
|
NODISCreadTrack,
|
||||||
NODISCgetBuffer,
|
NODISCgetBuffer,
|
||||||
|
|
|
@ -393,9 +393,7 @@ wxString ISOgetUniqueFilename()
|
||||||
|
|
||||||
CDVD_API CDVDapi_Iso =
|
CDVD_API CDVDapi_Iso =
|
||||||
{
|
{
|
||||||
{
|
ISOclose,
|
||||||
ISOclose
|
|
||||||
},
|
|
||||||
|
|
||||||
ISOopen,
|
ISOopen,
|
||||||
ISOreadTrack,
|
ISOreadTrack,
|
||||||
|
|
302
pcsx2/Config.h
302
pcsx2/Config.h
|
@ -32,108 +32,30 @@ enum PluginsEnum_t
|
||||||
PluginId_Count
|
PluginId_Count
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
// Pcsx2Config
|
||||||
// Pcsx2 Application Configuration.
|
|
||||||
//
|
//
|
||||||
// [TODO] : Rename this once we get to the point where the old Pcsx2Config stuff isn't in
|
// This is intended to be a public class library, but is *not* meant to be shared data between
|
||||||
// the way anymore. :)
|
// core emulation and plugins or interfaces. Instead data is shared between gui interface and
|
||||||
|
// emulator via an ini file, which allows data to be communicated in a manner independent of
|
||||||
|
// class structure and somewhat independent of core emulator options changes.
|
||||||
//
|
//
|
||||||
class AppConfig
|
class Pcsx2Config
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// ------------------------------------------------------------------------
|
struct ProfilerSettings
|
||||||
struct ConsoleLogOptions
|
|
||||||
{
|
|
||||||
bool Visible;
|
|
||||||
// if true, DisplayPos is ignored and the console is automatically docked to the main window.
|
|
||||||
bool AutoDock;
|
|
||||||
// Display position used if AutoDock is false (ignored otherwise)
|
|
||||||
wxPoint DisplayPosition;
|
|
||||||
wxSize DisplaySize;
|
|
||||||
|
|
||||||
// Size of the font in points.
|
|
||||||
int FontSize;
|
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf, const wxChar* title );
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
struct FolderOptions
|
|
||||||
{
|
|
||||||
wxDirName
|
|
||||||
Plugins,
|
|
||||||
Settings,
|
|
||||||
Bios,
|
|
||||||
Snapshots,
|
|
||||||
Savestates,
|
|
||||||
MemoryCards,
|
|
||||||
Logs;
|
|
||||||
|
|
||||||
wxDirName RunIso; // last used location for Iso loading.
|
|
||||||
|
|
||||||
bool
|
|
||||||
UseDefaultPlugins:1,
|
|
||||||
UseDefaultSettings:1,
|
|
||||||
UseDefaultBios:1,
|
|
||||||
UseDefaultSnapshots:1,
|
|
||||||
UseDefaultSavestates:1,
|
|
||||||
UseDefaultMemoryCards:1,
|
|
||||||
UseDefaultLogs:1;
|
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
|
||||||
void ApplyDefaults();
|
|
||||||
|
|
||||||
void Set( FoldersEnum_t folderidx, const wxString& src, bool useDefault );
|
|
||||||
|
|
||||||
const wxDirName& operator[]( FoldersEnum_t folderidx ) const;
|
|
||||||
const bool IsDefault( FoldersEnum_t folderidx ) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
struct FilenameOptions
|
|
||||||
{
|
|
||||||
wxFileName Bios;
|
|
||||||
wxFileName Plugins[PluginId_Count];
|
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
|
||||||
|
|
||||||
const wxFileName& operator[]( PluginsEnum_t pluginidx ) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// Options struct for each memory card.
|
|
||||||
//
|
|
||||||
struct McdOptions
|
|
||||||
{
|
|
||||||
wxFileName Filename; // user-configured location of this memory card
|
|
||||||
bool Enabled; // memory card enabled (if false, memcard will not show up in-game)
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
struct McdSysOptions
|
|
||||||
{
|
|
||||||
McdOptions Mcd[2];
|
|
||||||
bool EnableNTFS; // enables automatic ntfs compression of memory cards (Win32 only)
|
|
||||||
bool EnableEjection; // enables simulated ejection of memory cards when loading savestates
|
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
struct CpuRecompilerOptions
|
|
||||||
{
|
|
||||||
struct
|
|
||||||
{
|
{
|
||||||
bool
|
bool
|
||||||
Enabled:1, // universal toggle for the profiler.
|
Enabled:1, // universal toggle for the profiler.
|
||||||
RecBlocks_EE:1, // Enables per-block profiling for the EE recompiler [unimplemented]
|
RecBlocks_EE:1, // Enables per-block profiling for the EE recompiler [unimplemented]
|
||||||
RecBlocks_IOP:1, // Enables per-block profiling for the IOP recompiler [unimplemented]
|
RecBlocks_IOP:1, // Enables per-block profiling for the IOP recompiler [unimplemented]
|
||||||
|
RecBlocks_VU0:1, // Enables per-block profiling for the VU0 recompiler [unimplemented]
|
||||||
RecBlocks_VU1:1; // Enables per-block profiling for the VU1 recompiler [unimplemented]
|
RecBlocks_VU1:1; // Enables per-block profiling for the VU1 recompiler [unimplemented]
|
||||||
|
|
||||||
} Profiler;
|
void LoadSave( IniInterface& conf );
|
||||||
|
};
|
||||||
|
|
||||||
struct
|
struct RecompilerSettings
|
||||||
{
|
{
|
||||||
bool
|
bool
|
||||||
EnableEE:1,
|
EnableEE:1,
|
||||||
|
@ -141,23 +63,53 @@ public:
|
||||||
EnableVU0:1,
|
EnableVU0:1,
|
||||||
EnableVU1:1;
|
EnableVU1:1;
|
||||||
|
|
||||||
|
bool
|
||||||
|
UseMicroVU0:1,
|
||||||
|
UseMicroVU1:1;
|
||||||
|
|
||||||
|
void LoadSave( IniInterface& conf );
|
||||||
|
|
||||||
} Recompiler;
|
} Recompiler;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
struct CpuOptions
|
||||||
|
{
|
||||||
|
u32 sseMXCSR;
|
||||||
|
u32 sseVUMXCSR;
|
||||||
|
|
||||||
|
bool
|
||||||
|
vuOverflow:1,
|
||||||
|
vuExtraOverflow:1,
|
||||||
|
vuSignOverflow:1,
|
||||||
|
vuUnderflow:1;
|
||||||
|
|
||||||
|
bool
|
||||||
|
fpuOverflow:1,
|
||||||
|
fpuExtraOverflow:1,
|
||||||
|
fpuFullMode:1;
|
||||||
|
|
||||||
|
ProfilerSettings Profiler;
|
||||||
|
RecompilerSettings Recompiler;
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
void LoadSave( IniInterface& conf );
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
struct VideoOptions
|
struct VideoOptions
|
||||||
{
|
{
|
||||||
bool MultithreadGS; // Uses the multithreaded GS interface.
|
bool EnableFrameLimiting;
|
||||||
bool closeOnEsc; // Closes the GS/Video port on escape (good for fullscreen activity)
|
bool EnableFrameSkipping;
|
||||||
bool UseFramelimiter;
|
|
||||||
|
|
||||||
int RegionMode; // 0=NTSC and 1=PAL
|
// The region mode controls the default Maximum/Minimum FPS settings and also
|
||||||
int CustomFps;
|
// regulates the vsync rates (which in turn control the IOP's SPU2 tick sync and ensure
|
||||||
int CustomFrameSkip;
|
// proper audio playback speed).
|
||||||
int CustomConsecutiveFrames;
|
int DefaultRegionMode; // 0=NTSC and 1=PAL
|
||||||
int CustomConsecutiveSkip;
|
|
||||||
|
int FpsTurbo; // Limiting kicks in if fps goes beyond this (turbo enabled)
|
||||||
|
int FpsLimit; // Limiting kicks in if fps goes beyond this line
|
||||||
|
int FpsSkip; // Skipping kicks in if fps drops below this line
|
||||||
|
int ConsecutiveFrames; // number of consecutive frames (fields) to render
|
||||||
|
int ConsecutiveSkip; // number of consecutive frames (fields) to skip
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
void LoadSave( IniInterface& conf );
|
||||||
};
|
};
|
||||||
|
@ -169,7 +121,9 @@ public:
|
||||||
VuAddSubHack:1, // Fix for Tri-ace games, they use an encryption algorithm that requires VU addi opcode to be bit-accurate.
|
VuAddSubHack:1, // Fix for Tri-ace games, they use an encryption algorithm that requires VU addi opcode to be bit-accurate.
|
||||||
VuClipFlagHack:1, // Fix for Digimon Rumble Arena 2, fixes spinning/hanging on intro-menu.
|
VuClipFlagHack:1, // Fix for Digimon Rumble Arena 2, fixes spinning/hanging on intro-menu.
|
||||||
FpuCompareHack:1, // Fix for Persona games, maybe others. It's to do with the VU clip flag (again).
|
FpuCompareHack:1, // Fix for Persona games, maybe others. It's to do with the VU clip flag (again).
|
||||||
FpuMulHack:1; // Fix for Tales of Destiny hangs.
|
FpuMulHack:1, // Fix for Tales of Destiny hangs.
|
||||||
|
XgKickHack:1; // Fix for Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics, but breaks Tri-ace games and others.
|
||||||
|
|
||||||
|
|
||||||
void LoadSave();
|
void LoadSave();
|
||||||
};
|
};
|
||||||
|
@ -182,71 +136,117 @@ public:
|
||||||
VUCycleSteal:3, // VU Cycle Stealer factor (0, 1, 2, or 3)
|
VUCycleSteal:3, // VU Cycle Stealer factor (0, 1, 2, or 3)
|
||||||
IopCycleRate_X2:1, // enables the x2 multiplier of the IOP cyclerate
|
IopCycleRate_X2:1, // enables the x2 multiplier of the IOP cyclerate
|
||||||
IntcStat:1, // tells Pcsx2 to fast-forward through intc_stat waits.
|
IntcStat:1, // tells Pcsx2 to fast-forward through intc_stat waits.
|
||||||
BIFC0:1; // enables BIFC0 detection and fast-forwarding
|
BIFC0:1, // enables BIFC0 detection and fast-forwarding
|
||||||
|
|
||||||
|
vuMinMax:1, // microVU specific MinMax hack; Can cause SPS, Black Screens, etc...
|
||||||
|
vuFlagHack:1; // MicroVU specific flag hack; Can cause Infinite loops, SPS, etc...
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
void LoadSave( IniInterface& conf );
|
||||||
};
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool UseAdminMode; // dictates if the program uses /home/user or /cwd for the program data
|
|
||||||
wxPoint MainGuiPosition;
|
|
||||||
bool CdvdVerboseReads; // enables cdvd read activity verbosely dumped to the console
|
bool CdvdVerboseReads; // enables cdvd read activity verbosely dumped to the console
|
||||||
|
bool CdvdDumpBlocks;
|
||||||
|
bool EnablePatches;
|
||||||
|
|
||||||
// Current language in use (correlates to a wxWidgets wxLANGUAGE specifier)
|
// Closes the GS/Video port on escape (good for fullscreen activity)
|
||||||
wxLanguage LanguageId;
|
bool closeGSonEsc;
|
||||||
|
|
||||||
int RecentFileCount; // number of files displayed in the Recent Isos list.
|
// enables simulated ejection of memory cards when loading savestates
|
||||||
|
bool McdEnableEjection;
|
||||||
|
|
||||||
// String value describing the desktop theme to use for pcsk2 (icons and background images)
|
CpuOptions Cpu;
|
||||||
// The theme name is used to look up files in the themes folder (relative to the executable).
|
VideoOptions Video;
|
||||||
wxString DeskTheme;
|
|
||||||
|
|
||||||
// Specifies the size of icons used in Listbooks; specifically the PCSX2 Properties dialog box.
|
|
||||||
// Realistic values range from 96x96 to 24x24.
|
|
||||||
int Listbook_ImageSize;
|
|
||||||
|
|
||||||
// Specifies the size of each toolbar icon, in pixels (any value >= 2 is valid, but realistically
|
|
||||||
// values should be between 64 and 16 for usability reasons)
|
|
||||||
int Toolbar_ImageSize;
|
|
||||||
|
|
||||||
// Enables display of toolbar text labels.
|
|
||||||
bool Toolbar_ShowLabels;
|
|
||||||
|
|
||||||
CpuRecompilerOptions Cpu;
|
|
||||||
SpeedhackOptions Speedhacks;
|
SpeedhackOptions Speedhacks;
|
||||||
GamefixOptions Gamefixes;
|
GamefixOptions Gamefixes;
|
||||||
VideoOptions Video;
|
|
||||||
ConsoleLogOptions ProgLogBox;
|
|
||||||
ConsoleLogOptions Ps2ConBox;
|
|
||||||
FolderOptions Folders;
|
|
||||||
FilenameOptions BaseFilenames;
|
|
||||||
McdSysOptions MemoryCards;
|
|
||||||
|
|
||||||
protected:
|
void Load( const wxString& srcfile );
|
||||||
// indicates if the main AppConfig settings are valid (excludes the status of UseAdminMode,
|
void Load( const wxInputStream& srcstream );
|
||||||
// which is a special value that's initialized independently of the rest of the config)
|
void Save( const wxString& dstfile );
|
||||||
bool m_IsLoaded;
|
void Save( const wxOutputStream& deststream );
|
||||||
|
|
||||||
public:
|
|
||||||
AppConfig() :
|
|
||||||
Listbook_ImageSize( 32 )
|
|
||||||
, Toolbar_ImageSize( 24 )
|
|
||||||
, m_IsLoaded( false )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
wxString FullpathToBios() const;
|
|
||||||
wxString FullpathToMcd( uint mcdidx ) const;
|
|
||||||
wxString FullpathTo( PluginsEnum_t pluginId ) const;
|
|
||||||
|
|
||||||
void Load();
|
|
||||||
void Save();
|
|
||||||
void Apply();
|
|
||||||
|
|
||||||
void LoadSaveUserMode( IniInterface& ini );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void LoadSave( IniInterface& ini );
|
void LoadSave( IniInterface& ini );
|
||||||
};
|
};
|
||||||
|
|
||||||
extern AppConfig* g_Conf;
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
// Session Configuration Override Flags
|
||||||
|
//
|
||||||
|
// a handful of flags that can override user configurations for the current application session
|
||||||
|
// only. This allows us to do things like force-disable recompilers if the memory allocations
|
||||||
|
// for them fail.
|
||||||
|
struct SessionOverrideFlags
|
||||||
|
{
|
||||||
|
bool
|
||||||
|
ForceDisableEErec:1,
|
||||||
|
ForceDisableIOPrec:1,
|
||||||
|
ForceDisableVU0rec:1,
|
||||||
|
ForceDisableVU1rec:1;
|
||||||
|
};
|
||||||
|
|
||||||
|
extern Pcsx2Config EmuConfig;
|
||||||
|
extern SessionOverrideFlags g_Session;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Helper Macros for Reading Emu Configurations.
|
||||||
|
//
|
||||||
|
|
||||||
|
// ------------ CPU / Recompiler Options ---------------
|
||||||
|
|
||||||
|
#define CHECK_MICROVU0 (EmuConfig.Cpu.Recompiler.UseMicroVU0)
|
||||||
|
#define CHECK_MICROVU1 (EmuConfig.Cpu.Recompiler.UseMicroVU1)
|
||||||
|
#define CHECK_EEREC (!g_Session.ForceDisableEErec && EmuConfig.Cpu.Recompiler.EnableEE)
|
||||||
|
#define CHECK_IOPREC (!g_Session.ForceDisableIOPrec && EmuConfig.Cpu.Recompiler.EnableIOP)
|
||||||
|
#define CHECK_VU0REC (!g_Session.ForceDisableVU0rec && EmuConfig.Cpu.Recompiler.EnableVU0)
|
||||||
|
#define CHECK_VU1REC (!g_Session.ForceDisableVU1rec && EmuConfig.Cpu.Recompiler.EnableVU1)
|
||||||
|
|
||||||
|
//------------ SPECIAL GAME FIXES!!! ---------------
|
||||||
|
#define CHECK_VUADDSUBHACK (EmuConfig.Gamefixes.VuAddSubHack) // Special Fix for Tri-ace games, they use an encryption algorithm that requires VU addi opcode to be bit-accurate.
|
||||||
|
#define CHECK_FPUCOMPAREHACK (EmuConfig.Gamefixes.FpuCompareHack) // Special Fix for Digimon Rumble Arena 2, fixes spinning/hanging on intro-menu.
|
||||||
|
#define CHECK_VUCLIPFLAGHACK (EmuConfig.Gamefixes.VuClipFlagHack) // Special Fix for Persona games, maybe others. It's to do with the VU clip flag (again).
|
||||||
|
#define CHECK_FPUMULHACK (EmuConfig.Gamefixes.FpuMulHack) // Special Fix for Tales of Destiny hangs.
|
||||||
|
#define CHECK_DMAEXECHACK (false) //sVU-only, ignored // Special Fix for Fatal Frame; breaks Gust and Tri-Ace games.
|
||||||
|
#define CHECK_XGKICKHACK (EmuConfig.Gamefixes.XgKickHack) // Special Fix for Erementar Gerad, adds more delay to VU XGkick instructions. Corrects the color of some graphics.
|
||||||
|
|
||||||
|
//------------ Advanced Options!!! ---------------
|
||||||
|
#define CHECK_VU_OVERFLOW (EmuConfig.Cpu.vuOverflow)
|
||||||
|
#define CHECK_VU_EXTRA_OVERFLOW (EmuConfig.Cpu.vuExtraOverflow) // If enabled, Operands are clamped before being used in the VU recs
|
||||||
|
#define CHECK_VU_SIGN_OVERFLOW (EmuConfig.Cpu.vuSignOverflow)
|
||||||
|
#define CHECK_VU_UNDERFLOW (EmuConfig.Cpu.vuUnderflow)
|
||||||
|
#define CHECK_VU_EXTRA_FLAGS 0 // Always disabled now // Sets correct flags in the sVU recs
|
||||||
|
#define CHECK_FPU_OVERFLOW (EmuConfig.Cpu.fpuOverflow)
|
||||||
|
#define CHECK_FPU_EXTRA_OVERFLOW (EmuConfig.Cpu.fpuExtraOverflow) // If enabled, Operands are checked for infinities before being used in the FPU recs
|
||||||
|
#define CHECK_FPU_EXTRA_FLAGS 1 // Always enabled now // Sets D/I flags on FPU instructions
|
||||||
|
#define CHECK_FPU_FULL (EmuConfig.Cpu.fpuFullMode)
|
||||||
|
|
||||||
|
//------------ DEFAULT sseMXCSR VALUES!!! ---------------
|
||||||
|
#define DEFAULT_sseMXCSR 0xffc0 //FPU rounding > DaZ, FtZ, "chop"
|
||||||
|
#define DEFAULT_sseVUMXCSR 0xffc0 //VU rounding > DaZ, FtZ, "chop"
|
||||||
|
|
||||||
|
//------------ EE Recompiler defines - Comment to disable a recompiler ---------------
|
||||||
|
|
||||||
|
#define SHIFT_RECOMPILE // Speed majorly reduced if disabled
|
||||||
|
#define BRANCH_RECOMPILE // Speed extremely reduced if disabled - more then shift
|
||||||
|
|
||||||
|
// Disabling all the recompilers in this block is interesting, as it still runs at a reasonable rate.
|
||||||
|
// It also adds a few glitches. Really reminds me of the old Linux 64-bit version. --arcum42
|
||||||
|
#define ARITHMETICIMM_RECOMPILE
|
||||||
|
#define ARITHMETIC_RECOMPILE
|
||||||
|
#define MULTDIV_RECOMPILE
|
||||||
|
#define JUMP_RECOMPILE
|
||||||
|
#define LOADSTORE_RECOMPILE
|
||||||
|
#define MOVE_RECOMPILE
|
||||||
|
#define MMI_RECOMPILE
|
||||||
|
#define MMI0_RECOMPILE
|
||||||
|
#define MMI1_RECOMPILE
|
||||||
|
#define MMI2_RECOMPILE
|
||||||
|
#define MMI3_RECOMPILE
|
||||||
|
#define FPU_RECOMPILE
|
||||||
|
#define CP0_RECOMPILE
|
||||||
|
#define CP2_RECOMPILE
|
||||||
|
|
||||||
|
// You can't recompile ARITHMETICIMM without ARITHMETIC.
|
||||||
|
#ifndef ARITHMETIC_RECOMPILE
|
||||||
|
#undef ARITHMETICIMM_RECOMPILE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define EE_CONST_PROP // rec2 - enables constant propagation (faster)
|
||||||
|
|
|
@ -227,7 +227,7 @@ static void vSyncInfoCalc( vSyncTimingInfo* info, u32 framesPerSecond, u32 scans
|
||||||
|
|
||||||
u32 UpdateVSyncRate()
|
u32 UpdateVSyncRate()
|
||||||
{
|
{
|
||||||
const char *limiterMsg = "Framelimiter rate updated (UpdateVSyncRate): %d.%d fps";
|
static const char *limiterMsg = "Framelimiter rate updated (UpdateVSyncRate): %d.%d fps";
|
||||||
|
|
||||||
// fixme - According to some docs, progressive-scan modes actually refresh slower than
|
// fixme - According to some docs, progressive-scan modes actually refresh slower than
|
||||||
// interlaced modes. But I can't fathom how, since the refresh rate is a function of
|
// interlaced modes. But I can't fathom how, since the refresh rate is a function of
|
||||||
|
@ -237,7 +237,7 @@ u32 UpdateVSyncRate()
|
||||||
//#define VBLANK_NTSC ((Config.PsxType & 2) ? 59.94 : 59.82) //59.94 is more precise
|
//#define VBLANK_NTSC ((Config.PsxType & 2) ? 59.94 : 59.82) //59.94 is more precise
|
||||||
//#define VBLANK_PAL ((Config.PsxType & 2) ? 50.00 : 49.76)
|
//#define VBLANK_PAL ((Config.PsxType & 2) ? 50.00 : 49.76)
|
||||||
|
|
||||||
if(Config.PsxType & 1)
|
if( gsRegionMode == Region_PAL )
|
||||||
{
|
{
|
||||||
if( vSyncInfo.Framerate != FRAMERATE_PAL )
|
if( vSyncInfo.Framerate != FRAMERATE_PAL )
|
||||||
vSyncInfoCalc( &vSyncInfo, FRAMERATE_PAL, SCANLINES_TOTAL_PAL );
|
vSyncInfoCalc( &vSyncInfo, FRAMERATE_PAL, SCANLINES_TOTAL_PAL );
|
||||||
|
@ -251,14 +251,14 @@ u32 UpdateVSyncRate()
|
||||||
hsyncCounter.CycleT = vSyncInfo.hRender; // Amount of cycles before the counter will be updated
|
hsyncCounter.CycleT = vSyncInfo.hRender; // Amount of cycles before the counter will be updated
|
||||||
vsyncCounter.CycleT = vSyncInfo.Render; // Amount of cycles before the counter will be updated
|
vsyncCounter.CycleT = vSyncInfo.Render; // Amount of cycles before the counter will be updated
|
||||||
|
|
||||||
if (Config.CustomFps > 0)
|
if( EmuConfig.Video.EnableFrameLimiting && (EmuConfig.Video.FpsLimit > 0) )
|
||||||
{
|
{
|
||||||
s64 ticks = GetTickFrequency() / Config.CustomFps;
|
s64 ticks = GetTickFrequency() / EmuConfig.Video.FpsLimit;
|
||||||
if( m_iTicks != ticks )
|
if( m_iTicks != ticks )
|
||||||
{
|
{
|
||||||
m_iTicks = ticks;
|
m_iTicks = ticks;
|
||||||
gsOnModeChanged( vSyncInfo.Framerate, m_iTicks );
|
gsOnModeChanged( vSyncInfo.Framerate, m_iTicks );
|
||||||
Console::Status( limiterMsg, params Config.CustomFps, 0 );
|
Console::Status( limiterMsg, params EmuConfig.Video.FpsLimit, 0 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -288,8 +288,8 @@ void frameLimitReset()
|
||||||
// See the GS FrameSkip function for details on why this is here and not in the GS.
|
// See the GS FrameSkip function for details on why this is here and not in the GS.
|
||||||
static __forceinline void frameLimit()
|
static __forceinline void frameLimit()
|
||||||
{
|
{
|
||||||
if( CHECK_FRAMELIMIT == PCSX2_FRAMELIMIT_NORMAL ) return;
|
// 999 means the user would rather just have framelimiting turned off...
|
||||||
if( Config.CustomFps >= 999 ) return; // means the user would rather just have framelimiting turned off...
|
if( !EmuConfig.Video.EnableFrameLimiting || EmuConfig.Video.FpsLimit >= 999 ) return;
|
||||||
|
|
||||||
s64 sDeltaTime;
|
s64 sDeltaTime;
|
||||||
u64 uExpectedEnd;
|
u64 uExpectedEnd;
|
||||||
|
@ -351,7 +351,7 @@ static __forceinline void VSyncStart(u32 sCycle)
|
||||||
psxVBlankStart();
|
psxVBlankStart();
|
||||||
|
|
||||||
if (gates) rcntStartGate(true, sCycle); // Counters Start Gate code
|
if (gates) rcntStartGate(true, sCycle); // Counters Start Gate code
|
||||||
if (Config.Patch) applypatch(1); // Apply patches (ToDo: clean up patch code)
|
//if (Config.Patch) applypatch(1); // fixme - Apply patches
|
||||||
|
|
||||||
// INTC - VB Blank Start Hack --
|
// INTC - VB Blank Start Hack --
|
||||||
// Hack fix! This corrects a freezeup in Granda 2 where it decides to spin
|
// Hack fix! This corrects a freezeup in Granda 2 where it decides to spin
|
||||||
|
@ -802,7 +802,6 @@ void SaveState::rcntFreeze()
|
||||||
Freeze( vsyncCounter );
|
Freeze( vsyncCounter );
|
||||||
Freeze( nextCounter );
|
Freeze( nextCounter );
|
||||||
Freeze( nextsCounter );
|
Freeze( nextsCounter );
|
||||||
Freeze( Config.PsxType );
|
|
||||||
|
|
||||||
if( IsLoading() )
|
if( IsLoading() )
|
||||||
{
|
{
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Pcsx2Config.h"
|
|
||||||
|
|
||||||
extern FILE *emuLog;
|
extern FILE *emuLog;
|
||||||
|
|
||||||
extern char* disVU0MicroUF(u32 code, u32 pc);
|
extern char* disVU0MicroUF(u32 code, u32 pc);
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include "iR5900.h"
|
#include "iR5900.h"
|
||||||
#include "IPU/IPU.h"
|
#include "IPU/IPU.h"
|
||||||
|
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
using namespace R5900;
|
using namespace R5900;
|
||||||
// fixme: currently should not be uncommented.
|
// fixme: currently should not be uncommented.
|
||||||
//#define TEST_BROKEN_DUMP_ROUTINES
|
//#define TEST_BROKEN_DUMP_ROUTINES
|
||||||
|
|
|
@ -476,7 +476,7 @@ void ElfApplyPatches()
|
||||||
// if patches found the following status msg will be overwritten
|
// if patches found the following status msg will be overwritten
|
||||||
Console::SetTitle( wxsFormat( _("Game running [CRC=%s]"), filename.c_str() ) );
|
Console::SetTitle( wxsFormat( _("Game running [CRC=%s]"), filename.c_str() ) );
|
||||||
|
|
||||||
if( !Config.Patch ) return;
|
if( !EmuConfig.EnablePatches ) return;
|
||||||
|
|
||||||
if(LoadPatch( filename ) != 0)
|
if(LoadPatch( filename ) != 0)
|
||||||
{
|
{
|
||||||
|
|
58
pcsx2/GS.cpp
58
pcsx2/GS.cpp
|
@ -100,10 +100,10 @@ void _gs_ChangeTimings( u32 framerate, u32 iTicks )
|
||||||
{
|
{
|
||||||
m_iSlowStart = GetCPUTicks();
|
m_iSlowStart = GetCPUTicks();
|
||||||
|
|
||||||
u32 frameSkipThreshold = Config.CustomFrameSkip*50;
|
u32 frameSkipThreshold = EmuConfig.Video.FpsSkip*50;
|
||||||
if( Config.CustomFrameSkip == 0)
|
if( frameSkipThreshold == 0)
|
||||||
{
|
{
|
||||||
// default: load the frameSkipThreshold with a value roughly 90% of our current framerate
|
// default: load the frameSkipThreshold with a value roughly 90% of the PS2 native framerate
|
||||||
frameSkipThreshold = ( framerate * 242 ) / 256;
|
frameSkipThreshold = ( framerate * 242 ) / 256;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,22 +126,16 @@ void gsOnModeChanged( u32 framerate, u32 newTickrate )
|
||||||
mtgsThread->SendSimplePacket( GS_RINGTYPE_MODECHANGE, framerate, newTickrate, 0 );
|
mtgsThread->SendSimplePacket( GS_RINGTYPE_MODECHANGE, framerate, newTickrate, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
void gsSetVideoRegionType( u32 isPal )
|
static bool gsIsInterlaced = false;
|
||||||
{
|
GS_RegionMode gsRegionMode = Region_NTSC;
|
||||||
if( isPal )
|
|
||||||
{
|
|
||||||
if( Config.PsxType & 1 ) return;
|
|
||||||
Console::WriteLn( "PAL Display Mode Initialized." );
|
|
||||||
Config.PsxType |= 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if( !(Config.PsxType & 1 ) ) return;
|
|
||||||
Console::WriteLn( "NTSC Display Mode Initialized." );
|
|
||||||
Config.PsxType &= ~1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we made it this far it means the refresh rate changed, so update the vsync timers:
|
|
||||||
|
void gsSetRegionMode( GS_RegionMode region )
|
||||||
|
{
|
||||||
|
if( gsRegionMode == region ) return;
|
||||||
|
|
||||||
|
gsRegionMode = region;
|
||||||
|
Console::WriteLn( "%s Display Mode Initialized.", params (( gsRegionMode == Region_PAL ) ? "PAL" : "NTSC") );
|
||||||
UpdateVSyncRate();
|
UpdateVSyncRate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,17 +143,16 @@ void gsSetVideoRegionType( u32 isPal )
|
||||||
// Make sure framelimiter options are in sync with the plugin's capabilities.
|
// Make sure framelimiter options are in sync with the plugin's capabilities.
|
||||||
void gsInit()
|
void gsInit()
|
||||||
{
|
{
|
||||||
if( (CHECK_FRAMELIMIT == PCSX2_FRAMELIMIT_SKIP) && (GSsetFrameSkip == NULL) )
|
if( EmuConfig.Video.EnableFrameSkipping && (GSsetFrameSkip == NULL) )
|
||||||
{
|
{
|
||||||
Config.Options &= ~PCSX2_FRAMELIMIT_MASK;
|
EmuConfig.Video.EnableFrameSkipping = false;
|
||||||
Console::WriteLn("Notice: Disabling frameskip -- GS plugin does not support it.");
|
Console::WriteLn("Notice: Disabling frameskipping -- GS plugin does not support it.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opens the gsRingbuffer thread.
|
// Opens the gsRingbuffer thread.
|
||||||
s32 gsOpen()
|
s32 gsOpen()
|
||||||
{
|
{
|
||||||
u32 curFrameLimit = Config.Options & PCSX2_FRAMELIMIT_MASK;
|
|
||||||
if( m_gsOpened ) return 0;
|
if( m_gsOpened ) return 0;
|
||||||
|
|
||||||
//video
|
//video
|
||||||
|
@ -186,13 +179,16 @@ s32 gsOpen()
|
||||||
);
|
);
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
// FIXME : This is the gs/vsync tie-in for framelimiting, but it really
|
||||||
|
// needs to be called from the hotkey framelimiter enable/disable too.
|
||||||
|
|
||||||
if(GSsetFrameLimit == NULL)
|
if(GSsetFrameLimit == NULL)
|
||||||
{
|
{
|
||||||
DevCon::Notice("Notice: GS Plugin does not implement GSsetFrameLimit.");
|
DevCon::Notice("Notice: GS Plugin does not implement GSsetFrameLimit.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GSsetFrameLimit(curFrameLimit != PCSX2_FRAMELIMIT_NORMAL);
|
GSsetFrameLimit( EmuConfig.Video.EnableFrameLimiting );
|
||||||
}
|
}
|
||||||
|
|
||||||
return !m_gsOpened;
|
return !m_gsOpened;
|
||||||
|
@ -212,7 +208,7 @@ void gsReset()
|
||||||
mtgsThread->Reset();
|
mtgsThread->Reset();
|
||||||
|
|
||||||
gsOnModeChanged(
|
gsOnModeChanged(
|
||||||
(Config.PsxType & 1) ? FRAMERATE_PAL : FRAMERATE_NTSC,
|
(gsRegionMode == Region_NTSC) ? FRAMERATE_NTSC : FRAMERATE_PAL,
|
||||||
UpdateVSyncRate()
|
UpdateVSyncRate()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -329,14 +325,11 @@ __forceinline void _gsSMODEwrite( u32 mem, u32 value )
|
||||||
switch (mem)
|
switch (mem)
|
||||||
{
|
{
|
||||||
case GS_SMODE1:
|
case GS_SMODE1:
|
||||||
gsSetVideoRegionType( (value & 0x6000) == 0x6000 );
|
gsSetRegionMode( ((value & 0x6000) == 0x6000) ? Region_PAL : Region_NTSC );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GS_SMODE2:
|
case GS_SMODE2:
|
||||||
if(value & 0x1)
|
gsIsInterlaced = (value & 0x1);
|
||||||
Config.PsxType |= 2; // Interlaced
|
|
||||||
else
|
|
||||||
Config.PsxType &= ~2; // Non-Interlaced
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -519,6 +512,7 @@ void gsSyncLimiterLostTime( s32 deltaTime )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// FrameSkipper - Measures delta time between calls and issues frameskips
|
// FrameSkipper - Measures delta time between calls and issues frameskips
|
||||||
// it the time is too long. Also regulates the status of the EE's framelimiter.
|
// it the time is too long. Also regulates the status of the EE's framelimiter.
|
||||||
|
|
||||||
|
@ -539,15 +533,15 @@ __forceinline void gsFrameSkip( bool forceskip )
|
||||||
static u8 FramesToRender = 0;
|
static u8 FramesToRender = 0;
|
||||||
static u8 FramesToSkip = 0;
|
static u8 FramesToSkip = 0;
|
||||||
|
|
||||||
if( CHECK_FRAMELIMIT != PCSX2_FRAMELIMIT_SKIP ) return;
|
if( !EmuConfig.Video.EnableFrameSkipping ) return;
|
||||||
|
|
||||||
// FrameSkip and VU-Skip Magic!
|
// FrameSkip and VU-Skip Magic!
|
||||||
// Skips a sequence of consecutive frames after a sequence of rendered frames
|
// Skips a sequence of consecutive frames after a sequence of rendered frames
|
||||||
|
|
||||||
// This is the least number of consecutive frames we will render w/o skipping
|
// This is the least number of consecutive frames we will render w/o skipping
|
||||||
const int noSkipFrames = ((Config.CustomConsecutiveFrames>0) ? Config.CustomConsecutiveFrames : 1);
|
const int noSkipFrames = ((EmuConfig.Video.ConsecutiveFrames>0) ? EmuConfig.Video.ConsecutiveFrames : 1);
|
||||||
// This is the number of consecutive frames we will skip
|
// This is the number of consecutive frames we will skip
|
||||||
const int yesSkipFrames = ((Config.CustomConsecutiveSkip>0) ? Config.CustomConsecutiveSkip : 1);
|
const int yesSkipFrames = ((EmuConfig.Video.ConsecutiveSkip>0) ? EmuConfig.Video.ConsecutiveSkip : 1);
|
||||||
|
|
||||||
const u64 iEnd = GetCPUTicks();
|
const u64 iEnd = GetCPUTicks();
|
||||||
const s64 uSlowExpectedEnd = m_iSlowStart + m_iSlowTicks;
|
const s64 uSlowExpectedEnd = m_iSlowStart + m_iSlowTicks;
|
||||||
|
|
21
pcsx2/GS.h
21
pcsx2/GS.h
|
@ -16,13 +16,7 @@
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __GS_H__
|
#pragma once
|
||||||
#define __GS_H__
|
|
||||||
|
|
||||||
// GCC needs these includes
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include "Common.h"
|
#include "Common.h"
|
||||||
#include "Utilities/Threading.h"
|
#include "Utilities/Threading.h"
|
||||||
|
@ -32,7 +26,15 @@ PCSX2_ALIGNED16( extern u8 g_RealGSMem[0x2000] );
|
||||||
#define GSIMR *((u32*)(g_RealGSMem+0x1010))
|
#define GSIMR *((u32*)(g_RealGSMem+0x1010))
|
||||||
#define GSSIGLBLID ((GSRegSIGBLID*)(g_RealGSMem+0x1080))
|
#define GSSIGLBLID ((GSRegSIGBLID*)(g_RealGSMem+0x1080))
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
enum GS_RegionMode
|
||||||
|
{
|
||||||
|
Region_NTSC,
|
||||||
|
Region_PAL
|
||||||
|
};
|
||||||
|
|
||||||
|
extern GS_RegionMode gsRegionMode;
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// MTGS GIFtag Parser - Declaration
|
// MTGS GIFtag Parser - Declaration
|
||||||
//
|
//
|
||||||
// The MTGS needs a dummy "GS plugin" for processing SIGNAL, FINISH, and LABEL
|
// The MTGS needs a dummy "GS plugin" for processing SIGNAL, FINISH, and LABEL
|
||||||
|
@ -291,7 +293,7 @@ extern s32 gsOpen();
|
||||||
extern void gsClose();
|
extern void gsClose();
|
||||||
extern void gsReset();
|
extern void gsReset();
|
||||||
extern void gsOnModeChanged( u32 framerate, u32 newTickrate );
|
extern void gsOnModeChanged( u32 framerate, u32 newTickrate );
|
||||||
extern void gsSetVideoRegionType( u32 isPal );
|
extern void gsSetRegionMode( GS_RegionMode isPal );
|
||||||
extern void gsResetFrameSkip();
|
extern void gsResetFrameSkip();
|
||||||
extern void gsSyncLimiterLostTime( s32 deltaTime );
|
extern void gsSyncLimiterLostTime( s32 deltaTime );
|
||||||
extern void gsDynamicSkipEnable();
|
extern void gsDynamicSkipEnable();
|
||||||
|
@ -368,4 +370,3 @@ extern gzSavingState* g_fGSSave;
|
||||||
|
|
||||||
void RunGSState(gzLoadingState& f);
|
void RunGSState(gzLoadingState& f);
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ BIOS
|
||||||
#include "VUmicro.h"
|
#include "VUmicro.h"
|
||||||
#include "GS.h"
|
#include "GS.h"
|
||||||
#include "IPU/IPU.h"
|
#include "IPU/IPU.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef ENABLECACHE
|
#ifdef ENABLECACHE
|
||||||
|
@ -759,8 +760,8 @@ void memReset()
|
||||||
_ext_memWrite8<1>, _ext_memWrite16<1>, hwWrite32_page_0E, hwWrite64_page_0E, hwWrite128_generic
|
_ext_memWrite8<1>, _ext_memWrite16<1>, hwWrite32_page_0E, hwWrite64_page_0E, hwWrite128_generic
|
||||||
);
|
);
|
||||||
|
|
||||||
vtlbMemR32FP* page0F32( Config.Hacks.INTCSTATSlow ? hwRead32_page_0F_INTC_HACK : hwRead32_page_0F );
|
vtlbMemR32FP* page0F32( EmuConfig.Speedhacks.IntcStat ? hwRead32_page_0F_INTC_HACK : hwRead32_page_0F );
|
||||||
vtlbMemR64FP* page0F64( Config.Hacks.INTCSTATSlow ? hwRead64_generic_INTC_HACK : hwRead64_generic );
|
vtlbMemR64FP* page0F64( EmuConfig.Speedhacks.IntcStat ? hwRead64_generic_INTC_HACK : hwRead64_generic );
|
||||||
|
|
||||||
hw_by_page[0xf] = vtlb_RegisterHandler(
|
hw_by_page[0xf] = vtlb_RegisterHandler(
|
||||||
_ext_memRead8<1>, _ext_memRead16<1>, page0F32, page0F64, hwRead128_generic,
|
_ext_memRead8<1>, _ext_memRead16<1>, page0F32, page0F64, hwRead128_generic,
|
||||||
|
|
|
@ -1,25 +1,31 @@
|
||||||
/* Pcsx2 - Pc Ps2 Emulator
|
/* Pcsx2 - Pc Ps2 Emulator
|
||||||
* Copyright (C) 2002-2008 Pcsx2 Team
|
* Copyright (C) 2002-2008 Pcsx2 Team
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation; either version 2 of the License, or
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// Note: This file is meant to be part of the HostGui/App, and not part of the
|
||||||
|
// emu. The emu accesses it from the SIO interface. It's possible this could be
|
||||||
|
// transformed into a plugin, although the benefit of such a system probably isn't
|
||||||
|
// significant.
|
||||||
|
|
||||||
#include "PrecompiledHeader.h"
|
#include "PrecompiledHeader.h"
|
||||||
|
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
#include "MemoryCard.h"
|
#include "MemoryCard.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
#include <wx/file.h>
|
#include <wx/file.h>
|
||||||
|
|
||||||
|
@ -35,7 +41,7 @@ void MemoryCard::Init()
|
||||||
{
|
{
|
||||||
for( int i=0; i<2; i++ )
|
for( int i=0; i<2; i++ )
|
||||||
{
|
{
|
||||||
if( Config.Mcd[i].Enabled && !cardfile[i].IsOpened() )
|
if( g_Conf->Mcd[i].Enabled && !cardfile[i].IsOpened() )
|
||||||
Load( i );
|
Load( i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -68,7 +74,7 @@ void MemoryCard::Load( uint mcd )
|
||||||
Create( str );
|
Create( str );
|
||||||
|
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
NTFS_CompressFile( str, Config.McdEnableNTFS );
|
NTFS_CompressFile( str, g_Conf->McdEnableNTFS );
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cardfile[mcd].Open( str.c_str(), wxFile::write );
|
cardfile[mcd].Open( str.c_str(), wxFile::write );
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
#include "VUmicro.h"
|
#include "VUmicro.h"
|
||||||
#include "VU.h"
|
#include "VU.h"
|
||||||
#include "iCore.h"
|
#include "iCore.h"
|
||||||
#include "sVU_zerorec.h"
|
//#include "sVU_zerorec.h"
|
||||||
#include "BaseblockEx.h" // included for devbuild block dumping (which may or may not work anymore?)
|
#include "BaseblockEx.h" // included for devbuild block dumping (which may or may not work anymore?)
|
||||||
|
|
||||||
#include "GS.h"
|
#include "GS.h"
|
||||||
|
@ -42,11 +42,11 @@
|
||||||
#include "Cache.h"
|
#include "Cache.h"
|
||||||
|
|
||||||
#include "Dump.h"
|
#include "Dump.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace R5900;
|
using namespace R5900;
|
||||||
|
|
||||||
PcsxConfig Config;
|
|
||||||
u32 BiosVersion;
|
u32 BiosVersion;
|
||||||
static int g_Pcsx2Recording = 0; // true 1 if recording video and sound
|
static int g_Pcsx2Recording = 0; // true 1 if recording video and sound
|
||||||
bool renderswitch = 0;
|
bool renderswitch = 0;
|
||||||
|
@ -389,82 +389,6 @@ static wxString GetGSStateFilename()
|
||||||
return Path::Combine( g_Conf->Folders.Savestates, wxsFormat( L"/%8.8X.%d.gs", ElfCRC, StatesC ) );
|
return Path::Combine( g_Conf->Folders.Savestates, wxsFormat( L"/%8.8X.%d.gs", ElfCRC, StatesC ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
void CycleFrameLimit(int dir)
|
|
||||||
{
|
|
||||||
const char* limitMsg;
|
|
||||||
u32 newOptions;
|
|
||||||
u32 curFrameLimit = Config.Options & PCSX2_FRAMELIMIT_MASK;
|
|
||||||
u32 newFrameLimit = 0;
|
|
||||||
static u32 oldFrameLimit = PCSX2_FRAMELIMIT_LIMIT;
|
|
||||||
|
|
||||||
if( dir == 0 ) {
|
|
||||||
// turn off limit or restore previous limit mode
|
|
||||||
if (curFrameLimit) {
|
|
||||||
oldFrameLimit = curFrameLimit;
|
|
||||||
newFrameLimit = 0;
|
|
||||||
} else
|
|
||||||
newFrameLimit = oldFrameLimit;
|
|
||||||
}
|
|
||||||
else if (dir > 0) // next
|
|
||||||
{
|
|
||||||
newFrameLimit = curFrameLimit + PCSX2_FRAMELIMIT_LIMIT;
|
|
||||||
if( newFrameLimit > PCSX2_FRAMELIMIT_SKIP )
|
|
||||||
newFrameLimit = 0;
|
|
||||||
}
|
|
||||||
else // previous
|
|
||||||
{
|
|
||||||
if( newFrameLimit == 0 )
|
|
||||||
newFrameLimit = PCSX2_FRAMELIMIT_SKIP;
|
|
||||||
else
|
|
||||||
newFrameLimit = curFrameLimit - PCSX2_FRAMELIMIT_LIMIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
newOptions = (Config.Options & ~PCSX2_FRAMELIMIT_MASK) | newFrameLimit;
|
|
||||||
|
|
||||||
gsResetFrameSkip();
|
|
||||||
|
|
||||||
// Allows sync to vblank only when framelimit is on, if GS can.
|
|
||||||
if(GSsetFrameLimit == NULL)
|
|
||||||
{
|
|
||||||
DevCon::Notice("Notice: GS Plugin does not implement GSsetFrameLimit.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GSsetFrameLimit(newFrameLimit);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(newFrameLimit) {
|
|
||||||
case PCSX2_FRAMELIMIT_NORMAL:
|
|
||||||
limitMsg = "None/Normal";
|
|
||||||
break;
|
|
||||||
case PCSX2_FRAMELIMIT_LIMIT:
|
|
||||||
limitMsg = "Limit";
|
|
||||||
break;
|
|
||||||
case PCSX2_FRAMELIMIT_SKIP:
|
|
||||||
if( GSsetFrameSkip == NULL )
|
|
||||||
{
|
|
||||||
newOptions &= ~PCSX2_FRAMELIMIT_MASK;
|
|
||||||
Console::Notice("Notice: GS Plugin does not support frameskipping.");
|
|
||||||
limitMsg = "None/Normal";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// When enabling Skipping we have to make sure Skipper (GS) and Limiter (EE)
|
|
||||||
// are properly synchronized.
|
|
||||||
gsDynamicSkipEnable();
|
|
||||||
limitMsg = "Skip";
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
Threading::AtomicExchange( Config.Options, newOptions );
|
|
||||||
|
|
||||||
Console::Notice("Frame Limit Mode Changed: %s", params limitMsg );
|
|
||||||
|
|
||||||
// [Air]: Do we really want to save runtime changes to frameskipping?
|
|
||||||
//SaveConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProcessFKeys(int fkey, struct KeyModifiers *keymod)
|
void ProcessFKeys(int fkey, struct KeyModifiers *keymod)
|
||||||
{
|
{
|
||||||
assert(fkey >= 1 && fkey <= 12 );
|
assert(fkey >= 1 && fkey <= 12 );
|
||||||
|
@ -535,7 +459,8 @@ void ProcessFKeys(int fkey, struct KeyModifiers *keymod)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 4:
|
case 4:
|
||||||
CycleFrameLimit(keymod->shift ? -1 : 1);
|
// FIXME : Reimplement framelimiting using new oolean system
|
||||||
|
//CycleFrameLimit(keymod->shift ? -1 : 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// note: VK_F5-VK_F7 are reserved for GS
|
// note: VK_F5-VK_F7 are reserved for GS
|
||||||
|
|
|
@ -44,10 +44,6 @@ extern u32 g_sseVUMXCSR, g_sseMXCSR;
|
||||||
extern void ProcessFKeys(int fkey, struct KeyModifiers *keymod); // processes fkey related commands value 1-12
|
extern void ProcessFKeys(int fkey, struct KeyModifiers *keymod); // processes fkey related commands value 1-12
|
||||||
extern bool IsBIOS(const wxString& filename, wxString& description);
|
extern bool IsBIOS(const wxString& filename, wxString& description);
|
||||||
|
|
||||||
//extern const char *LabelAuthors;
|
|
||||||
//extern const char *LabelGreets;
|
|
||||||
void CycleFrameLimit(int dir);
|
|
||||||
|
|
||||||
void SaveGSState(const wxString& file);
|
void SaveGSState(const wxString& file);
|
||||||
void LoadGSState(const wxString& file);
|
void LoadGSState(const wxString& file);
|
||||||
|
|
||||||
|
|
|
@ -709,8 +709,8 @@ void patchFunc_roundmode( char * cmd, char * param )
|
||||||
int index;
|
int index;
|
||||||
char * pText;
|
char * pText;
|
||||||
|
|
||||||
u32 eetype = (Config.sseMXCSR & 0x6000);
|
u32 eetype = (EmuConfig.Cpu.sseMXCSR & 0x6000);
|
||||||
u32 vutype = (Config.sseVUMXCSR & 0x6000);
|
u32 vutype = (EmuConfig.Cpu.sseVUMXCSR & 0x6000);
|
||||||
|
|
||||||
index = 0;
|
index = 0;
|
||||||
pText = strtok( param, ", " );
|
pText = strtok( param, ", " );
|
||||||
|
@ -755,5 +755,5 @@ void patchFunc_zerogs(char* cmd, char* param)
|
||||||
|
|
||||||
void SetRoundMode(u32 ee, u32 vu)
|
void SetRoundMode(u32 ee, u32 vu)
|
||||||
{
|
{
|
||||||
SetCPUState( (Config.sseMXCSR & 0x9fff) | ee, (Config.sseVUMXCSR & 0x9fff) | vu);
|
SetCPUState( (EmuConfig.Cpu.sseMXCSR & 0x9fff) | ee, (EmuConfig.Cpu.sseVUMXCSR & 0x9fff) | vu);
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,107 @@
|
||||||
|
/* 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 "IniInterface.h"
|
||||||
|
#include "Config.h"
|
||||||
|
#include <wx/fileconf.h>
|
||||||
|
|
||||||
|
void Pcsx2Config::SpeedhackOptions::LoadSave( IniInterface& ini )
|
||||||
|
{
|
||||||
|
ini.SetPath( L"Speedhacks" );
|
||||||
|
|
||||||
|
IniBitfield( EECycleRate, 0 );
|
||||||
|
IniBitfield( VUCycleSteal, 0 );
|
||||||
|
IniBitBool( IopCycleRate_X2, false );
|
||||||
|
IniBitBool( IntcStat, false );
|
||||||
|
IniBitBool( BIFC0, false );
|
||||||
|
|
||||||
|
ini.SetPath( L".." );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pcsx2Config::ProfilerSettings::LoadSave( IniInterface& ini )
|
||||||
|
{
|
||||||
|
ini.SetPath( L"Profiler" );
|
||||||
|
IniBitBool( Enabled, false );
|
||||||
|
IniBitBool( RecBlocks_EE, true );
|
||||||
|
IniBitBool( RecBlocks_IOP, true );
|
||||||
|
IniBitBool( RecBlocks_VU0, true );
|
||||||
|
IniBitBool( RecBlocks_VU1, true );
|
||||||
|
ini.SetPath( L".." );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pcsx2Config::RecompilerSettings::LoadSave( IniInterface& ini )
|
||||||
|
{
|
||||||
|
ini.SetPath( L"Recompiler" );
|
||||||
|
IniBitBool( EnableEE, true );
|
||||||
|
IniBitBool( EnableIOP, true );
|
||||||
|
IniBitBool( EnableVU0, true );
|
||||||
|
IniBitBool( EnableVU1, true );
|
||||||
|
ini.SetPath( L".." );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pcsx2Config::CpuOptions::LoadSave( IniInterface& ini )
|
||||||
|
{
|
||||||
|
IniEntry( sseMXCSR, DEFAULT_sseMXCSR );
|
||||||
|
IniEntry( sseVUMXCSR, DEFAULT_sseVUMXCSR );
|
||||||
|
|
||||||
|
IniBitBool( vuOverflow, true );
|
||||||
|
IniBitBool( vuExtraOverflow, false );
|
||||||
|
IniBitBool( vuSignOverflow, false );
|
||||||
|
IniBitBool( vuUnderflow, false );
|
||||||
|
|
||||||
|
IniBitBool( fpuOverflow, true );
|
||||||
|
IniBitBool( fpuExtraOverflow, false );
|
||||||
|
IniBitBool( fpuFullMode, false );
|
||||||
|
|
||||||
|
Recompiler.LoadSave( ini );
|
||||||
|
Profiler.LoadSave( ini );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pcsx2Config::LoadSave( IniInterface& ini )
|
||||||
|
{
|
||||||
|
ini.SetPath( L"EmuCore" );
|
||||||
|
IniEntry( CdvdVerboseReads, false );
|
||||||
|
|
||||||
|
// Process various sub-components:
|
||||||
|
|
||||||
|
Speedhacks.LoadSave( ini );
|
||||||
|
Cpu.LoadSave( ini );
|
||||||
|
|
||||||
|
ini.SetPath( L".." );
|
||||||
|
ini.Flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pcsx2Config::Load( const wxString& srcfile )
|
||||||
|
{
|
||||||
|
//m_IsLoaded = true;
|
||||||
|
|
||||||
|
// Note: Extra parenthesis resolves "I think this is a function" issues with C++.
|
||||||
|
wxFileConfig cfg( srcfile );
|
||||||
|
IniLoader loader( (IniLoader( cfg )) );
|
||||||
|
LoadSave( loader );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Pcsx2Config::Save( const wxString& dstfile )
|
||||||
|
{
|
||||||
|
//if( !m_IsLoaded ) return;
|
||||||
|
|
||||||
|
wxFileConfig cfg( dstfile );
|
||||||
|
IniSaver saver( (IniSaver( cfg )) );
|
||||||
|
LoadSave( saver );
|
||||||
|
}
|
|
@ -26,6 +26,7 @@
|
||||||
#include "GS.h"
|
#include "GS.h"
|
||||||
#include "HostGui.h"
|
#include "HostGui.h"
|
||||||
#include "CDVD/CDVDisoReader.h"
|
#include "CDVD/CDVDisoReader.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Yay, order of this array shouldn't be important. :)
|
// Yay, order of this array shouldn't be important. :)
|
||||||
|
@ -380,11 +381,9 @@ static void CALLBACK CDVDplugin_Close()
|
||||||
g_plugins->Close( PluginId_CDVD );
|
g_plugins->Close( PluginId_CDVD );
|
||||||
}
|
}
|
||||||
|
|
||||||
CDVD_API CDVDapi_Plugin=
|
CDVD_API CDVDapi_Plugin =
|
||||||
{
|
{
|
||||||
{
|
CDVDplugin_Close,
|
||||||
CDVDplugin_Close
|
|
||||||
},
|
|
||||||
|
|
||||||
// The rest are filled in by the plugin manager
|
// The rest are filled in by the plugin manager
|
||||||
NULL
|
NULL
|
||||||
|
|
|
@ -105,7 +105,8 @@ void psxException(u32 code, u32 bd) {
|
||||||
PSXMu32(psxRegs.CP0.n.EPC)&= ~0x02000000;
|
PSXMu32(psxRegs.CP0.n.EPC)&= ~0x02000000;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
if (Config.PsxOut && !CHECK_EEREC) {
|
if (!CHECK_IOPREC)
|
||||||
|
{
|
||||||
u32 call = psxRegs.GPR.n.t1 & 0xff;
|
u32 call = psxRegs.GPR.n.t1 & 0xff;
|
||||||
switch (psxRegs.pc & 0x1fffff) {
|
switch (psxRegs.pc & 0x1fffff) {
|
||||||
case 0xa0:
|
case 0xa0:
|
||||||
|
|
|
@ -207,8 +207,6 @@ void zeroEx()
|
||||||
char *fname = NULL;
|
char *fname = NULL;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (!Config.PsxOut) return;
|
|
||||||
|
|
||||||
pc = psxRegs.pc;
|
pc = psxRegs.pc;
|
||||||
while (iopMemRead32(pc) != 0x41e00000) pc-=4;
|
while (iopMemRead32(pc) != 0x41e00000) pc-=4;
|
||||||
|
|
||||||
|
|
|
@ -559,8 +559,7 @@ __forceinline void cpuTestHwInts() {
|
||||||
void cpuExecuteBios()
|
void cpuExecuteBios()
|
||||||
{
|
{
|
||||||
// Set the video mode to user's default request:
|
// Set the video mode to user's default request:
|
||||||
// (right now we always default to NTSC)
|
gsSetRegionMode( (GS_RegionMode)EmuConfig.Video.DefaultRegionMode );
|
||||||
gsSetVideoRegionType( Config.PsxType & 1 );
|
|
||||||
|
|
||||||
Console::Notice( "* PCSX2 *: ExecuteBios" );
|
Console::Notice( "* PCSX2 *: ExecuteBios" );
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "GS.h"
|
#include "GS.h"
|
||||||
#include "COP0.h"
|
#include "COP0.h"
|
||||||
#include "Cache.h"
|
#include "Cache.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
using namespace R5900;
|
using namespace R5900;
|
||||||
|
|
||||||
|
|
|
@ -684,17 +684,18 @@ void SaveState::sioFreeze()
|
||||||
}
|
}
|
||||||
Freeze( m_mcdCRCs );
|
Freeze( m_mcdCRCs );
|
||||||
|
|
||||||
if( IsLoading() && Config.McdEnableEject )
|
if( IsLoading() && EmuConfig.McdEnableEjection )
|
||||||
{
|
{
|
||||||
// Note: TOTA works with values as low as 20 here.
|
// Notes:
|
||||||
|
// * TOTA works with values as low as 20 here.
|
||||||
// It "times out" with values around 1800 (forces user to check the memcard
|
// It "times out" with values around 1800 (forces user to check the memcard
|
||||||
// twice to find it). Other games could be different. :|
|
// twice to find it). Other games could be different. :|
|
||||||
|
//
|
||||||
// At 64: Disgaea 1 and 2, and Grandia 2 end up displaying a quick "no memcard!"
|
// * At 64: Disgaea 1 and 2, and Grandia 2 end up displaying a quick "no memcard!"
|
||||||
// notice before finding the memorycard and re-enumerating it. A very minor
|
// notice before finding the memorycard and re-enumerating it. A very minor
|
||||||
// annoyance, but no breakages.
|
// annoyance, but no breakages.
|
||||||
|
|
||||||
// GuitarHero will break completely with almost any value here, by design, because
|
// * GuitarHero will break completely with almost any value here, by design, because
|
||||||
// it has a "rule" that the memcard should never be ejected during a song. So by
|
// it has a "rule" that the memcard should never be ejected during a song. So by
|
||||||
// ejecting it, the game freezes (which is actually good emulation, but annoying!)
|
// ejecting it, the game freezes (which is actually good emulation, but annoying!)
|
||||||
|
|
||||||
|
|
|
@ -33,12 +33,13 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
Pcsx2Config EmuConfig = {0};
|
||||||
|
|
||||||
// disable all session overrides by default...
|
// disable all session overrides by default...
|
||||||
SessionOverrideFlags g_Session = {false};
|
SessionOverrideFlags g_Session = {false};
|
||||||
|
|
||||||
bool sysInitialized = false;
|
bool sysInitialized = false;
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
// This function should be called once during program execution.
|
// This function should be called once during program execution.
|
||||||
//
|
//
|
||||||
|
@ -326,10 +327,10 @@ void SysExecute()
|
||||||
// call to SysExecute.
|
// call to SysExecute.
|
||||||
void SysEndExecution()
|
void SysEndExecution()
|
||||||
{
|
{
|
||||||
if( Config.closeGSonEsc )
|
if( EmuConfig.closeGSonEsc )
|
||||||
StateRecovery::MakeGsOnly();
|
StateRecovery::MakeGsOnly();
|
||||||
|
|
||||||
ClosePlugins( Config.closeGSonEsc );
|
ClosePlugins( EmuConfig.closeGSonEsc );
|
||||||
g_ReturnToGui = true;
|
g_ReturnToGui = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +352,7 @@ void SysPrepareExecution( const wxString& elf_file, bool use_bios )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_Startup.BootMode = (elf_file) ? BootMode_Elf : BootMode_Normal;
|
//g_Startup.BootMode = (elf_file) ? BootMode_Elf : BootMode_Normal;
|
||||||
|
|
||||||
OpenPlugins(NULL);
|
OpenPlugins(NULL);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "Paths.h"
|
#include "Paths.h"
|
||||||
#include "Pcsx2Config.h"
|
|
||||||
#include "Utilities/SafeArray.h"
|
#include "Utilities/SafeArray.h"
|
||||||
#include "Utilities/Threading.h" // to use threading stuff, include the Threading namespace in your file.
|
#include "Utilities/Threading.h" // to use threading stuff, include the Threading namespace in your file.
|
||||||
#include "Misc.h"
|
#include "Misc.h"
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <wx/imaglist.h>
|
#include <wx/imaglist.h>
|
||||||
#include <wx/docview.h>
|
#include <wx/docview.h>
|
||||||
|
|
||||||
|
#include "AppConfig.h"
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
|
|
||||||
using namespace Threading;
|
using namespace Threading;
|
||||||
|
|
|
@ -343,15 +343,7 @@ wxString AppConfig::FullpathTo( PluginsEnum_t pluginidx ) const
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString AppConfig::FullpathToBios() const { return Path::Combine( Folders.Bios, BaseFilenames.Bios ); }
|
wxString AppConfig::FullpathToBios() const { return Path::Combine( Folders.Bios, BaseFilenames.Bios ); }
|
||||||
wxString AppConfig::FullpathToMcd( uint mcdidx ) const { return Path::Combine( Folders.MemoryCards, MemoryCards.Mcd[mcdidx].Filename ); }
|
wxString AppConfig::FullpathToMcd( uint mcdidx ) const { return Path::Combine( Folders.MemoryCards, Mcd[mcdidx].Filename ); }
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
// GCC Note: wxT() macro is required when using string token pasting. For some reason L generates
|
|
||||||
// syntax errors. >_<
|
|
||||||
//
|
|
||||||
#define IniEntry( varname, defval ) ini.Entry( wxT(#varname), varname, defval )
|
|
||||||
#define IniBitfield( varname, defval ) varname = ini.EntryBitfield( wxT(#varname), varname, defval )
|
|
||||||
#define IniBitBool( varname, defval ) varname = ini.EntryBitBool( wxT(#varname), !!varname, defval )
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void AppConfig::LoadSaveUserMode( IniInterface& ini )
|
void AppConfig::LoadSaveUserMode( IniInterface& ini )
|
||||||
|
@ -373,19 +365,18 @@ void AppConfig::LoadSave( IniInterface& ini )
|
||||||
IniEntry( Toolbar_ImageSize, 24 );
|
IniEntry( Toolbar_ImageSize, 24 );
|
||||||
IniEntry( Toolbar_ShowLabels, true );
|
IniEntry( Toolbar_ShowLabels, true );
|
||||||
|
|
||||||
IniEntry( CdvdVerboseReads, false );
|
|
||||||
|
|
||||||
// Process various sub-components:
|
// Process various sub-components:
|
||||||
ProgLogBox.LoadSave( ini, L"ProgramLog" );
|
ProgLogBox.LoadSave( ini, L"ProgramLog" );
|
||||||
Ps2ConBox.LoadSave( ini, L"Ps2Console" );
|
Ps2ConBox.LoadSave( ini, L"Ps2Console" );
|
||||||
|
|
||||||
Speedhacks.LoadSave( ini );
|
|
||||||
Folders.LoadSave( ini );
|
Folders.LoadSave( ini );
|
||||||
BaseFilenames.LoadSave( ini );
|
BaseFilenames.LoadSave( ini );
|
||||||
|
|
||||||
if( ini.IsSaving() && (g_RecentIsoList != NULL) )
|
if( ini.IsSaving() && (g_RecentIsoList != NULL) )
|
||||||
g_RecentIsoList->Save( ini.GetConfig() );
|
g_RecentIsoList->Save( ini.GetConfig() );
|
||||||
|
|
||||||
|
EmuOptions.LoadSave( ini );
|
||||||
|
|
||||||
ini.Flush();
|
ini.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -407,7 +398,7 @@ void AppConfig::Apply()
|
||||||
// Update the compression attribute on the Memcards folder.
|
// Update the compression attribute on the Memcards folder.
|
||||||
// Memcards generally compress very well via NTFS compression.
|
// Memcards generally compress very well via NTFS compression.
|
||||||
|
|
||||||
NTFS_CompressFile( g_Conf->Folders.MemoryCards.ToString(), g_Conf->MemoryCards.EnableNTFS );
|
NTFS_CompressFile( g_Conf->Folders.MemoryCards.ToString(), g_Conf->McdEnableNTFS );
|
||||||
|
|
||||||
if( !i18n_SetLanguage( LanguageId ) )
|
if( !i18n_SetLanguage( LanguageId ) )
|
||||||
{
|
{
|
||||||
|
@ -465,20 +456,6 @@ void AppConfig::ConsoleLogOptions::LoadSave( IniInterface& ini, const wxChar* lo
|
||||||
ini.SetPath( L".." );
|
ini.SetPath( L".." );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
|
||||||
void AppConfig::SpeedhackOptions::LoadSave( IniInterface& ini )
|
|
||||||
{
|
|
||||||
ini.SetPath( L"Speedhacks" );
|
|
||||||
|
|
||||||
IniBitfield( EECycleRate, 0 );
|
|
||||||
IniBitfield( VUCycleSteal, 0 );
|
|
||||||
IniBitBool( IopCycleRate_X2, false );
|
|
||||||
IniBitBool( IntcStat, false );
|
|
||||||
IniBitBool( BIFC0, false );
|
|
||||||
|
|
||||||
ini.SetPath( L".." );
|
|
||||||
}
|
|
||||||
|
|
||||||
void AppConfig::FolderOptions::ApplyDefaults()
|
void AppConfig::FolderOptions::ApplyDefaults()
|
||||||
{
|
{
|
||||||
if( UseDefaultPlugins ) Plugins = PathDefs::GetPlugins();
|
if( UseDefaultPlugins ) Plugins = PathDefs::GetPlugins();
|
||||||
|
|
|
@ -0,0 +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
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
class IniInterface;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// Pcsx2 Application Configuration.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
class AppConfig
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
struct ConsoleLogOptions
|
||||||
|
{
|
||||||
|
bool Visible;
|
||||||
|
// if true, DisplayPos is ignored and the console is automatically docked to the main window.
|
||||||
|
bool AutoDock;
|
||||||
|
// Display position used if AutoDock is false (ignored otherwise)
|
||||||
|
wxPoint DisplayPosition;
|
||||||
|
wxSize DisplaySize;
|
||||||
|
|
||||||
|
// Size of the font in points.
|
||||||
|
int FontSize;
|
||||||
|
|
||||||
|
void LoadSave( IniInterface& conf, const wxChar* title );
|
||||||
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
struct FolderOptions
|
||||||
|
{
|
||||||
|
wxDirName
|
||||||
|
Plugins,
|
||||||
|
Settings,
|
||||||
|
Bios,
|
||||||
|
Snapshots,
|
||||||
|
Savestates,
|
||||||
|
MemoryCards,
|
||||||
|
Logs;
|
||||||
|
|
||||||
|
wxDirName RunIso; // last used location for Iso loading.
|
||||||
|
|
||||||
|
bool
|
||||||
|
UseDefaultPlugins:1,
|
||||||
|
UseDefaultSettings:1,
|
||||||
|
UseDefaultBios:1,
|
||||||
|
UseDefaultSnapshots:1,
|
||||||
|
UseDefaultSavestates:1,
|
||||||
|
UseDefaultMemoryCards:1,
|
||||||
|
UseDefaultLogs:1;
|
||||||
|
|
||||||
|
void LoadSave( IniInterface& conf );
|
||||||
|
void ApplyDefaults();
|
||||||
|
|
||||||
|
void Set( FoldersEnum_t folderidx, const wxString& src, bool useDefault );
|
||||||
|
|
||||||
|
const wxDirName& operator[]( FoldersEnum_t folderidx ) const;
|
||||||
|
const bool IsDefault( FoldersEnum_t folderidx ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
struct FilenameOptions
|
||||||
|
{
|
||||||
|
wxFileName Bios;
|
||||||
|
wxFileName Plugins[PluginId_Count];
|
||||||
|
|
||||||
|
void LoadSave( IniInterface& conf );
|
||||||
|
|
||||||
|
const wxFileName& operator[]( PluginsEnum_t pluginidx ) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Options struct for each memory card.
|
||||||
|
//
|
||||||
|
struct McdOptions
|
||||||
|
{
|
||||||
|
wxFileName Filename; // user-configured location of this memory card
|
||||||
|
bool Enabled; // memory card enabled (if false, memcard will not show up in-game)
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
bool UseAdminMode; // dictates if the program uses /home/user or /cwd for the program data
|
||||||
|
wxPoint MainGuiPosition;
|
||||||
|
|
||||||
|
// Current language in use (correlates to a wxWidgets wxLANGUAGE specifier)
|
||||||
|
wxLanguage LanguageId;
|
||||||
|
|
||||||
|
int RecentFileCount; // number of files displayed in the Recent Isos list.
|
||||||
|
|
||||||
|
// String value describing the desktop theme to use for pcsk2 (icons and background images)
|
||||||
|
// The theme name is used to look up files in the themes folder (relative to the executable).
|
||||||
|
wxString DeskTheme;
|
||||||
|
|
||||||
|
// Specifies the size of icons used in Listbooks; specifically the PCSX2 Properties dialog box.
|
||||||
|
// Realistic values range from 96x96 to 24x24.
|
||||||
|
int Listbook_ImageSize;
|
||||||
|
|
||||||
|
// Specifies the size of each toolbar icon, in pixels (any value >= 2 is valid, but realistically
|
||||||
|
// values should be between 64 and 16 for usability reasons)
|
||||||
|
int Toolbar_ImageSize;
|
||||||
|
|
||||||
|
// Enables display of toolbar text labels.
|
||||||
|
bool Toolbar_ShowLabels;
|
||||||
|
|
||||||
|
// enables automatic ntfs compression of memory cards (Win32 only)
|
||||||
|
bool McdEnableNTFS;
|
||||||
|
|
||||||
|
McdOptions Mcd[2];
|
||||||
|
ConsoleLogOptions ProgLogBox;
|
||||||
|
ConsoleLogOptions Ps2ConBox;
|
||||||
|
FolderOptions Folders;
|
||||||
|
FilenameOptions BaseFilenames;
|
||||||
|
|
||||||
|
// PCSX2-core emulation options, which are passed to the emu core prior to initiating
|
||||||
|
// an emulation session. Note these are the options saved into the GUI ini file and
|
||||||
|
// which are shown as options in the gui preferences, but *not* necessarily the options
|
||||||
|
// used by emulation. The gui allows temporary per-game and commandline level overrides.
|
||||||
|
Pcsx2Config EmuOptions;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// indicates if the main AppConfig settings are valid (excludes the status of UseAdminMode,
|
||||||
|
// which is a special value that's initialized independently of the rest of the config)
|
||||||
|
bool m_IsLoaded;
|
||||||
|
|
||||||
|
public:
|
||||||
|
AppConfig() :
|
||||||
|
Listbook_ImageSize( 32 )
|
||||||
|
, Toolbar_ImageSize( 24 )
|
||||||
|
, m_IsLoaded( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
wxString FullpathToBios() const;
|
||||||
|
wxString FullpathToMcd( uint mcdidx ) const;
|
||||||
|
wxString FullpathTo( PluginsEnum_t pluginId ) const;
|
||||||
|
|
||||||
|
void Load();
|
||||||
|
void Save();
|
||||||
|
void Apply();
|
||||||
|
void LoadSaveUserMode( IniInterface& ini );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void LoadSave( IniInterface& ini );
|
||||||
|
};
|
||||||
|
|
||||||
|
extern AppConfig* g_Conf;
|
|
@ -147,3 +147,10 @@ protected:
|
||||||
void _EnumEntry( const wxString& var, int& value, const wxChar* const* enumArray, const int defvalue );
|
void _EnumEntry( const wxString& var, int& value, const wxChar* const* enumArray, const int defvalue );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// GCC Note: wxT() macro is required when using string token pasting. For some reason L generates
|
||||||
|
// syntax errors. >_<
|
||||||
|
//
|
||||||
|
#define IniEntry( varname, defval ) ini.Entry( wxT(#varname), varname, defval )
|
||||||
|
#define IniBitfield( varname, defval ) varname = ini.EntryBitfield( wxT(#varname), varname, defval )
|
||||||
|
#define IniBitBool( varname, defval ) varname = ini.EntryBitBool( wxT(#varname), !!varname, defval )
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <wx/bookctrl.h>
|
#include <wx/bookctrl.h>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
#include "AppConfig.h"
|
||||||
#include "wxHelpers.h"
|
#include "wxHelpers.h"
|
||||||
#include "Utilities/SafeArray.h"
|
#include "Utilities/SafeArray.h"
|
||||||
#include "Utilities/Threading.h"
|
#include "Utilities/Threading.h"
|
||||||
|
|
|
@ -92,6 +92,8 @@ const wxChar* Panels::SpeedHacksPanel::GetVUcycleSliderMsg( int val )
|
||||||
Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
||||||
BaseApplicableConfigPanel( &parent, idealWidth )
|
BaseApplicableConfigPanel( &parent, idealWidth )
|
||||||
{
|
{
|
||||||
|
const Pcsx2Config::SpeedhackOptions& opts( g_Conf->EmuOptions.Speedhacks );
|
||||||
|
|
||||||
wxBoxSizer& mainSizer = *new wxBoxSizer( wxVERTICAL );
|
wxBoxSizer& mainSizer = *new wxBoxSizer( wxVERTICAL );
|
||||||
wxFlexGridSizer& cycleHacksSizer = *new wxFlexGridSizer( 2 );
|
wxFlexGridSizer& cycleHacksSizer = *new wxFlexGridSizer( 2 );
|
||||||
|
|
||||||
|
@ -113,7 +115,7 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// EE Cyclerate Hack Section:
|
// EE Cyclerate Hack Section:
|
||||||
|
|
||||||
m_slider_eecycle = new wxSlider( this, wxID_ANY, g_Conf->Speedhacks.EECycleRate+1, 1, 3,
|
m_slider_eecycle = new wxSlider( this, wxID_ANY, opts.EECycleRate+1, 1, 3,
|
||||||
wxDefaultPosition, wxDefaultSize, wxHORIZONTAL | wxSL_AUTOTICKS | wxSL_LABELS );
|
wxDefaultPosition, wxDefaultSize, wxHORIZONTAL | wxSL_AUTOTICKS | wxSL_LABELS );
|
||||||
|
|
||||||
tooltip = pxE( ".Tooltips:Speedhacks:EECycleRate Slider",
|
tooltip = pxE( ".Tooltips:Speedhacks:EECycleRate Slider",
|
||||||
|
@ -123,7 +125,7 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
||||||
);
|
);
|
||||||
|
|
||||||
cyclerateSizer.Add( m_slider_eecycle, sliderFlags );
|
cyclerateSizer.Add( m_slider_eecycle, sliderFlags );
|
||||||
m_msg_eecycle = &AddStaticText( cyclerateSizer, GetEEcycleSliderMsg( g_Conf->Speedhacks.EECycleRate+1 ), wxALIGN_CENTRE, (GetIdealWidth()-24)/2 );
|
m_msg_eecycle = &AddStaticText( cyclerateSizer, GetEEcycleSliderMsg( opts.EECycleRate+1 ), wxALIGN_CENTRE, (GetIdealWidth()-24)/2 );
|
||||||
m_msg_eecycle->SetForegroundColour( wxColour( L"Red" ) );
|
m_msg_eecycle->SetForegroundColour( wxColour( L"Red" ) );
|
||||||
m_msg_eecycle->SetSizeHints( wxSize( wxDefaultCoord, pxGetTextHeight(m_msg_eecycle, 4) ) );
|
m_msg_eecycle->SetSizeHints( wxSize( wxDefaultCoord, pxGetTextHeight(m_msg_eecycle, 4) ) );
|
||||||
|
|
||||||
|
@ -133,7 +135,7 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
// VU Cycle Stealing Hack Section:
|
// VU Cycle Stealing Hack Section:
|
||||||
|
|
||||||
m_slider_vustealer = new wxSlider( this, wxID_ANY, g_Conf->Speedhacks.VUCycleSteal, 0, 4, wxDefaultPosition, wxDefaultSize,
|
m_slider_vustealer = new wxSlider( this, wxID_ANY, opts.VUCycleSteal, 0, 4, wxDefaultPosition, wxDefaultSize,
|
||||||
wxHORIZONTAL | wxSL_AUTOTICKS | wxSL_LABELS );
|
wxHORIZONTAL | wxSL_AUTOTICKS | wxSL_LABELS );
|
||||||
|
|
||||||
tooltip = pxE( ".Tooltips:Speedhacks:VUCycleStealing Slider",
|
tooltip = pxE( ".Tooltips:Speedhacks:VUCycleStealing Slider",
|
||||||
|
@ -145,7 +147,7 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
||||||
// are run, which works as a rough-guess skipping of what would normally be idle time spent running on the EE.
|
// are run, which works as a rough-guess skipping of what would normally be idle time spent running on the EE.
|
||||||
|
|
||||||
stealerSizer.Add( m_slider_vustealer, wxSizerFlags().Border( wxLEFT | wxRIGHT, 8 ).Expand() );
|
stealerSizer.Add( m_slider_vustealer, wxSizerFlags().Border( wxLEFT | wxRIGHT, 8 ).Expand() );
|
||||||
m_msg_vustealer = &AddStaticText(stealerSizer, GetVUcycleSliderMsg( g_Conf->Speedhacks.VUCycleSteal ), wxALIGN_CENTRE, (GetIdealWidth()-24)/2 );
|
m_msg_vustealer = &AddStaticText(stealerSizer, GetVUcycleSliderMsg( opts.VUCycleSteal ), wxALIGN_CENTRE, (GetIdealWidth()-24)/2 );
|
||||||
m_msg_vustealer->SetForegroundColour( wxColour( L"Red" ) );
|
m_msg_vustealer->SetForegroundColour( wxColour( L"Red" ) );
|
||||||
m_msg_vustealer->SetSizeHints( wxSize( wxDefaultCoord, pxGetTextHeight(m_msg_vustealer, 4) ) );
|
m_msg_vustealer->SetSizeHints( wxSize( wxDefaultCoord, pxGetTextHeight(m_msg_vustealer, 4) ) );
|
||||||
|
|
||||||
|
@ -190,12 +192,13 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent, int idealWidth ) :
|
||||||
|
|
||||||
void Panels::SpeedHacksPanel::Apply( AppConfig& conf )
|
void Panels::SpeedHacksPanel::Apply( AppConfig& conf )
|
||||||
{
|
{
|
||||||
conf.Speedhacks.EECycleRate = m_slider_eecycle->GetValue()-1;
|
Pcsx2Config::SpeedhackOptions& opts( conf.EmuOptions.Speedhacks );
|
||||||
conf.Speedhacks.VUCycleSteal = m_slider_vustealer->GetValue();
|
opts.EECycleRate = m_slider_eecycle->GetValue()-1;
|
||||||
|
opts.VUCycleSteal = m_slider_vustealer->GetValue();
|
||||||
|
|
||||||
conf.Speedhacks.BIFC0 = m_check_b1fc0->GetValue();
|
opts.BIFC0 = m_check_b1fc0->GetValue();
|
||||||
conf.Speedhacks.IopCycleRate_X2 = m_check_IOPx2->GetValue();
|
opts.IopCycleRate_X2 = m_check_IOPx2->GetValue();
|
||||||
conf.Speedhacks.IntcStat = m_check_intc->GetValue();
|
opts.IntcStat = m_check_intc->GetValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Panels::SpeedHacksPanel::EECycleRate_Scroll(wxScrollEvent &event)
|
void Panels::SpeedHacksPanel::EECycleRate_Scroll(wxScrollEvent &event)
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include "PrecompiledHeader.h"
|
#include "PrecompiledHeader.h"
|
||||||
#include "i18n.h"
|
#include "i18n.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
#include "Utilities/SafeArray.h"
|
#include "Utilities/SafeArray.h"
|
||||||
|
|
||||||
|
|
|
@ -362,6 +362,10 @@
|
||||||
RelativePath="..\..\Patch.h"
|
RelativePath="..\..\Patch.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\Pcsx2Config.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\PrecompiledHeader.cpp"
|
RelativePath="..\..\PrecompiledHeader.cpp"
|
||||||
>
|
>
|
||||||
|
@ -2275,6 +2279,10 @@
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\gui\AppConfig.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\Common.h"
|
RelativePath="..\..\Common.h"
|
||||||
>
|
>
|
||||||
|
|
|
@ -17,7 +17,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PrecompiledHeader.h"
|
#include "PrecompiledHeader.h"
|
||||||
#include "Pcsx2Config.h"
|
|
||||||
|
|
||||||
u32 g_sseMXCSR = DEFAULT_sseMXCSR;
|
u32 g_sseMXCSR = DEFAULT_sseMXCSR;
|
||||||
u32 g_sseVUMXCSR = DEFAULT_sseVUMXCSR;
|
u32 g_sseVUMXCSR = DEFAULT_sseVUMXCSR;
|
||||||
|
|
|
@ -38,6 +38,8 @@
|
||||||
|
|
||||||
#include "SamplProf.h"
|
#include "SamplProf.h"
|
||||||
#include "NakedAsm.h"
|
#include "NakedAsm.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
|
|
||||||
using namespace x86Emitter;
|
using namespace x86Emitter;
|
||||||
|
|
||||||
|
@ -778,7 +780,7 @@ void psxSetBranchImm( u32 imm )
|
||||||
|
|
||||||
static __forceinline u32 psxScaleBlockCycles()
|
static __forceinline u32 psxScaleBlockCycles()
|
||||||
{
|
{
|
||||||
return s_psxBlockCycles * (Config.Hacks.IOPCycleDouble ? 2 : 1);
|
return s_psxBlockCycles * (EmuConfig.Speedhacks.IopCycleRate_X2 ? 2 : 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iPsxBranchTest(u32 newpc, u32 cpuBranch)
|
static void iPsxBranchTest(u32 newpc, u32 cpuBranch)
|
||||||
|
|
|
@ -24,7 +24,6 @@
|
||||||
#include "R5900.h"
|
#include "R5900.h"
|
||||||
#include "VU.h"
|
#include "VU.h"
|
||||||
#include "iCore.h"
|
#include "iCore.h"
|
||||||
#include "Pcsx2Config.h"
|
|
||||||
|
|
||||||
#define PC_GETBLOCK(x) PC_GETBLOCK_(x, recLUT)
|
#define PC_GETBLOCK(x) PC_GETBLOCK_(x, recLUT)
|
||||||
|
|
||||||
|
|
|
@ -515,7 +515,7 @@ void recResetEE( void )
|
||||||
x86FpuState = FPU_STATE;
|
x86FpuState = FPU_STATE;
|
||||||
|
|
||||||
branch = 0;
|
branch = 0;
|
||||||
SetCPUState(Config.sseMXCSR, Config.sseVUMXCSR);
|
SetCPUState(EmuConfig.Cpu.sseMXCSR, EmuConfig.Cpu.sseVUMXCSR);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void recShutdown( void )
|
static void recShutdown( void )
|
||||||
|
@ -990,7 +990,7 @@ static u32 scaleBlockCycles_helper()
|
||||||
// caused by sync hacks and such, since games seem to care a lot more about
|
// caused by sync hacks and such, since games seem to care a lot more about
|
||||||
// these small blocks having accurate cycle counts.
|
// these small blocks having accurate cycle counts.
|
||||||
|
|
||||||
if( s_nBlockCycles <= (5<<3) || (Config.Hacks.EECycleRate == 0) )
|
if( s_nBlockCycles <= (5<<3) || (EmuConfig.Speedhacks.EECycleRate == 0) )
|
||||||
return s_nBlockCycles >> 3;
|
return s_nBlockCycles >> 3;
|
||||||
|
|
||||||
uint scalarLow, scalarMid, scalarHigh;
|
uint scalarLow, scalarMid, scalarHigh;
|
||||||
|
@ -998,7 +998,7 @@ static u32 scaleBlockCycles_helper()
|
||||||
// Note: larger blocks get a smaller scalar, to help keep
|
// Note: larger blocks get a smaller scalar, to help keep
|
||||||
// them from becoming "too fat" and delaying branch tests.
|
// them from becoming "too fat" and delaying branch tests.
|
||||||
|
|
||||||
switch( Config.Hacks.EECycleRate )
|
switch( EmuConfig.Speedhacks.EECycleRate )
|
||||||
{
|
{
|
||||||
case 0: return s_nBlockCycles >> 3;
|
case 0: return s_nBlockCycles >> 3;
|
||||||
|
|
||||||
|
@ -1052,7 +1052,7 @@ static void iBranchTest(u32 newpc, bool noDispatch)
|
||||||
// cpuRegs.cycle += blockcycles;
|
// cpuRegs.cycle += blockcycles;
|
||||||
// if( cpuRegs.cycle > g_nextBranchCycle ) { DoEvents(); }
|
// if( cpuRegs.cycle > g_nextBranchCycle ) { DoEvents(); }
|
||||||
|
|
||||||
if (Config.Hacks.IdleLoopFF && s_nBlockFF) {
|
if (EmuConfig.Speedhacks.BIFC0 && s_nBlockFF) {
|
||||||
xMOV(eax, ptr32[&g_nextBranchCycle]);
|
xMOV(eax, ptr32[&g_nextBranchCycle]);
|
||||||
xADD(ptr32[&cpuRegs.cycle], eeScaleBlockCycles());
|
xADD(ptr32[&cpuRegs.cycle], eeScaleBlockCycles());
|
||||||
xCMP(eax, ptr32[&cpuRegs.cycle]);
|
xCMP(eax, ptr32[&cpuRegs.cycle]);
|
||||||
|
|
|
@ -452,7 +452,7 @@ void vtlb_DynGenRead32_Const( u32 bits, bool sign, u32 addr_const )
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shortcut for the INTC_STAT register, which many games like to spin on heavily.
|
// Shortcut for the INTC_STAT register, which many games like to spin on heavily.
|
||||||
if( (bits == 32) && !Config.Hacks.INTCSTATSlow && (paddr == INTC_STAT) )
|
if( (bits == 32) && !EmuConfig.Speedhacks.IntcStat && (paddr == INTC_STAT) )
|
||||||
{
|
{
|
||||||
xMOV( eax, &psHu32( INTC_STAT ) );
|
xMOV( eax, &psHu32( INTC_STAT ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -129,7 +129,7 @@ microVUx(void) mVUcleanUp() {
|
||||||
mVUcacheCheck(x86Ptr, mVU->prog.x86start, (uptr)(mVU->prog.x86end - mVU->prog.x86start));
|
mVUcacheCheck(x86Ptr, mVU->prog.x86start, (uptr)(mVU->prog.x86end - mVU->prog.x86start));
|
||||||
mVU->cycles = mVU->totalCycles - mVU->cycles;
|
mVU->cycles = mVU->totalCycles - mVU->cycles;
|
||||||
mVU->regs->cycle += mVU->cycles;
|
mVU->regs->cycle += mVU->cycles;
|
||||||
cpuRegs.cycle += ((mVU->cycles < 3000) ? mVU->cycles : 3000) * Config.Hacks.VUCycleSteal;
|
cpuRegs.cycle += ((mVU->cycles < 3000) ? mVU->cycles : 3000) * EmuConfig.Speedhacks.VUCycleSteal;
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------
|
//------------------------------------------------------------------
|
||||||
|
|
|
@ -272,8 +272,8 @@ typedef u32 (__fastcall *mVUCall)(void*, void*);
|
||||||
|
|
||||||
// Speed Hacks
|
// Speed Hacks
|
||||||
#define CHECK_VU_CONSTHACK 0 // Only use for GoW (will be slower on other games)
|
#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_FLAGHACK (EmuConfig.Speedhacks.vuFlagHack) // (Can cause Infinite loops, SPS, etc...)
|
||||||
#define CHECK_VU_MINMAXHACK (u32)Config.Hacks.vuMinMax // (Can cause SPS, Black Screens, etc...)
|
#define CHECK_VU_MINMAXHACK (EmuConfig.Speedhacks.vuMinMax) // (Can cause SPS, Black Screens, etc...)
|
||||||
|
|
||||||
// Unknown Data
|
// Unknown Data
|
||||||
#define mVU_XGKICK_CYCLES ((CHECK_XGKICKHACK) ? 3 : 1)
|
#define mVU_XGKICK_CYCLES ((CHECK_XGKICKHACK) ? 3 : 1)
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include "sVU_zerorec.h"
|
#include "sVU_zerorec.h"
|
||||||
#include "SamplProf.h"
|
#include "SamplProf.h"
|
||||||
#include "NakedAsm.h"
|
#include "NakedAsm.h"
|
||||||
|
#include "AppConfig.h"
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -2550,9 +2551,9 @@ void SuperVUCleanupProgram(u32 startpc, int vuindex)
|
||||||
|
|
||||||
//VU cycle stealing hack, 3000 cycle maximum so it doesn't get out of hand
|
//VU cycle stealing hack, 3000 cycle maximum so it doesn't get out of hand
|
||||||
if (s_TotalVUCycles < 3000)
|
if (s_TotalVUCycles < 3000)
|
||||||
cpuRegs.cycle += s_TotalVUCycles * Config.Hacks.VUCycleSteal;
|
cpuRegs.cycle += s_TotalVUCycles * EmuConfig.Speedhacks.VUCycleSteal;
|
||||||
else
|
else
|
||||||
cpuRegs.cycle += 3000 * Config.Hacks.VUCycleSteal;
|
cpuRegs.cycle += 3000 * EmuConfig.Speedhacks.VUCycleSteal;
|
||||||
|
|
||||||
if ((int)s_writeQ > 0) VU->VI[REG_Q] = VU->q;
|
if ((int)s_writeQ > 0) VU->VI[REG_Q] = VU->q;
|
||||||
if ((int)s_writeP > 0)
|
if ((int)s_writeP > 0)
|
||||||
|
|
|
@ -207,24 +207,19 @@ Global
|
||||||
{5307BBB7-EBB9-4AA4-8CB6-A94EC473C8C4}.Release|x64.ActiveCfg = Release|Win32
|
{5307BBB7-EBB9-4AA4-8CB6-A94EC473C8C4}.Release|x64.ActiveCfg = Release|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|Win32.ActiveCfg = Debug SSE2|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|Win32.ActiveCfg = Debug SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|Win32.Build.0 = Debug SSE2|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|Win32.Build.0 = Debug SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|x64.ActiveCfg = Debug|x64
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|x64.ActiveCfg = Debug|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Debug|x64.Build.0 = Debug|x64
|
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|Win32.ActiveCfg = Release SSE2|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|Win32.ActiveCfg = Release SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|Win32.Build.0 = Release SSE2|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|Win32.Build.0 = Release SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|x64.ActiveCfg = Debug SSE4|x64
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|x64.ActiveCfg = Debug|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Devel|x64.Build.0 = Debug SSE4|x64
|
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|Win32.ActiveCfg = Release SSE2|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|Win32.ActiveCfg = Release SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|Win32.Build.0 = Release SSE2|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|Win32.Build.0 = Release SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|x64.ActiveCfg = Release SSE2|x64
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|x64.ActiveCfg = Release SSE2|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE2|x64.Build.0 = Release SSE2|x64
|
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|Win32.ActiveCfg = Release SSE4|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|Win32.ActiveCfg = Release SSE4|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|Win32.Build.0 = Release SSE4|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|Win32.Build.0 = Release SSE4|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|x64.ActiveCfg = Release SSE4|x64
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|x64.ActiveCfg = Release SSE4|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSE4|x64.Build.0 = Release SSE4|x64
|
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|Win32.ActiveCfg = Release SSSE3|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|Win32.ActiveCfg = Release SSSE3|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|Win32.Build.0 = Release SSSE3|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|Win32.Build.0 = Release SSSE3|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|x64.ActiveCfg = Release SSSE3|x64
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|x64.ActiveCfg = Release SSSE3|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release SSSE3|x64.Build.0 = Release SSSE3|x64
|
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release|Win32.ActiveCfg = Release|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release|Win32.Build.0 = Release|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release|Win32.Build.0 = Release|Win32
|
||||||
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release|x64.ActiveCfg = Release|Win32
|
{18E42F6F-3A62-41EE-B42F-79366C4F1E95}.Release|x64.ActiveCfg = Release|Win32
|
||||||
|
|
Loading…
Reference in New Issue