1 | //============================================================================ |
2 | // |
3 | // SSSS tt lll lll |
4 | // SS SS tt ll ll |
5 | // SS tttttt eeee ll ll aaaa |
6 | // SSSS tt ee ee ll ll aa |
7 | // SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" |
8 | // SS SS tt ee ll ll aa aa |
9 | // SSSS ttt eeeee llll llll aaaaa |
10 | // |
11 | // Copyright (c) 1995-2019 by Bradford W. Mott, Stephen Anthony |
12 | // and the Stella Team |
13 | // |
14 | // See the file "License.txt" for information on usage and redistribution of |
15 | // this file, and for a DISCLAIMER OF ALL WARRANTIES. |
16 | //============================================================================ |
17 | |
18 | #include "bspf.hxx" |
19 | |
20 | #include "OSystem.hxx" |
21 | #include "Version.hxx" |
22 | #include "Logger.hxx" |
23 | #include "AudioSettings.hxx" |
24 | |
25 | #ifdef DEBUGGER_SUPPORT |
26 | #include "DebuggerDialog.hxx" |
27 | #endif |
28 | |
29 | #include "Settings.hxx" |
30 | #include "repository/KeyValueRepositoryNoop.hxx" |
31 | |
32 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
33 | Settings::Settings() |
34 | { |
35 | myRespository = make_shared<KeyValueRepositoryNoop>(); |
36 | |
37 | // Video-related options |
38 | setPermanent("video" , "" ); |
39 | setPermanent("speed" , "1.0" ); |
40 | setPermanent("vsync" , "true" ); |
41 | setPermanent("center" , "true" ); |
42 | setPermanent("windowedpos" , Common::Point(50, 50)); |
43 | setPermanent("display" , 0); |
44 | setPermanent("palette" , "standard" ); |
45 | setPermanent("uimessages" , "true" ); |
46 | |
47 | // TIA specific options |
48 | setPermanent("tia.zoom" , "3" ); |
49 | setPermanent("tia.inter" , "false" ); |
50 | setPermanent("tia.aspectn" , "100" ); |
51 | setPermanent("tia.aspectp" , "100" ); |
52 | setPermanent("fullscreen" , "false" ); |
53 | setPermanent("tia.fs_stretch" , "false" ); |
54 | setPermanent("tia.fs_overscan" , "0" ); |
55 | setPermanent("tia.dbgcolors" , "roygpb" ); |
56 | |
57 | // TV filtering options |
58 | setPermanent("tv.filter" , "0" ); |
59 | setPermanent("tv.phosphor" , "byrom" ); |
60 | setPermanent("tv.phosblend" , "50" ); |
61 | setPermanent("tv.scanlines" , "25" ); |
62 | // TV options when using 'custom' mode |
63 | setPermanent("tv.contrast" , "0.0" ); |
64 | setPermanent("tv.brightness" , "0.0" ); |
65 | setPermanent("tv.hue" , "0.0" ); |
66 | setPermanent("tv.saturation" , "0.0" ); |
67 | setPermanent("tv.gamma" , "0.0" ); |
68 | setPermanent("tv.sharpness" , "0.0" ); |
69 | setPermanent("tv.resolution" , "0.0" ); |
70 | setPermanent("tv.artifacts" , "0.0" ); |
71 | setPermanent("tv.fringing" , "0.0" ); |
72 | setPermanent("tv.bleed" , "0.0" ); |
73 | |
74 | // Sound options |
75 | setPermanent(AudioSettings::SETTING_ENABLED, AudioSettings::DEFAULT_ENABLED); |
76 | setPermanent(AudioSettings::SETTING_VOLUME, AudioSettings::DEFAULT_VOLUME); |
77 | setPermanent(AudioSettings::SETTING_PRESET, static_cast<int>(AudioSettings::DEFAULT_PRESET)); |
78 | setPermanent(AudioSettings::SETTING_FRAGMENT_SIZE, AudioSettings::DEFAULT_FRAGMENT_SIZE); |
79 | setPermanent(AudioSettings::SETTING_SAMPLE_RATE, AudioSettings::DEFAULT_SAMPLE_RATE); |
80 | setPermanent(AudioSettings::SETTING_RESAMPLING_QUALITY, static_cast<int>(AudioSettings::DEFAULT_RESAMPLING_QUALITY)); |
81 | setPermanent(AudioSettings::SETTING_HEADROOM, AudioSettings::DEFAULT_HEADROOM); |
82 | setPermanent(AudioSettings::SETTING_BUFFER_SIZE, AudioSettings::DEFAULT_BUFFER_SIZE); |
83 | setPermanent(AudioSettings::SETTING_STEREO, AudioSettings::DEFAULT_STEREO); |
84 | setPermanent(AudioSettings::SETTING_DPC_PITCH, AudioSettings::DEFAULT_DPC_PITCH); |
85 | |
86 | // Input event options |
87 | setPermanent("event_ver" , "1" ); |
88 | setPermanent("keymap_emu" , "" ); |
89 | setPermanent("keymap_joy" , "" ); |
90 | setPermanent("keymap_pad" , "" ); |
91 | setPermanent("keymap_key" , "" ); |
92 | setPermanent("keymap_ui" , "" ); |
93 | setPermanent("joymap" , "" ); |
94 | setPermanent("combomap" , "" ); |
95 | setPermanent("joydeadzone" , "13" ); |
96 | setPermanent("joyallow4" , "false" ); |
97 | setPermanent("usemouse" , "analog" ); |
98 | setPermanent("grabmouse" , "true" ); |
99 | setPermanent("cursor" , "2" ); |
100 | setPermanent("dejitter.base" , "0" ); |
101 | setPermanent("dejitter.diff" , "0" ); |
102 | setPermanent("dsense" , "10" ); |
103 | setPermanent("msense" , "10" ); |
104 | setPermanent("tsense" , "10" ); |
105 | setPermanent("saport" , "lr" ); |
106 | setPermanent("modcombo" , "true" ); |
107 | |
108 | // Snapshot options |
109 | setPermanent("snapsavedir" , "" ); |
110 | setPermanent("snaploaddir" , "" ); |
111 | setPermanent("snapname" , "int" ); |
112 | setPermanent("sssingle" , "false" ); |
113 | setPermanent("ss1x" , "false" ); |
114 | setPermanent("ssinterval" , "2" ); |
115 | setPermanent("autoslot" , "false" ); |
116 | setPermanent("saveonexit" , "none" ); |
117 | |
118 | // Config files and paths |
119 | setPermanent("romdir" , "" ); |
120 | |
121 | // ROM browser options |
122 | setPermanent("exitlauncher" , "false" ); |
123 | setPermanent("launcherres" , Common::Size(900, 600)); |
124 | setPermanent("launcherfont" , "medium" ); |
125 | setPermanent("launcherroms" , "true" ); |
126 | setPermanent("romviewer" , "1" ); |
127 | setPermanent("lastrom" , "" ); |
128 | |
129 | // UI-related options |
130 | #ifdef DEBUGGER_SUPPORT |
131 | setPermanent("dbg.res" , |
132 | Common::Size(DebuggerDialog::kMediumFontMinW, |
133 | DebuggerDialog::kMediumFontMinH)); |
134 | #endif |
135 | setPermanent("uipalette" , "standard" ); |
136 | setPermanent("hidpi" , "false" ); |
137 | setPermanent("listdelay" , "300" ); |
138 | setPermanent("mwheel" , "4" ); |
139 | setPermanent("mdouble" , "500" ); |
140 | setPermanent("ctrldelay" , "400" ); |
141 | setPermanent("ctrlrate" , "20" ); |
142 | setPermanent("basic_settings" , false); |
143 | setPermanent("dialogpos" , 0); |
144 | |
145 | // Misc options |
146 | setPermanent("loglevel" , int(Logger::Level::INFO)); |
147 | setPermanent("logtoconsole" , "0" ); |
148 | setPermanent("avoxport" , "" ); |
149 | setPermanent("fastscbios" , "true" ); |
150 | setPermanent("threads" , "false" ); |
151 | setTemporary("romloadcount" , "0" ); |
152 | setTemporary("maxres" , "" ); |
153 | |
154 | #ifdef DEBUGGER_SUPPORT |
155 | // Debugger/disassembly options |
156 | setPermanent("dbg.fontsize" , "medium" ); |
157 | setPermanent("dbg.fontstyle" , "0" ); |
158 | setPermanent("dbg.uhex" , "false" ); |
159 | setPermanent("dbg.ghostreadstrap" , "true" ); |
160 | setPermanent("dis.resolve" , "true" ); |
161 | setPermanent("dis.gfxformat" , "2" ); |
162 | setPermanent("dis.showaddr" , "true" ); |
163 | setPermanent("dis.relocate" , "false" ); |
164 | setPermanent("dev.rwportbreak" , "true" ); |
165 | setPermanent("dev.wrportbreak" , "true" ); |
166 | #endif |
167 | |
168 | // Player settings |
169 | setPermanent("plr.stats" , "false" ); |
170 | setPermanent("plr.bankrandom" , "false" ); |
171 | setPermanent("plr.ramrandom" , "true" ); |
172 | setPermanent("plr.cpurandom" , "AXYP" ); |
173 | setPermanent("plr.colorloss" , "false" ); |
174 | setPermanent("plr.tv.jitter" , "true" ); |
175 | setPermanent("plr.tv.jitter_recovery" , "10" ); |
176 | setPermanent("plr.debugcolors" , "false" ); |
177 | setPermanent("plr.console" , "2600" ); // 7800 |
178 | setPermanent("plr.timemachine" , true); |
179 | setPermanent("plr.tm.size" , 200); |
180 | setPermanent("plr.tm.uncompressed" , 60); |
181 | setPermanent("plr.tm.interval" , "30f" ); // = 0.5 seconds |
182 | setPermanent("plr.tm.horizon" , "10m" ); // = ~10 minutes |
183 | setPermanent("plr.eepromaccess" , "false" ); |
184 | |
185 | // Developer settings |
186 | setPermanent("dev.settings" , "false" ); |
187 | setPermanent("dev.stats" , "true" ); |
188 | setPermanent("dev.bankrandom" , "true" ); |
189 | setPermanent("dev.ramrandom" , "true" ); |
190 | setPermanent("dev.cpurandom" , "SAXYP" ); |
191 | setPermanent("dev.colorloss" , "true" ); |
192 | setPermanent("dev.tv.jitter" , "true" ); |
193 | setPermanent("dev.tv.jitter_recovery" , "2" ); |
194 | setPermanent("dev.debugcolors" , "false" ); |
195 | setPermanent("dev.tiadriven" , "true" ); |
196 | setPermanent("dev.console" , "2600" ); // 7800 |
197 | setPermanent("dev.tia.type" , "standard" ); |
198 | setPermanent("dev.tia.plinvphase" , "true" ); |
199 | setPermanent("dev.tia.msinvphase" , "true" ); |
200 | setPermanent("dev.tia.blinvphase" , "true" ); |
201 | setPermanent("dev.tia.delaypfbits" , "true" ); |
202 | setPermanent("dev.tia.delaypfcolor" , "true" ); |
203 | setPermanent("dev.tia.delayplswap" , "true" ); |
204 | setPermanent("dev.tia.delayblswap" , "true" ); |
205 | setPermanent("dev.timemachine" , true); |
206 | setPermanent("dev.tm.size" , 1000); |
207 | setPermanent("dev.tm.uncompressed" , 600); |
208 | setPermanent("dev.tm.interval" , "1f" ); // = 1 frame |
209 | setPermanent("dev.tm.horizon" , "30s" ); // = ~30 seconds |
210 | // Thumb ARM emulation options |
211 | setPermanent("dev.thumb.trapfatal" , "true" ); |
212 | setPermanent("dev.eepromaccess" , "true" ); |
213 | } |
214 | |
215 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
216 | void Settings::setRepository(shared_ptr<KeyValueRepository> repository) |
217 | { |
218 | myRespository = repository; |
219 | } |
220 | |
221 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
222 | void Settings::load(const Options& options) |
223 | { |
224 | Options fromFile = myRespository->load(); |
225 | for (const auto& opt: fromFile) |
226 | setValue(opt.first, opt.second, false); |
227 | |
228 | // Apply commandline options, which override those from settings file |
229 | for(const auto& opt: options) |
230 | setValue(opt.first, opt.second, false); |
231 | |
232 | // Finally, validate some settings, so the rest of the codebase |
233 | // can assume the values are valid |
234 | validate(); |
235 | } |
236 | |
237 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
238 | void Settings::save() |
239 | { |
240 | myRespository->save(myPermanentSettings); |
241 | } |
242 | |
243 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
244 | void Settings::validate() |
245 | { |
246 | string s; |
247 | int i; |
248 | float f; |
249 | |
250 | f = getFloat("speed" ); |
251 | if (f <= 0) setValue("speed" , "1.0" ); |
252 | |
253 | i = getInt("tia.aspectn" ); |
254 | if(i < 80 || i > 120) setValue("tia.aspectn" , "90" ); |
255 | i = getInt("tia.aspectp" ); |
256 | if(i < 80 || i > 120) setValue("tia.aspectp" , "100" ); |
257 | |
258 | s = getString("tia.dbgcolors" ); |
259 | sort(s.begin(), s.end()); |
260 | if(s != "bgopry" ) setValue("tia.dbgcolors" , "roygpb" ); |
261 | |
262 | s = getString("tv.phosphor" ); |
263 | if(s != "always" && s != "byrom" ) setValue("tv.phosphor" , "byrom" ); |
264 | |
265 | i = getInt("tv.phosblend" ); |
266 | if(i < 0 || i > 100) setValue("tv.phosblend" , "50" ); |
267 | |
268 | i = getInt("tv.filter" ); |
269 | if(i < 0 || i > 5) setValue("tv.filter" , "0" ); |
270 | |
271 | i = getInt("dev.tv.jitter_recovery" ); |
272 | if(i < 1 || i > 20) setValue("dev.tv.jitter_recovery" , "2" ); |
273 | |
274 | int size = getInt("dev.tm.size" ); |
275 | if(size < 20 || size > 1000) |
276 | { |
277 | setValue("dev.tm.size" , 20); |
278 | size = 20; |
279 | } |
280 | |
281 | i = getInt("dev.tm.uncompressed" ); |
282 | if(i < 0 || i > size) setValue("dev.tm.uncompressed" , size); |
283 | |
284 | /*i = getInt("dev.tm.interval"); |
285 | if(i < 0 || i > 5) setValue("dev.tm.interval", 0); |
286 | |
287 | i = getInt("dev.tm.horizon"); |
288 | if(i < 0 || i > 6) setValue("dev.tm.horizon", 1);*/ |
289 | |
290 | i = getInt("plr.tv.jitter_recovery" ); |
291 | if(i < 1 || i > 20) setValue("plr.tv.jitter_recovery" , "10" ); |
292 | |
293 | size = getInt("plr.tm.size" ); |
294 | if(size < 20 || size > 1000) |
295 | { |
296 | setValue("plr.tm.size" , 20); |
297 | size = 20; |
298 | } |
299 | |
300 | i = getInt("plr.tm.uncompressed" ); |
301 | if(i < 0 || i > size) setValue("plr.tm.uncompressed" , size); |
302 | |
303 | /*i = getInt("plr.tm.interval"); |
304 | if(i < 0 || i > 5) setValue("plr.tm.interval", 3); |
305 | |
306 | i = getInt("plr.tm.horizon"); |
307 | if(i < 0 || i > 6) setValue("plr.tm.horizon", 5);*/ |
308 | |
309 | #ifdef SOUND_SUPPORT |
310 | AudioSettings::normalize(*this); |
311 | #endif |
312 | |
313 | i = getInt("joydeadzone" ); |
314 | if(i < 0) setValue("joydeadzone" , "0" ); |
315 | else if(i > 29) setValue("joydeadzone" , "29" ); |
316 | |
317 | i = getInt("cursor" ); |
318 | if(i < 0 || i > 3) |
319 | setValue("cursor" , "2" ); |
320 | |
321 | i = getInt("dsense" ); |
322 | if(i < 1 || i > 20) |
323 | setValue("dsense" , "10" ); |
324 | |
325 | i = getInt("msense" ); |
326 | if(i < 1 || i > 20) |
327 | setValue("msense" , "10" ); |
328 | |
329 | i = getInt("tsense" ); |
330 | if(i < 1 || i > 20) |
331 | setValue("tsense" , "10" ); |
332 | |
333 | i = getInt("ssinterval" ); |
334 | if(i < 1) setValue("ssinterval" , "2" ); |
335 | else if(i > 10) setValue("ssinterval" , "10" ); |
336 | |
337 | s = getString("palette" ); |
338 | if(s != "standard" && s != "z26" && s != "user" ) |
339 | setValue("palette" , "standard" ); |
340 | |
341 | s = getString("launcherfont" ); |
342 | if(s != "small" && s != "medium" && s != "large" ) |
343 | setValue("launcherfont" , "medium" ); |
344 | |
345 | s = getString("dbg.fontsize" ); |
346 | if(s != "small" && s != "medium" && s != "large" ) |
347 | setValue("dbg.fontsize" , "medium" ); |
348 | |
349 | i = getInt("romviewer" ); |
350 | if(i < 0) setValue("romviewer" , "0" ); |
351 | else if(i > 2) setValue("romviewer" , "2" ); |
352 | |
353 | i = getInt("loglevel" ); |
354 | if(i < int(Logger::Level::MIN) || i > int(Logger::Level::MAX)) |
355 | setValue("loglevel" , int(Logger::Level::INFO)); |
356 | } |
357 | |
358 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
359 | void Settings::usage() const |
360 | { |
361 | cout << endl |
362 | << "Stella version " << STELLA_VERSION << endl |
363 | << endl |
364 | << "Usage: stella [options ...] romfile" << endl |
365 | << " Run without any options or romfile to use the ROM launcher" << endl |
366 | << " Consult the manual for more in-depth information" << endl |
367 | << endl |
368 | << "Valid options are:" << endl |
369 | << endl |
370 | << " -video <type> Type is one of the following:\n" |
371 | #ifdef BSPF_WINDOWS |
372 | << " direct3d Direct3D acceleration\n" |
373 | #endif |
374 | << " opengl OpenGL acceleration\n" |
375 | << " opengles2 OpenGLES 2 acceleration\n" |
376 | << " opengles OpenGLES 1 acceleration\n" |
377 | << " software Software mode (no acceleration)\n" |
378 | << endl |
379 | << " -vsync <1|0> Enable 'synchronize to vertical blank interrupt'\n" |
380 | << " -fullscreen <1|0> Enable fullscreen mode\n" |
381 | << " -center <1|0> Centers game window in windowed modes\n" |
382 | << " -windowedpos <XxY> Sets the window position in windowed modes\n" |
383 | << " -display <number> Sets the display for Stella\n" |
384 | << " -palette <standard| Use the specified color palette\n" |
385 | << " z26|\n" |
386 | << " user>\n" |
387 | << " -speed <number> Run emulation at the given speed\n" |
388 | << " -uimessages <1|0> Show onscreen UI messages for different events\n" |
389 | << endl |
390 | #ifdef SOUND_SUPPORT |
391 | << " -audio.enabled <1|0> Enable audio\n" |
392 | << " -audio.volume <0-100> Volume\n" |
393 | << " -audio.preset <1-5> Audio preset (or 1 for custom)\n" |
394 | << " -audio.sample_rate <number> Output sample rate (44100|48000|96000)\n" |
395 | << " -audio.fragment_size <number> Fragment size (128|256|512|1024|\n" |
396 | << " 2048|4096)\n" |
397 | << " -audio.resampling_quality <1-3> Resampling quality\n" |
398 | << " -audio.headroom <0-20> Additional half-frames to prebuffer\n" |
399 | << " -audio.buffer_size <0-20> Max. number of additional half-\n" |
400 | << " frames to buffer\n" |
401 | << " -audio.stereo <1|0> Enable stereo mode for all ROMs\n" |
402 | << endl |
403 | #endif |
404 | << " -tia.zoom <zoom> Use the specified zoom level (windowed mode)\n" |
405 | << " for TIA image\n" |
406 | << " -tia.inter <1|0> Enable interpolated (smooth) scaling for TIA\n" |
407 | << " image\n" |
408 | << " -tia.aspectn <number> Scale TIA width by the given percentage in NTS\n" |
409 | << " mode\n" |
410 | << " -tia.aspectp <number> Scale TIA width by the given percentage in PAL\n" |
411 | << " mode\n" |
412 | << " -tia.fs_stretch <1|0> Stretch TIA image to fill fullscreen mode\n" |
413 | << " -tia.fs_overscan <0-10> Add overscan to TIA image in fill fullscreen mode\n" |
414 | << " -tia.dbgcolors <string> Debug colors to use for each object (see manual\n" |
415 | << " for description)\n" |
416 | << endl |
417 | << " -tv.filter <0-5> Set TV effects off (0) or to specified mode\n" |
418 | << " (1-5)\n" |
419 | << " -tv.phosphor <always|byrom> When to use phosphor mode\n" |
420 | << " -tv.phosblend <0-100> Set default blend level in phosphor mode\n" |
421 | << " -tv.scanlines <0-100> Set scanline intensity to percentage\n" |
422 | << " (0 disables completely)\n" |
423 | << " -tv.contrast <-1.0 - 1.0> Set TV effects custom contrast\n" |
424 | << " -tv.brightness <-1.0 - 1.0> Set TV effects custom brightness\n" |
425 | << " -tv.hue <-1.0 - 1.0> Set TV effects custom hue\n" |
426 | << " -tv.saturation <-1.0 - 1.0> Set TV effects custom saturation\n" |
427 | << " -tv.gamma <-1.0 - 1.0> Set TV effects custom gamma\n" |
428 | << " -tv.sharpness <-1.0 - 1.0> Set TV effects custom sharpness\n" |
429 | << " -tv.resolution <-1.0 - 1.0> Set TV effects custom resolution\n" |
430 | << " -tv.artifacts <-1.0 - 1.0> Set TV effects custom artifacts\n" |
431 | << " -tv.fringing <-1.0 - 1.0> Set TV effects custom fringing\n" |
432 | << " -tv.bleed <-1.0 - 1.0> Set TV effects custom bleed\n" |
433 | << endl |
434 | << " -cheat <code> Use the specified cheatcode (see manual for\n" |
435 | << " description)\n" |
436 | << " -loglevel <0|1|2> Set level of logging during application run\n" |
437 | << endl |
438 | << " -logtoconsole <1|0> Log output to console/commandline\n" |
439 | << " -joydeadzone <number> Sets 'deadzone' area for analog joysticks (0-29)\n" |
440 | << " -joyallow4 <1|0> Allow all 4 directions on a joystick to be\n" |
441 | << " pressed simultaneously\n" |
442 | << " -usemouse <always|\n" |
443 | << " analog|\n" |
444 | << " never> Use mouse as a controller as specified by ROM\n" |
445 | << " properties in given mode(see manual)\n" |
446 | << " -grabmouse <1|0> Locks the mouse cursor in the TIA window\n" |
447 | << " -cursor <0,1,2,3> Set cursor state in UI/emulation modes\n" |
448 | << " -dejitter.base <0-10> Strength of paddle value averaging\n" |
449 | << " -dejitter.diff <0-10> Strength of paddle reaction to fast movements\n" |
450 | << " -dsense <1-20> Sensitivity of digital emulated paddle movement\n" |
451 | << " -msense <1-20> Sensitivity of mouse emulated paddle movement\n" |
452 | << " -tsense <1-20> Sensitivity of mouse emulated trackball movement\n" |
453 | << " -saport <lr|rl> How to assign virtual ports to multiple\n" |
454 | << " Stelladaptor/2600-daptors\n" |
455 | << " -modcombo <1|0> Enable modifer key combos\n" |
456 | << " (Control-Q for quit may not work when disabled!)\n" |
457 | << " -fastscbios <1|0> Disable Supercharger BIOS progress loading bars\n" |
458 | << " -threads <1|0> Whether to using multi-threading during\n" |
459 | << " emulation\n" |
460 | << " -snapsavedir <path> The directory to save snapshot files to\n" |
461 | << " -snaploaddir <path> The directory to load snapshot files from\n" |
462 | << " -snapname <int|rom> Name snapshots according to internal database or\n" |
463 | << " ROM\n" |
464 | << " -sssingle <1|0> Generate single snapshot instead of many\n" |
465 | << " -ss1x <1|0> Generate TIA snapshot in 1x mode (ignore\n" |
466 | << " scaling/effects)\n" |
467 | << " -ssinterval <number> Number of seconds between snapshots in\n" |
468 | << " continuous snapshot mode\n" |
469 | << " -autoslot <1|0> Automatically switch to next save slot when\n" |
470 | << " state saving\n" |
471 | << " -saveonexit <none|current Automatically save state(s) when exiting emulation\n" |
472 | << " all>\n" |
473 | << endl |
474 | << " -rominfo <rom> Display detailed information for the given ROM\n" |
475 | << " -listrominfo Display contents of stella.pro, one line per ROM\n" |
476 | << " entry\n" |
477 | << " \n" |
478 | << " -exitlauncher <1|0> On exiting a ROM, go back to the ROM launcher\n" |
479 | << " -launcherres <WxH> The resolution to use in ROM launcher mode\n" |
480 | << " -launcherfont <small|medium| Use the specified font in the ROM launcher\n" |
481 | << " large>\n" |
482 | << " -launcherroms <1|0> Show only ROMs in the launcher (vs. all files)\n" |
483 | << " -romviewer <0|1|2> Show ROM info viewer at given zoom level in ROM\n" |
484 | << " launcher (0 for off)\n" |
485 | << " -lastrom <name> Last played ROM, automatically selected in launcher\n" |
486 | << " -romloadcount <number> Number of ROM to load next from multicard\n" |
487 | << " -uipalette <standard| Selects GUI theme\n" |
488 | << " classic|light>\n" |
489 | << " -hidpi <0|1> Enable HiDPI mode\n" |
490 | << " -dialogpos <0..4> Display all dialogs at given positions\n" |
491 | << " -listdelay <delay> Time to wait between keypresses in list widgets\n" |
492 | << " (300-1000)\n" |
493 | << " -mwheel <lines> Number of lines the mouse wheel will scroll in\n" |
494 | << " UI\n" |
495 | << " -mdouble <speed> Mouse double click speed in UI\n" |
496 | << " -ctrldelay <delay> Delay before controller input is repeated in UI\n" |
497 | << " -ctrlrate <rate> Rate per second of repeated controller input in UI\n" |
498 | << " -basic_settings <0|1> Display only a basic settings dialog\n" |
499 | << " -romdir <dir> Set the directory where the ROM launcher will start\n" |
500 | << " -avoxport <name> The name of the serial port where an AtariVox is\n" |
501 | << " connected\n" |
502 | << " -holdreset Start the emulator with the Game Reset switch\n" |
503 | << " held down\n" |
504 | << " -holdselect Start the emulator with the Game Select switch\n" |
505 | << " held down\n" |
506 | << " -holdjoy0 <U,D,L,R,F> Start the emulator with the left joystick\n" |
507 | << " direction/fire button held down\n" |
508 | << " -holdjoy1 <U,D,L,R,F> Start the emulator with the right joystick\n" |
509 | << " direction/fire button held down\n" |
510 | << " -maxres <WxH> Used by developers to force the maximum size of\n" |
511 | << " the application window\n" |
512 | << " -basedir <path> Override the base directory for all config files\n" |
513 | << " -baseinappdir Override the base directory for all config files\n" |
514 | << " by attempting to use the application directory\n" |
515 | << " -help Show the text you're now reading\n" |
516 | #ifdef DEBUGGER_SUPPORT |
517 | << endl |
518 | << " The following options are meant for developers\n" |
519 | << " Arguments are more fully explained in the manual\n" |
520 | << endl |
521 | << " -dis.resolve <1|0> Attempt to resolve code sections in disassembler\n" |
522 | << " -dis.gfxformat <2|16> Set base to use for displaying GFX sections in\n" |
523 | << " disassembler\n" |
524 | << " -dis.showaddr <1|0> Show opcode addresses in disassembler\n" |
525 | << " -dis.relocate <1|0> Relocate calls out of address range in\n" |
526 | << " disassembler\n" |
527 | << endl |
528 | << " -dbg.res <WxH> The resolution to use in debugger mode\n" |
529 | << " -dbg.fontsize <small|medium| Font size to use in debugger window\n" |
530 | << " large>\n" |
531 | << " -dbg.fontstyle <0-3> Font style to use in debugger window (bold vs.\n" |
532 | << " normal)\n" |
533 | << " -dbg.ghostreadstrap <1|0> Debugger traps on 'ghost' reads\n" |
534 | << " -dbg.uhex <0|1> lower-/uppercase HEX display\n" |
535 | << " -break <address> Set a breakpoint at 'address'\n" |
536 | << " -debug Start in debugger mode\n" |
537 | << endl |
538 | << " -bs <arg> Sets the 'Cartridge.Type' (bankswitch) property\n" |
539 | << " -type <arg> Same as using -bs\n" |
540 | << " -startbank <bank> Sets the ROM's startup bank\n" |
541 | << " -channels <arg> Sets the 'Cartridge.Sound' property\n" |
542 | << " -ld <arg> Sets the 'Console.LeftDifficulty' property\n" |
543 | << " -rd <arg> Sets the 'Console.RightDifficulty' property\n" |
544 | << " -tv <arg> Sets the 'Console.TelevisionType' property\n" |
545 | << " -sp <arg> Sets the 'Console.SwapPorts' property\n" |
546 | << " -lc <arg> Sets the 'Controller.Left' property\n" |
547 | << " -rc <arg> Sets the 'Controller.Right' property\n" |
548 | << " -bc <arg> Same as using both -lc and -rc\n" |
549 | << " -cp <arg> Sets the 'Controller.SwapPaddles' property\n" |
550 | << " -format <arg> Sets the 'Display.Format' property\n" |
551 | << " -ystart <arg> Sets the 'Display.YStart' property\n" |
552 | << " -pp <arg> Sets the 'Display.Phosphor' property\n" |
553 | << " -ppblend <arg> Sets the 'Display.PPBlend' property\n" |
554 | << endl |
555 | #endif |
556 | |
557 | << " Various development related parameters for player settings mode\n" |
558 | << endl |
559 | << " -dev.settings <1|0> Select developer (1) or player (0) settings\n" |
560 | << " mode\n" |
561 | << endl |
562 | << " -plr.stats <1|0> Overlay console info during emulation\n" |
563 | << " -plr.console <2600|7800> Select console for B/W and Pause key\n" |
564 | << " handling and RAM initialization\n" |
565 | << " -plr.bankrandom <1|0> Randomize the startup bank on reset\n" |
566 | << " -plr.ramrandom <1|0> Randomize the contents of RAM on reset\n" |
567 | << " -plr.cpurandom <1|0> Randomize the contents of CPU registers on\n" |
568 | << " reset\n" |
569 | << " -plr.debugcolors <1|0> Enable debug colors\n" |
570 | << " -plr.colorloss <1|0> Enable PAL color-loss effect\n" |
571 | << " -plr.tv.jitter <1|0> Enable TV jitter effect\n" |
572 | << " -plr.tv.jitter_recovery <1-20> Set recovery time for TV jitter effect\n" |
573 | << " -plr.eepromaccess <1|0> Enable messages for AtariVox/SaveKey access\n" |
574 | << " messages\n" |
575 | << endl |
576 | << " The same parameters but for developer settings mode\n" |
577 | << " -dev.stats <1|0> Overlay console info during emulation\n" |
578 | << " -dev.console <2600|7800> Select console for B/W and Pause key\n" |
579 | << " handling and RAM initialization\n" |
580 | << " -dev.bankrandom <1|0> Randomize the startup bank on reset\n" |
581 | << " -dev.ramrandom <1|0> Randomize the contents of RAM on reset\n" |
582 | << " -dev.cpurandom <1|0> Randomize the contents of CPU registers on\n" |
583 | << " reset\n" |
584 | << " -dev.debugcolors <1|0> Enable debug colors\n" |
585 | << " -dev.colorloss <1|0> Enable PAL color-loss effect\n" |
586 | << " -dev.tv.jitter <1|0> Enable TV jitter effect\n" |
587 | << " -dev.tv.jitter_recovery <1-20> Set recovery time for TV jitter effect\n" |
588 | << " -dev.tiadriven <1|0> Drive unused TIA pins randomly on a\n" |
589 | << " read/peek\n" |
590 | #ifdef DEBUGGER_SUPPORT |
591 | << " -dev.rwportbreak <1|0> Debugger breaks on reads from write ports\n" |
592 | #endif |
593 | << " -dev.thumb.trapfatal <1|0> Determines whether errors in ARM emulation\n" |
594 | << " throw an exception\n" |
595 | << " -dev.eepromaccess <1|0> Enable messages for AtariVox/SaveKey access\n" |
596 | << " messages\n" |
597 | << " -dev.tia.type <standard|custom| Selects a TIA type\n" |
598 | << " koolaidman|\n" |
599 | << " cosmicark|pesco|\n" |
600 | << " quickstep|heman|>\n" |
601 | << " -dev.tia.plinvphase <1|0> Enable inverted HMOVE clock phase for players\n" |
602 | << " -dev.tia.msinvphase <1|0> Enable inverted HMOVE clock phase for\n" |
603 | << " missiles\n" |
604 | << " -dev.tia.blinvphase <1|0> Enable inverted HMOVE clock phase for ball\n" |
605 | << " -dev.tia.delaypfbits <1|0> Enable extra delay cycle for PF bits access\n" |
606 | << " -dev.tia.delaypfcolor <1|0> Enable extra delay cycle for PF color\n" |
607 | << " -dev.tia.delayplswap <1|0> Enable extra delay cycle for VDELP0/1 swap\n" |
608 | << " -dev.tia.delayblswap <1|0> Enable extra delay cycle for VDELBL swap\n" |
609 | << endl << std::flush; |
610 | } |
611 | |
612 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
613 | const Variant& Settings::value(const string& key) const |
614 | { |
615 | // Try to find the named setting and answer its value |
616 | auto it = myPermanentSettings.find(key); |
617 | if(it != myPermanentSettings.end()) |
618 | return it->second; |
619 | else |
620 | { |
621 | it = myTemporarySettings.find(key); |
622 | if(it != myTemporarySettings.end()) |
623 | return it->second; |
624 | } |
625 | return EmptyVariant; |
626 | } |
627 | |
628 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
629 | void Settings::setValue(const string& key, const Variant& value, bool persist) |
630 | { |
631 | auto it = myPermanentSettings.find(key); |
632 | if(it != myPermanentSettings.end()) { |
633 | if (persist && it->second != value) myRespository->save(key, value); |
634 | it->second = value; |
635 | } |
636 | else |
637 | myTemporarySettings[key] = value; |
638 | } |
639 | |
640 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
641 | void Settings::setPermanent(const string& key, const Variant& value) |
642 | { |
643 | myPermanentSettings[key] = value; |
644 | } |
645 | |
646 | // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |
647 | void Settings::setTemporary(const string& key, const Variant& value) |
648 | { |
649 | myTemporarySettings[key] = value; |
650 | } |
651 | |