/[pcsx2_0.9.7]/trunk/pcsx2/Pcsx2Config.cpp
ViewVC logotype

Contents of /trunk/pcsx2/Pcsx2Config.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (show annotations) (download)
Tue Sep 7 11:08:22 2010 UTC (10 years, 1 month ago) by william
File size: 9842 byte(s)
Auto Commited Import of: pcsx2-0.9.7-r3738-debug in ./trunk
1 /* PCSX2 - PS2 Emulator for PCs
2 * Copyright (C) 2002-2010 PCSX2 Dev Team
3 *
4 * PCSX2 is free software: you can redistribute it and/or modify it under the terms
5 * of the GNU Lesser General Public License as published by the Free Software Found-
6 * ation, either version 3 of the License, or (at your option) any later version.
7 *
8 * PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
9 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
10 * PURPOSE. See the GNU General Public License for more details.
11 *
12 * You should have received a copy of the GNU General Public License along with PCSX2.
13 * If not, see <http://www.gnu.org/licenses/>.
14 */
15
16 #include "PrecompiledHeader.h"
17
18 #include <wx/fileconf.h>
19
20 #include "Utilities/IniInterface.h"
21 #include "Config.h"
22 #include "GS.h"
23
24 void TraceLogFilters::LoadSave( IniInterface& ini )
25 {
26 TraceLogFilters defaults;
27 ScopedIniGroup path( ini, L"TraceLog" );
28
29 IniEntry( Enabled );
30
31 // Retaining backwards compat of the trace log enablers isn't really important, and
32 // doing each one by hand would be murder. So let's cheat and just save it as an int:
33
34 IniEntry( EE.bitset );
35 IniEntry( IOP.bitset );
36 }
37
38 // all speedhacks are disabled by default
39 Pcsx2Config::SpeedhackOptions::SpeedhackOptions()
40 {
41 bitset = 0;
42 EECycleRate = 0;
43 VUCycleSteal = 0;
44 }
45
46 void Pcsx2Config::SpeedhackOptions::LoadSave( IniInterface& ini )
47 {
48 SpeedhackOptions defaults;
49 ScopedIniGroup path( ini, L"Speedhacks" );
50
51 IniBitfield( EECycleRate );
52 IniBitfield( VUCycleSteal );
53 IniBitBool( fastCDVD );
54 IniBitBool( IntcStat );
55 IniBitBool( WaitLoop );
56 IniBitBool( vuFlagHack );
57 IniBitBool( vuBlockHack );
58 IniBitBool( vuMinMax );
59 }
60
61 void Pcsx2Config::ProfilerOptions::LoadSave( IniInterface& ini )
62 {
63 ProfilerOptions defaults;
64 ScopedIniGroup path( ini, L"Profiler" );
65
66 IniBitBool( Enabled );
67 IniBitBool( RecBlocks_EE );
68 IniBitBool( RecBlocks_IOP );
69 IniBitBool( RecBlocks_VU0 );
70 IniBitBool( RecBlocks_VU1 );
71 }
72
73 Pcsx2Config::RecompilerOptions::RecompilerOptions()
74 {
75 bitset = 0;
76
77 //StackFrameChecks = false;
78 //PreBlockCheckEE = false;
79
80 // All recs are enabled by default.
81
82 EnableEE = true;
83 EnableIOP = true;
84 EnableVU0 = true;
85 EnableVU1 = true;
86
87 UseMicroVU0 = true;
88 UseMicroVU1 = true;
89
90 // vu and fpu clamping default to standard overflow.
91 vuOverflow = true;
92 //vuExtraOverflow = false;
93 //vuSignOverflow = false;
94 //vuUnderflow = false;
95
96 fpuOverflow = true;
97 //fpuExtraOverflow = false;
98 //fpuFullMode = false;
99 }
100
101 void Pcsx2Config::RecompilerOptions::ApplySanityCheck()
102 {
103 bool fpuIsRight = true;
104
105 if( fpuExtraOverflow )
106 fpuIsRight = fpuOverflow;
107
108 if( fpuFullMode )
109 fpuIsRight = fpuOverflow && fpuExtraOverflow;
110
111 if( !fpuIsRight )
112 {
113 // Values are wonky; assume the defaults.
114 fpuOverflow = RecompilerOptions().fpuOverflow;
115 fpuExtraOverflow= RecompilerOptions().fpuExtraOverflow;
116 fpuFullMode = RecompilerOptions().fpuFullMode;
117 }
118
119 bool vuIsOk = true;
120
121 if( vuExtraOverflow ) vuIsOk = vuIsOk && vuOverflow;
122 if( vuSignOverflow ) vuIsOk = vuIsOk && vuExtraOverflow;
123
124 if( !vuIsOk )
125 {
126 // Values are wonky; assume the defaults.
127 vuOverflow = RecompilerOptions().vuOverflow;
128 vuExtraOverflow = RecompilerOptions().vuExtraOverflow;
129 vuSignOverflow = RecompilerOptions().vuSignOverflow;
130 vuUnderflow = RecompilerOptions().vuUnderflow;
131 }
132 }
133
134 void Pcsx2Config::RecompilerOptions::LoadSave( IniInterface& ini )
135 {
136 RecompilerOptions defaults;
137 ScopedIniGroup path( ini, L"Recompiler" );
138
139 IniBitBool( EnableEE );
140 IniBitBool( EnableIOP );
141 IniBitBool( EnableVU0 );
142 IniBitBool( EnableVU1 );
143
144 IniBitBool( UseMicroVU0 );
145 IniBitBool( UseMicroVU1 );
146
147 IniBitBool( vuOverflow );
148 IniBitBool( vuExtraOverflow );
149 IniBitBool( vuSignOverflow );
150 IniBitBool( vuUnderflow );
151
152 IniBitBool( fpuOverflow );
153 IniBitBool( fpuExtraOverflow );
154 IniBitBool( fpuFullMode );
155
156 IniBitBool( StackFrameChecks );
157 IniBitBool( PreBlockCheckEE );
158 IniBitBool( PreBlockCheckIOP );
159 }
160
161 Pcsx2Config::CpuOptions::CpuOptions()
162 {
163 sseMXCSR.bitmask = DEFAULT_sseMXCSR;
164 sseVUMXCSR.bitmask = DEFAULT_sseVUMXCSR;
165 }
166
167 void Pcsx2Config::CpuOptions::ApplySanityCheck()
168 {
169 sseMXCSR.ClearExceptionFlags().DisableExceptions();
170 sseVUMXCSR.ClearExceptionFlags().DisableExceptions();
171
172 Recompiler.ApplySanityCheck();
173 }
174
175 void Pcsx2Config::CpuOptions::LoadSave( IniInterface& ini )
176 {
177 CpuOptions defaults;
178 ScopedIniGroup path( ini, L"CPU" );
179
180 IniBitBoolEx( sseMXCSR.DenormalsAreZero, "FPU.DenormalsAreZero" );
181 IniBitBoolEx( sseMXCSR.FlushToZero, "FPU.FlushToZero" );
182 IniBitfieldEx( sseMXCSR.RoundingControl, "FPU.Roundmode" );
183
184 IniBitBoolEx( sseVUMXCSR.DenormalsAreZero, "VU.DenormalsAreZero" );
185 IniBitBoolEx( sseVUMXCSR.FlushToZero, "VU.FlushToZero" );
186 IniBitfieldEx( sseVUMXCSR.RoundingControl, "VU.Roundmode" );
187
188 Recompiler.LoadSave( ini );
189 }
190
191 // Default GSOptions
192 Pcsx2Config::GSOptions::GSOptions()
193 {
194 FrameLimitEnable = true;
195 FrameSkipEnable = false;
196 VsyncEnable = false;
197
198 SynchronousMTGS = false;
199 DisableOutput = false;
200 VsyncQueueSize = 2;
201
202 DefaultRegionMode = Region_NTSC;
203 FramesToDraw = 2;
204 FramesToSkip = 2;
205
206 LimitScalar = 1.0;
207 FramerateNTSC = 59.94;
208 FrameratePAL = 50.0;
209 }
210
211 void Pcsx2Config::GSOptions::LoadSave( IniInterface& ini )
212 {
213 GSOptions defaults;
214 ScopedIniGroup path( ini, L"GS" );
215
216 IniEntry( SynchronousMTGS );
217 IniEntry( DisableOutput );
218 IniEntry( VsyncQueueSize );
219
220 IniEntry( FrameLimitEnable );
221 IniEntry( FrameSkipEnable );
222 IniEntry( VsyncEnable );
223
224 IniEntry( LimitScalar );
225 IniEntry( FramerateNTSC );
226 IniEntry( FrameratePAL );
227
228 static const wxChar * const ntsc_pal_str[2] = { L"ntsc", L"pal" };
229 ini.EnumEntry( L"DefaultRegionMode", DefaultRegionMode, ntsc_pal_str, defaults.DefaultRegionMode );
230
231 IniEntry( FramesToDraw );
232 IniEntry( FramesToSkip );
233 }
234
235 const wxChar *const tbl_GamefixNames[] =
236 {
237 L"VuAddSub",
238 L"VuClipFlag",
239 L"FpuCompare",
240 L"FpuMul",
241 L"FpuNegDiv",
242 L"XGKick",
243 L"IpuWait",
244 L"EETiming",
245 L"SkipMpeg",
246 L"OPHFlag"
247 };
248
249 const __fi wxChar* EnumToString( GamefixId id )
250 {
251 return tbl_GamefixNames[id];
252 }
253
254 // Enables a full list of gamefixes. The list can be either comma or pipe-delimited.
255 // Example: "XGKick,IpuWait" or "EEtiming,FpuCompare"
256 // If an unrecognized tag is encountered, a warning is printed to the console, but no error
257 // is generated. This allows the system to function in the event that future versions of
258 // PCSX2 remove old hacks once they become obsolete.
259 void Pcsx2Config::GamefixOptions::Set( const wxString& list, bool enabled )
260 {
261 wxStringTokenizer izer( list, L",|", wxTOKEN_STRTOK );
262
263 while( izer.HasMoreTokens() )
264 {
265 wxString token( izer.GetNextToken() );
266
267 GamefixId i;
268 for (i=GamefixId_FIRST; i < pxEnumEnd; ++i)
269 {
270 if( token.CmpNoCase( EnumToString(i) ) == 0 ) break;
271 }
272 if( i < pxEnumEnd ) Set( i );
273 }
274 }
275
276 void Pcsx2Config::GamefixOptions::Set( GamefixId id, bool enabled )
277 {
278 EnumAssert( id );
279 switch(id)
280 {
281 case Fix_VuAddSub: VuAddSubHack = enabled; break;
282 case Fix_VuClipFlag: VuClipFlagHack = enabled; break;
283 case Fix_FpuCompare: FpuCompareHack = enabled; break;
284 case Fix_FpuMultiply: FpuMulHack = enabled; break;
285 case Fix_FpuNegDiv: FpuNegDivHack = enabled; break;
286 case Fix_XGKick: XgKickHack = enabled; break;
287 case Fix_IpuWait: IPUWaitHack = enabled; break;
288 case Fix_EETiming: EETimingHack = enabled; break;
289 case Fix_SkipMpeg: SkipMPEGHack = enabled; break;
290 case Fix_OPHFlag: OPHFlagHack = enabled; break;
291
292 jNO_DEFAULT;
293 }
294 }
295
296 bool Pcsx2Config::GamefixOptions::Get( GamefixId id ) const
297 {
298 EnumAssert( id );
299 switch(id)
300 {
301 case Fix_VuAddSub: return VuAddSubHack;
302 case Fix_VuClipFlag: return VuClipFlagHack;
303 case Fix_FpuCompare: return FpuCompareHack;
304 case Fix_FpuMultiply: return FpuMulHack;
305 case Fix_FpuNegDiv: return FpuNegDivHack;
306 case Fix_XGKick: return XgKickHack;
307 case Fix_IpuWait: return IPUWaitHack;
308 case Fix_EETiming: return EETimingHack;
309 case Fix_SkipMpeg: return SkipMPEGHack;
310 case Fix_OPHFlag: return OPHFlagHack;
311
312 jNO_DEFAULT
313 }
314 return false; // unreachable, but we still need to suppress warnings >_<
315 }
316
317 void Pcsx2Config::GamefixOptions::LoadSave( IniInterface& ini )
318 {
319 GamefixOptions defaults;
320 ScopedIniGroup path( ini, L"Gamefixes" );
321
322 IniBitBool( VuAddSubHack );
323 IniBitBool( VuClipFlagHack );
324 IniBitBool( FpuCompareHack );
325 IniBitBool( FpuMulHack );
326 IniBitBool( FpuNegDivHack );
327 IniBitBool( XgKickHack );
328 IniBitBool( IPUWaitHack );
329 IniBitBool( EETimingHack );
330 IniBitBool( SkipMPEGHack );
331 IniBitBool( OPHFlagHack );
332 }
333
334 Pcsx2Config::Pcsx2Config()
335 {
336 bitset = 0;
337 McdEnableEjection = true;
338 }
339
340 void Pcsx2Config::LoadSave( IniInterface& ini )
341 {
342 Pcsx2Config defaults;
343 ScopedIniGroup path( ini, L"EmuCore" );
344
345 IniBitBool( CdvdVerboseReads );
346 IniBitBool( CdvdDumpBlocks );
347 IniBitBool( EnablePatches );
348 IniBitBool( EnableCheats );
349 IniBitBool( ConsoleToStdio );
350 IniBitBool( HostFs );
351
352 IniBitBool( McdEnableEjection );
353 IniBitBool( MultitapPort0_Enabled );
354 IniBitBool( MultitapPort1_Enabled );
355
356 // Process various sub-components:
357
358 Speedhacks .LoadSave( ini );
359 Cpu .LoadSave( ini );
360 GS .LoadSave( ini );
361 Gamefixes .LoadSave( ini );
362 Profiler .LoadSave( ini );
363
364 Trace .LoadSave( ini );
365
366 ini.Flush();
367 }
368
369 bool Pcsx2Config::MultitapEnabled( uint port ) const
370 {
371 pxAssert( port < 2 );
372 return (port==0) ? MultitapPort0_Enabled : MultitapPort1_Enabled;
373 }
374
375 void Pcsx2Config::Load( const wxString& srcfile )
376 {
377 //m_IsLoaded = true;
378
379 // Note: Extra parenthesis resolves "I think this is a function" issues with C++.
380 wxFileConfig cfg( srcfile );
381 IniLoader loader( (IniLoader( cfg )) );
382 LoadSave( loader );
383 }
384
385 void Pcsx2Config::Save( const wxString& dstfile )
386 {
387 //if( !m_IsLoaded ) return;
388
389 wxFileConfig cfg( dstfile );
390 IniSaver saver( (IniSaver( cfg )) );
391 LoadSave( saver );
392 }

  ViewVC Help
Powered by ViewVC 1.1.22