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