summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/emuopts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/emuopts.cpp')
-rw-r--r--src/emu/emuopts.cpp397
1 files changed, 217 insertions, 180 deletions
diff --git a/src/emu/emuopts.cpp b/src/emu/emuopts.cpp
index eda6df9b6b6..18b37734465 100644
--- a/src/emu/emuopts.cpp
+++ b/src/emu/emuopts.cpp
@@ -10,11 +10,15 @@
#include "emu.h"
#include "emuopts.h"
+
#include "drivenum.h"
-#include "softlist_dev.h"
#include "hashfile.h"
+#include "main.h"
+#include "softlist_dev.h"
+// lib/util
#include "corestr.h"
+#include "path.h"
#include <stack>
@@ -26,200 +30,202 @@
const options_entry emu_options::s_option_entries[] =
{
// unadorned options - only a single one supported at the moment
- { OPTION_SYSTEMNAME, nullptr, OPTION_STRING, nullptr },
- { OPTION_SOFTWARENAME, nullptr, OPTION_STRING, nullptr },
+ { OPTION_SYSTEMNAME, nullptr, core_options::option_type::STRING, nullptr },
+ { OPTION_SOFTWARENAME, nullptr, core_options::option_type::STRING, nullptr },
// config options
- { nullptr, nullptr, OPTION_HEADER, "CORE CONFIGURATION OPTIONS" },
- { OPTION_READCONFIG ";rc", "1", OPTION_BOOLEAN, "enable loading of configuration files" },
- { OPTION_WRITECONFIG ";wc", "0", OPTION_BOOLEAN, "write configuration to (driver).ini on exit" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE CONFIGURATION OPTIONS" },
+ { OPTION_READCONFIG ";rc", "1", core_options::option_type::BOOLEAN, "enable loading of configuration files" },
+ { OPTION_WRITECONFIG ";wc", "0", core_options::option_type::BOOLEAN, "write configuration to (driver).ini on exit" },
// search path options
- { nullptr, nullptr, OPTION_HEADER, "CORE SEARCH PATH OPTIONS" },
- { OPTION_HOMEPATH, ".", OPTION_STRING, "path to base folder for plugin data (read/write)" },
- { OPTION_MEDIAPATH ";rp;biospath;bp", "roms", OPTION_STRING, "path to ROM sets and hard disk images" },
- { OPTION_HASHPATH ";hash_directory;hash", "hash", OPTION_STRING, "path to software definition files" },
- { OPTION_SAMPLEPATH ";sp", "samples", OPTION_STRING, "path to audio sample sets" },
- { OPTION_ARTPATH, "artwork", OPTION_STRING, "path to artwork files" },
- { OPTION_CTRLRPATH, "ctrlr", OPTION_STRING, "path to controller definitions" },
- { OPTION_INIPATH, ".;ini;ini/presets", OPTION_STRING, "path to ini files" },
- { OPTION_FONTPATH, ".", OPTION_STRING, "path to font files" },
- { OPTION_CHEATPATH, "cheat", OPTION_STRING, "path to cheat files" },
- { OPTION_CROSSHAIRPATH, "crosshair", OPTION_STRING, "path to crosshair files" },
- { OPTION_PLUGINSPATH, "plugins", OPTION_STRING, "path to plugin files" },
- { OPTION_LANGUAGEPATH, "language", OPTION_STRING, "path to UI translation files" },
- { OPTION_SWPATH, "software", OPTION_STRING, "path to loose software" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE SEARCH PATH OPTIONS" },
+ { OPTION_PLUGINDATAPATH, ".", core_options::option_type::PATH, "path to base folder for plugin data (read/write)" },
+ { OPTION_MEDIAPATH ";rp;biospath;bp", "roms", core_options::option_type::MULTIPATH, "path to ROM sets and hard disk images" },
+ { OPTION_HASHPATH ";hash_directory;hash", "hash", core_options::option_type::MULTIPATH, "path to software definition files" },
+ { OPTION_SAMPLEPATH ";sp", "samples", core_options::option_type::MULTIPATH, "path to audio sample sets" },
+ { OPTION_ARTPATH, "artwork", core_options::option_type::MULTIPATH, "path to artwork files" },
+ { OPTION_CTRLRPATH, "ctrlr", core_options::option_type::MULTIPATH, "path to controller definitions" },
+ { OPTION_INIPATH, ".;ini;ini/presets", core_options::option_type::MULTIPATH, "path to ini files" },
+ { OPTION_FONTPATH, ".", core_options::option_type::MULTIPATH, "path to font files" },
+ { OPTION_CHEATPATH, "cheat", core_options::option_type::MULTIPATH, "path to cheat files" },
+ { OPTION_CROSSHAIRPATH, "crosshair", core_options::option_type::MULTIPATH, "path to crosshair files" },
+ { OPTION_PLUGINSPATH, "plugins", core_options::option_type::MULTIPATH, "path to plugin files" },
+ { OPTION_LANGUAGEPATH, "language", core_options::option_type::MULTIPATH, "path to UI translation files" },
+ { OPTION_SWPATH, "software", core_options::option_type::MULTIPATH, "path to loose software" },
// output directory options
- { nullptr, nullptr, OPTION_HEADER, "CORE OUTPUT DIRECTORY OPTIONS" },
- { OPTION_CFG_DIRECTORY, "cfg", OPTION_STRING, "directory to save configurations" },
- { OPTION_NVRAM_DIRECTORY, "nvram", OPTION_STRING, "directory to save NVRAM contents" },
- { OPTION_INPUT_DIRECTORY, "inp", OPTION_STRING, "directory to save input device logs" },
- { OPTION_STATE_DIRECTORY, "sta", OPTION_STRING, "directory to save states" },
- { OPTION_SNAPSHOT_DIRECTORY, "snap", OPTION_STRING, "directory to save/load screenshots" },
- { OPTION_DIFF_DIRECTORY, "diff", OPTION_STRING, "directory to save hard drive image difference files" },
- { OPTION_COMMENT_DIRECTORY, "comments", OPTION_STRING, "directory to save debugger comments" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE OUTPUT DIRECTORY OPTIONS" },
+ { OPTION_CFG_DIRECTORY, "cfg", core_options::option_type::PATH, "directory to save configurations" },
+ { OPTION_NVRAM_DIRECTORY, "nvram", core_options::option_type::PATH, "directory to save NVRAM contents" },
+ { OPTION_INPUT_DIRECTORY, "inp", core_options::option_type::PATH, "directory to save input device logs" },
+ { OPTION_STATE_DIRECTORY, "sta", core_options::option_type::PATH, "directory to save states" },
+ { OPTION_SNAPSHOT_DIRECTORY, "snap", core_options::option_type::PATH, "directory to save/load screenshots" },
+ { OPTION_DIFF_DIRECTORY, "diff", core_options::option_type::PATH, "directory to save hard drive image difference files" },
+ { OPTION_COMMENT_DIRECTORY, "comments", core_options::option_type::PATH, "directory to save debugger comments" },
+ { OPTION_SHARE_DIRECTORY, "share", core_options::option_type::PATH, "directory to share with emulated machines" },
// state/playback options
- { nullptr, nullptr, OPTION_HEADER, "CORE STATE/PLAYBACK OPTIONS" },
- { OPTION_STATE, nullptr, OPTION_STRING, "saved state to load" },
- { OPTION_AUTOSAVE, "0", OPTION_BOOLEAN, "automatically restore state on start and save on exit for supported systems" },
- { OPTION_REWIND, "0", OPTION_BOOLEAN, "enable rewind savestates" },
- { OPTION_REWIND_CAPACITY "(1-2048)", "100", OPTION_INTEGER, "rewind buffer size in megabytes" },
- { OPTION_PLAYBACK ";pb", nullptr, OPTION_STRING, "playback an input file" },
- { OPTION_RECORD ";rec", nullptr, OPTION_STRING, "record an input file" },
- { OPTION_RECORD_TIMECODE, "0", OPTION_BOOLEAN, "record an input timecode file (requires -record option)" },
- { OPTION_EXIT_AFTER_PLAYBACK, "0", OPTION_BOOLEAN, "close the program at the end of playback" },
-
- { OPTION_MNGWRITE, nullptr, OPTION_STRING, "optional filename to write a MNG movie of the current session" },
- { OPTION_AVIWRITE, nullptr, OPTION_STRING, "optional filename to write an AVI movie of the current session" },
- { OPTION_WAVWRITE, nullptr, OPTION_STRING, "optional filename to write a WAV file of the current session" },
- { OPTION_SNAPNAME, "%g/%i", OPTION_STRING, "override of the default snapshot/movie naming; %g == gamename, %i == index" },
- { OPTION_SNAPSIZE, "auto", OPTION_STRING, "specify snapshot/movie resolution (<width>x<height>) or 'auto' to use minimal size " },
- { OPTION_SNAPVIEW, "auto", OPTION_STRING, "snapshot/movie view - 'auto' for default, or 'native' for per-screen pixel-aspect views" },
- { OPTION_SNAPBILINEAR, "1", OPTION_BOOLEAN, "specify if the snapshot/movie should have bilinear filtering applied" },
- { OPTION_STATENAME, "%g", OPTION_STRING, "override of the default state subfolder naming; %g == gamename" },
- { OPTION_BURNIN, "0", OPTION_BOOLEAN, "create burn-in snapshots for each screen" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE STATE/PLAYBACK OPTIONS" },
+ { OPTION_STATE, nullptr, core_options::option_type::STRING, "saved state to load" },
+ { OPTION_AUTOSAVE, "0", core_options::option_type::BOOLEAN, "automatically restore state on start and save on exit for supported systems" },
+ { OPTION_REWIND, "0", core_options::option_type::BOOLEAN, "enable rewind savestates" },
+ { OPTION_REWIND_CAPACITY "(1-2048)", "100", core_options::option_type::INTEGER, "rewind buffer size in megabytes" },
+ { OPTION_PLAYBACK ";pb", nullptr, core_options::option_type::STRING, "playback an input file" },
+ { OPTION_RECORD ";rec", nullptr, core_options::option_type::STRING, "record an input file" },
+ { OPTION_EXIT_AFTER_PLAYBACK, "0", core_options::option_type::BOOLEAN, "close the program at the end of playback" },
+
+ { OPTION_MNGWRITE, nullptr, core_options::option_type::PATH, "optional filename to write a MNG movie of the current session" },
+ { OPTION_AVIWRITE, nullptr, core_options::option_type::PATH, "optional filename to write an AVI movie of the current session" },
+ { OPTION_WAVWRITE, nullptr, core_options::option_type::PATH, "optional filename to write a WAV file of the current session" },
+ { OPTION_SNAPNAME, "%g/%i", core_options::option_type::STRING, "override of the default snapshot/movie naming; %g == gamename, %i == index" },
+ { OPTION_SNAPSIZE, "auto", core_options::option_type::STRING, "specify snapshot/movie resolution (<width>x<height>) or 'auto' to use minimal size " },
+ { OPTION_SNAPVIEW, "auto", core_options::option_type::STRING, "snapshot/movie view - 'auto' for default, or 'native' for per-screen pixel-aspect views" },
+ { OPTION_SNAPBILINEAR, "1", core_options::option_type::BOOLEAN, "specify if the snapshot/movie should have bilinear filtering applied" },
+ { OPTION_STATENAME, "%g", core_options::option_type::STRING, "override of the default state subfolder naming; %g == gamename" },
+ { OPTION_BURNIN, "0", core_options::option_type::BOOLEAN, "create burn-in snapshots for each screen" },
// performance options
- { nullptr, nullptr, OPTION_HEADER, "CORE PERFORMANCE OPTIONS" },
- { OPTION_AUTOFRAMESKIP ";afs", "0", OPTION_BOOLEAN, "enable automatic frameskip adjustment to maintain emulation speed" },
- { OPTION_FRAMESKIP ";fs(0-10)", "0", OPTION_INTEGER, "set frameskip to fixed value, 0-10 (upper limit with autoframeskip)" },
- { OPTION_SECONDS_TO_RUN ";str", "0", OPTION_INTEGER, "number of emulated seconds to run before automatically exiting" },
- { OPTION_THROTTLE, "1", OPTION_BOOLEAN, "throttle emulation to keep system running in sync with real time" },
- { OPTION_SLEEP, "1", OPTION_BOOLEAN, "enable sleeping, which gives time back to other applications when idle" },
- { OPTION_SPEED "(0.01-100)", "1.0", OPTION_FLOAT, "controls the speed of gameplay, relative to realtime; smaller numbers are slower" },
- { OPTION_REFRESHSPEED ";rs", "0", OPTION_BOOLEAN, "automatically adjust emulation speed to keep the emulated refresh rate slower than the host screen" },
- { OPTION_LOWLATENCY ";lolat", "0", OPTION_BOOLEAN, "draws new frame before throttling to reduce input latency" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE PERFORMANCE OPTIONS" },
+ { OPTION_AUTOFRAMESKIP ";afs", "0", core_options::option_type::BOOLEAN, "enable automatic frameskip adjustment to maintain emulation speed" },
+ { OPTION_FRAMESKIP ";fs(0-10)", "0", core_options::option_type::INTEGER, "set frameskip to fixed value, 0-10 (upper limit with autoframeskip)" },
+ { OPTION_SECONDS_TO_RUN ";str", "0", core_options::option_type::INTEGER, "number of emulated seconds to run before automatically exiting" },
+ { OPTION_THROTTLE, "1", core_options::option_type::BOOLEAN, "throttle emulation to keep system running in sync with real time" },
+ { OPTION_SLEEP, "1", core_options::option_type::BOOLEAN, "enable sleeping, which gives time back to other applications when idle" },
+ { OPTION_SPEED "(0.01-100)", "1.0", core_options::option_type::FLOAT, "controls the speed of gameplay, relative to realtime; smaller numbers are slower" },
+ { OPTION_REFRESHSPEED ";rs", "0", core_options::option_type::BOOLEAN, "automatically adjust emulation speed to keep the emulated refresh rate slower than the host screen" },
+ { OPTION_LOWLATENCY ";lolat", "0", core_options::option_type::BOOLEAN, "draws new frame before throttling to reduce input latency" },
// render options
- { nullptr, nullptr, OPTION_HEADER, "CORE RENDER OPTIONS" },
- { OPTION_KEEPASPECT ";ka", "1", OPTION_BOOLEAN, "maintain aspect ratio when scaling to fill output screen/window" },
- { OPTION_UNEVENSTRETCH ";ues", "1", OPTION_BOOLEAN, "allow non-integer ratios when scaling to fill output screen/window horizontally or vertically" },
- { OPTION_UNEVENSTRETCHX ";uesx", "0", OPTION_BOOLEAN, "allow non-integer ratios when scaling to fill output screen/window horizontally"},
- { OPTION_UNEVENSTRETCHY ";uesy", "0", OPTION_BOOLEAN, "allow non-integer ratios when scaling to fill otuput screen/window vertially"},
- { OPTION_AUTOSTRETCHXY ";asxy", "0", OPTION_BOOLEAN, "automatically apply -unevenstretchx/y based on source native orientation"},
- { OPTION_INTOVERSCAN ";ios", "0", OPTION_BOOLEAN, "allow overscan on integer scaled targets"},
- { OPTION_INTSCALEX ";sx", "0", OPTION_INTEGER, "set horizontal integer scale factor"},
- { OPTION_INTSCALEY ";sy", "0", OPTION_INTEGER, "set vertical integer scale factor"},
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE RENDER OPTIONS" },
+ { OPTION_KEEPASPECT ";ka", "1", core_options::option_type::BOOLEAN, "maintain aspect ratio when scaling to fill output screen/window" },
+ { OPTION_UNEVENSTRETCH ";ues", "1", core_options::option_type::BOOLEAN, "allow non-integer ratios when scaling to fill output screen/window horizontally or vertically" },
+ { OPTION_UNEVENSTRETCHX ";uesx", "0", core_options::option_type::BOOLEAN, "allow non-integer ratios when scaling to fill output screen/window horizontally"},
+ { OPTION_UNEVENSTRETCHY ";uesy", "0", core_options::option_type::BOOLEAN, "allow non-integer ratios when scaling to fill otuput screen/window vertially"},
+ { OPTION_AUTOSTRETCHXY ";asxy", "0", core_options::option_type::BOOLEAN, "automatically apply -unevenstretchx/y based on source native orientation"},
+ { OPTION_INTOVERSCAN ";ios", "0", core_options::option_type::BOOLEAN, "allow overscan on integer scaled targets"},
+ { OPTION_INTSCALEX ";sx", "0", core_options::option_type::INTEGER, "set horizontal integer scale factor"},
+ { OPTION_INTSCALEY ";sy", "0", core_options::option_type::INTEGER, "set vertical integer scale factor"},
// rotation options
- { nullptr, nullptr, OPTION_HEADER, "CORE ROTATION OPTIONS" },
- { OPTION_ROTATE, "1", OPTION_BOOLEAN, "rotate the game screen according to the game's orientation when needed" },
- { OPTION_ROR, "0", OPTION_BOOLEAN, "rotate screen clockwise 90 degrees" },
- { OPTION_ROL, "0", OPTION_BOOLEAN, "rotate screen counterclockwise 90 degrees" },
- { OPTION_AUTOROR, "0", OPTION_BOOLEAN, "automatically rotate screen clockwise 90 degrees if vertical" },
- { OPTION_AUTOROL, "0", OPTION_BOOLEAN, "automatically rotate screen counterclockwise 90 degrees if vertical" },
- { OPTION_FLIPX, "0", OPTION_BOOLEAN, "flip screen left-right" },
- { OPTION_FLIPY, "0", OPTION_BOOLEAN, "flip screen upside-down" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE ROTATION OPTIONS" },
+ { OPTION_ROTATE, "1", core_options::option_type::BOOLEAN, "rotate the game screen according to the game's orientation when needed" },
+ { OPTION_ROR, "0", core_options::option_type::BOOLEAN, "rotate screen clockwise 90 degrees" },
+ { OPTION_ROL, "0", core_options::option_type::BOOLEAN, "rotate screen counterclockwise 90 degrees" },
+ { OPTION_AUTOROR, "0", core_options::option_type::BOOLEAN, "automatically rotate screen clockwise 90 degrees if vertical" },
+ { OPTION_AUTOROL, "0", core_options::option_type::BOOLEAN, "automatically rotate screen counterclockwise 90 degrees if vertical" },
+ { OPTION_FLIPX, "0", core_options::option_type::BOOLEAN, "flip screen left-right" },
+ { OPTION_FLIPY, "0", core_options::option_type::BOOLEAN, "flip screen upside-down" },
// artwork options
- { nullptr, nullptr, OPTION_HEADER, "CORE ARTWORK OPTIONS" },
- { OPTION_ARTWORK_CROP ";artcrop", "0", OPTION_BOOLEAN, "crop artwork so emulated screen image fills output screen/window in one axis" },
- { OPTION_FALLBACK_ARTWORK, nullptr, OPTION_STRING, "fallback artwork if no external artwork or internal driver layout defined" },
- { OPTION_OVERRIDE_ARTWORK, nullptr, OPTION_STRING, "override artwork for external artwork and internal driver layout" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE ARTWORK OPTIONS" },
+ { OPTION_ARTWORK_CROP ";artcrop", "0", core_options::option_type::BOOLEAN, "crop artwork so emulated screen image fills output screen/window in one axis" },
+ { OPTION_FALLBACK_ARTWORK, nullptr, core_options::option_type::STRING, "fallback artwork if no external artwork or internal driver layout defined" },
+ { OPTION_OVERRIDE_ARTWORK, nullptr, core_options::option_type::STRING, "override artwork for external artwork and internal driver layout" },
// screen options
- { nullptr, nullptr, OPTION_HEADER, "CORE SCREEN OPTIONS" },
- { OPTION_BRIGHTNESS "(0.1-2.0)", "1.0", OPTION_FLOAT, "default game screen brightness correction" },
- { OPTION_CONTRAST "(0.1-2.0)", "1.0", OPTION_FLOAT, "default game screen contrast correction" },
- { OPTION_GAMMA "(0.1-3.0)", "1.0", OPTION_FLOAT, "default game screen gamma correction" },
- { OPTION_PAUSE_BRIGHTNESS "(0.0-1.0)", "0.65", OPTION_FLOAT, "amount to scale the screen brightness when paused" },
- { OPTION_EFFECT, "none", OPTION_STRING, "name of a PNG file to use for visual effects, or 'none'" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE SCREEN OPTIONS" },
+ { OPTION_BRIGHTNESS "(0.1-2.0)", "1.0", core_options::option_type::FLOAT, "default game screen brightness correction" },
+ { OPTION_CONTRAST "(0.1-2.0)", "1.0", core_options::option_type::FLOAT, "default game screen contrast correction" },
+ { OPTION_GAMMA "(0.1-3.0)", "1.0", core_options::option_type::FLOAT, "default game screen gamma correction" },
+ { OPTION_PAUSE_BRIGHTNESS "(0.0-1.0)", "0.65", core_options::option_type::FLOAT, "amount to scale the screen brightness when paused" },
+ { OPTION_EFFECT, "none", core_options::option_type::STRING, "name of a PNG file to use for visual effects, or 'none'" },
// vector options
- { nullptr, nullptr, OPTION_HEADER, "CORE VECTOR OPTIONS" },
- { OPTION_BEAM_WIDTH_MIN, "1.0", OPTION_FLOAT, "set vector beam width minimum" },
- { OPTION_BEAM_WIDTH_MAX, "1.0", OPTION_FLOAT, "set vector beam width maximum" },
- { OPTION_BEAM_DOT_SIZE, "1.0", OPTION_FLOAT, "set vector beam size for dots" },
- { OPTION_BEAM_INTENSITY_WEIGHT, "0", OPTION_FLOAT, "set vector beam intensity weight " },
- { OPTION_FLICKER, "0", OPTION_FLOAT, "set vector flicker effect" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE VECTOR OPTIONS" },
+ { OPTION_BEAM_WIDTH_MIN, "1.0", core_options::option_type::FLOAT, "set vector beam width minimum" },
+ { OPTION_BEAM_WIDTH_MAX, "1.0", core_options::option_type::FLOAT, "set vector beam width maximum" },
+ { OPTION_BEAM_DOT_SIZE, "1.0", core_options::option_type::FLOAT, "set vector beam size for dots" },
+ { OPTION_BEAM_INTENSITY_WEIGHT, "0", core_options::option_type::FLOAT, "set vector beam intensity weight " },
+ { OPTION_FLICKER, "0", core_options::option_type::FLOAT, "set vector flicker effect" },
// sound options
- { nullptr, nullptr, OPTION_HEADER, "CORE SOUND OPTIONS" },
- { OPTION_SAMPLERATE ";sr(1000-1000000)", "48000", OPTION_INTEGER, "set sound output sample rate" },
- { OPTION_SAMPLES, "1", OPTION_BOOLEAN, "enable the use of external samples if available" },
- { OPTION_VOLUME ";vol", "0", OPTION_INTEGER, "sound volume in decibels (-32 min, 0 max)" },
- { OPTION_SPEAKER_REPORT, "0", OPTION_INTEGER, "print report of speaker ouput maxima (0=none, or 1-4 for more detail)" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE SOUND OPTIONS" },
+ { OPTION_SAMPLERATE ";sr(1000-1000000)", "48000", core_options::option_type::INTEGER, "set sound output sample rate" },
+ { OPTION_SAMPLES, "1", core_options::option_type::BOOLEAN, "enable the use of external samples if available" },
+ { OPTION_VOLUME ";vol", "0", core_options::option_type::INTEGER, "sound volume in decibels (-32 min, 0 max)" },
+ { OPTION_COMPRESSOR, "1", core_options::option_type::BOOLEAN, "enable compressor for sound" },
+ { OPTION_SPEAKER_REPORT "(0-4)", "0", core_options::option_type::INTEGER, "print report of speaker ouput maxima (0=none, or 1-4 for more detail)" },
// input options
- { nullptr, nullptr, OPTION_HEADER, "CORE INPUT OPTIONS" },
- { OPTION_COIN_LOCKOUT ";coinlock", "1", OPTION_BOOLEAN, "ignore coin inputs if coin lockout output is active" },
- { OPTION_CTRLR, nullptr, OPTION_STRING, "preconfigure for specified controller" },
- { OPTION_MOUSE, "0", OPTION_BOOLEAN, "enable mouse input" },
- { OPTION_JOYSTICK ";joy", "1", OPTION_BOOLEAN, "enable joystick input" },
- { OPTION_LIGHTGUN ";gun", "0", OPTION_BOOLEAN, "enable lightgun input" },
- { OPTION_MULTIKEYBOARD ";multikey", "0", OPTION_BOOLEAN, "enable separate input from each keyboard device (if present)" },
- { OPTION_MULTIMOUSE, "0", OPTION_BOOLEAN, "enable separate input from each mouse device (if present)" },
- { OPTION_STEADYKEY ";steady", "0", OPTION_BOOLEAN, "enable steadykey support" },
- { OPTION_UI_ACTIVE, "0", OPTION_BOOLEAN, "enable user interface on top of emulated keyboard (if present)" },
- { OPTION_OFFSCREEN_RELOAD ";reload", "0", OPTION_BOOLEAN, "convert lightgun button 2 into offscreen reload" },
- { OPTION_JOYSTICK_MAP ";joymap", "auto", OPTION_STRING, "explicit joystick map, or auto to auto-select" },
- { OPTION_JOYSTICK_DEADZONE ";joy_deadzone;jdz(0.00-1)", "0.3", OPTION_FLOAT, "center deadzone range for joystick where change is ignored (0.0 center, 1.0 end)" },
- { OPTION_JOYSTICK_SATURATION ";joy_saturation;jsat(0.00-1)", "0.85", OPTION_FLOAT, "end of axis saturation range for joystick where change is ignored (0.0 center, 1.0 end)" },
- { OPTION_NATURAL_KEYBOARD ";nat", "0", OPTION_BOOLEAN, "specifies whether to use a natural keyboard or not" },
- { OPTION_JOYSTICK_CONTRADICTORY ";joy_contradictory","0", OPTION_BOOLEAN, "enable contradictory direction digital joystick input at the same time" },
- { OPTION_COIN_IMPULSE, "0", OPTION_INTEGER, "set coin impulse time (n<0 disable impulse, n==0 obey driver, 0<n set time n)" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE INPUT OPTIONS" },
+ { OPTION_COIN_LOCKOUT ";coinlock", "1", core_options::option_type::BOOLEAN, "ignore coin inputs if coin lockout output is active" },
+ { OPTION_CTRLR, nullptr, core_options::option_type::STRING, "preconfigure for specified controller" },
+ { OPTION_MOUSE, "0", core_options::option_type::BOOLEAN, "enable mouse input" },
+ { OPTION_JOYSTICK ";joy", "1", core_options::option_type::BOOLEAN, "enable joystick input" },
+ { OPTION_LIGHTGUN ";gun", "0", core_options::option_type::BOOLEAN, "enable lightgun input" },
+ { OPTION_MULTIKEYBOARD ";multikey", "0", core_options::option_type::BOOLEAN, "enable separate input from each keyboard device (if present)" },
+ { OPTION_MULTIMOUSE, "0", core_options::option_type::BOOLEAN, "enable separate input from each mouse device (if present)" },
+ { OPTION_STEADYKEY ";steady", "0", core_options::option_type::BOOLEAN, "enable steadykey support" },
+ { OPTION_UI_ACTIVE, "0", core_options::option_type::BOOLEAN, "enable user interface on top of emulated keyboard (if present)" },
+ { OPTION_OFFSCREEN_RELOAD ";reload", "0", core_options::option_type::BOOLEAN, "convert lightgun button 2 into offscreen reload" },
+ { OPTION_JOYSTICK_MAP ";joymap", "auto", core_options::option_type::STRING, "explicit joystick map, or auto to auto-select" },
+ { OPTION_JOYSTICK_DEADZONE ";joy_deadzone;jdz(0.00-1)", "0.15", core_options::option_type::FLOAT, "center deadzone range for joystick where change is ignored (0.0 center, 1.0 end)" },
+ { OPTION_JOYSTICK_SATURATION ";joy_saturation;jsat(0.00-1)", "0.85", core_options::option_type::FLOAT, "end of axis saturation range for joystick where change is ignored (0.0 center, 1.0 end)" },
+ { OPTION_JOYSTICK_THRESHOLD ";joy_threshold;jthresh(0.00-1)", "0.3", core_options::option_type::FLOAT, "threshold for joystick to be considered active as a switch (0.0 center, 1.0 end)" },
+ { OPTION_NATURAL_KEYBOARD ";nat", "0", core_options::option_type::BOOLEAN, "specifies whether to use a natural keyboard or not" },
+ { OPTION_JOYSTICK_CONTRADICTORY ";joy_contradictory","0", core_options::option_type::BOOLEAN, "enable contradictory direction digital joystick input at the same time" },
+ { OPTION_COIN_IMPULSE, "0", core_options::option_type::INTEGER, "set coin impulse time (n<0 disable impulse, n==0 obey driver, 0<n set time n)" },
// input autoenable options
- { nullptr, nullptr, OPTION_HEADER, "CORE INPUT AUTOMATIC ENABLE OPTIONS" },
- { OPTION_PADDLE_DEVICE ";paddle", "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a paddle control is present" },
- { OPTION_ADSTICK_DEVICE ";adstick", "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if an analog joystick control is present" },
- { OPTION_PEDAL_DEVICE ";pedal", "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a pedal control is present" },
- { OPTION_DIAL_DEVICE ";dial", "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a dial control is present" },
- { OPTION_TRACKBALL_DEVICE ";trackball", "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a trackball control is present" },
- { OPTION_LIGHTGUN_DEVICE, "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a lightgun control is present" },
- { OPTION_POSITIONAL_DEVICE, "keyboard", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a positional control is present" },
- { OPTION_MOUSE_DEVICE, "mouse", OPTION_STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a mouse control is present" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE INPUT AUTOMATIC ENABLE OPTIONS" },
+ { OPTION_PADDLE_DEVICE ";paddle", "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a paddle control is present" },
+ { OPTION_ADSTICK_DEVICE ";adstick", "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if an analog joystick control is present" },
+ { OPTION_PEDAL_DEVICE ";pedal", "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a pedal control is present" },
+ { OPTION_DIAL_DEVICE ";dial", "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a dial control is present" },
+ { OPTION_TRACKBALL_DEVICE ";trackball", "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a trackball control is present" },
+ { OPTION_LIGHTGUN_DEVICE, "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a lightgun control is present" },
+ { OPTION_POSITIONAL_DEVICE, "keyboard", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a positional control is present" },
+ { OPTION_MOUSE_DEVICE, "mouse", core_options::option_type::STRING, "enable (none|keyboard|mouse|lightgun|joystick) if a mouse control is present" },
// debugging options
- { nullptr, nullptr, OPTION_HEADER, "CORE DEBUGGING OPTIONS" },
- { OPTION_VERBOSE ";v", "0", OPTION_BOOLEAN, "display additional diagnostic information" },
- { OPTION_LOG, "0", OPTION_BOOLEAN, "generate an error.log file" },
- { OPTION_OSLOG, "0", OPTION_BOOLEAN, "output error.log data to system diagnostic output (debugger or standard error)" },
- { OPTION_DEBUG ";d", "0", OPTION_BOOLEAN, "enable/disable debugger" },
- { OPTION_UPDATEINPAUSE, "0", OPTION_BOOLEAN, "keep calling video updates while in pause" },
- { OPTION_DEBUGSCRIPT, nullptr, OPTION_STRING, "script for debugger" },
- { OPTION_DEBUGLOG, "0", OPTION_BOOLEAN, "write debug console output to debug.log" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE DEBUGGING OPTIONS" },
+ { OPTION_VERBOSE ";v", "0", core_options::option_type::BOOLEAN, "display additional diagnostic information" },
+ { OPTION_LOG, "0", core_options::option_type::BOOLEAN, "generate an error.log file" },
+ { OPTION_OSLOG, "0", core_options::option_type::BOOLEAN, "output error.log data to system diagnostic output (debugger or standard error)" },
+ { OPTION_DEBUG ";d", "0", core_options::option_type::BOOLEAN, "enable/disable debugger" },
+ { OPTION_UPDATEINPAUSE, "0", core_options::option_type::BOOLEAN, "keep calling video updates while in pause" },
+ { OPTION_DEBUGSCRIPT, nullptr, core_options::option_type::PATH, "script for debugger" },
+ { OPTION_DEBUGLOG, "0", core_options::option_type::BOOLEAN, "write debug console output to debug.log" },
// comm options
- { nullptr, nullptr, OPTION_HEADER, "CORE COMM OPTIONS" },
- { OPTION_COMM_LOCAL_HOST, "0.0.0.0", OPTION_STRING, "local address to bind to" },
- { OPTION_COMM_LOCAL_PORT, "15112", OPTION_STRING, "local port to bind to" },
- { OPTION_COMM_REMOTE_HOST, "127.0.0.1", OPTION_STRING, "remote address to connect to" },
- { OPTION_COMM_REMOTE_PORT, "15112", OPTION_STRING, "remote port to connect to" },
- { OPTION_COMM_FRAME_SYNC, "0", OPTION_BOOLEAN, "sync frames" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE COMM OPTIONS" },
+ { OPTION_COMM_LOCAL_HOST, "0.0.0.0", core_options::option_type::STRING, "local address to bind to" },
+ { OPTION_COMM_LOCAL_PORT, "15112", core_options::option_type::STRING, "local port to bind to" },
+ { OPTION_COMM_REMOTE_HOST, "127.0.0.1", core_options::option_type::STRING, "remote address to connect to" },
+ { OPTION_COMM_REMOTE_PORT, "15112", core_options::option_type::STRING, "remote port to connect to" },
+ { OPTION_COMM_FRAME_SYNC, "0", core_options::option_type::BOOLEAN, "sync frames" },
// misc options
- { nullptr, nullptr, OPTION_HEADER, "CORE MISC OPTIONS" },
- { OPTION_DRC, "1", OPTION_BOOLEAN, "enable DRC CPU core if available" },
- { OPTION_DRC_USE_C, "0", OPTION_BOOLEAN, "force DRC to use C backend" },
- { OPTION_DRC_LOG_UML, "0", OPTION_BOOLEAN, "write DRC UML disassembly log" },
- { OPTION_DRC_LOG_NATIVE, "0", OPTION_BOOLEAN, "write DRC native disassembly log" },
- { OPTION_BIOS, nullptr, OPTION_STRING, "select the system BIOS to use" },
- { OPTION_CHEAT ";c", "0", OPTION_BOOLEAN, "enable cheat subsystem" },
- { OPTION_SKIP_GAMEINFO, "0", OPTION_BOOLEAN, "skip displaying the system information screen at startup" },
- { OPTION_UI_FONT, "default", OPTION_STRING, "specify a font to use" },
- { OPTION_UI, "cabinet", OPTION_STRING, "type of UI (simple|cabinet)" },
- { OPTION_RAMSIZE ";ram", nullptr, OPTION_STRING, "size of RAM (if supported by driver)" },
- { OPTION_CONFIRM_QUIT, "0", OPTION_BOOLEAN, "ask for confirmation before exiting" },
- { OPTION_UI_MOUSE, "1", OPTION_BOOLEAN, "display UI mouse cursor" },
- { OPTION_LANGUAGE ";lang", "English", OPTION_STRING, "set UI display language" },
- { OPTION_NVRAM_SAVE ";nvwrite", "1", OPTION_BOOLEAN, "save NVRAM data on exit" },
-
- { nullptr, nullptr, OPTION_HEADER, "SCRIPTING OPTIONS" },
- { OPTION_AUTOBOOT_COMMAND ";ab", nullptr, OPTION_STRING, "command to execute after machine boot" },
- { OPTION_AUTOBOOT_DELAY, "0", OPTION_INTEGER, "delay before executing autoboot command (seconds)" },
- { OPTION_AUTOBOOT_SCRIPT ";script", nullptr, OPTION_STRING, "Lua script to execute after machine boot" },
- { OPTION_CONSOLE, "0", OPTION_BOOLEAN, "enable emulator Lua console" },
- { OPTION_PLUGINS, "1", OPTION_BOOLEAN, "enable Lua plugin support" },
- { OPTION_PLUGIN, nullptr, OPTION_STRING, "list of plugins to enable" },
- { OPTION_NO_PLUGIN, nullptr, OPTION_STRING, "list of plugins to disable" },
-
- { nullptr, nullptr, OPTION_HEADER, "HTTP SERVER OPTIONS" },
- { OPTION_HTTP, "0", OPTION_BOOLEAN, "enable HTTP server" },
- { OPTION_HTTP_PORT, "8080", OPTION_INTEGER, "HTTP server port" },
- { OPTION_HTTP_ROOT, "web", OPTION_STRING, "HTTP server document root" },
+ { nullptr, nullptr, core_options::option_type::HEADER, "CORE MISC OPTIONS" },
+ { OPTION_DRC, "1", core_options::option_type::BOOLEAN, "enable DRC CPU core if available" },
+ { OPTION_DRC_USE_C, "0", core_options::option_type::BOOLEAN, "force DRC to use C backend" },
+ { OPTION_DRC_LOG_UML, "0", core_options::option_type::BOOLEAN, "write DRC UML disassembly log" },
+ { OPTION_DRC_LOG_NATIVE, "0", core_options::option_type::BOOLEAN, "write DRC native disassembly log" },
+ { OPTION_BIOS, nullptr, core_options::option_type::STRING, "select the system BIOS to use" },
+ { OPTION_CHEAT ";c", "0", core_options::option_type::BOOLEAN, "enable cheat subsystem" },
+ { OPTION_SKIP_GAMEINFO, "0", core_options::option_type::BOOLEAN, "skip displaying the system information screen at startup" },
+ { OPTION_UI_FONT, "default", core_options::option_type::STRING, "specify a font to use" },
+ { OPTION_UI, "cabinet", core_options::option_type::STRING, "type of UI (simple|cabinet)" },
+ { OPTION_RAMSIZE ";ram", nullptr, core_options::option_type::STRING, "size of RAM (if supported by driver)" },
+ { OPTION_CONFIRM_QUIT, "0", core_options::option_type::BOOLEAN, "ask for confirmation before exiting" },
+ { OPTION_UI_MOUSE, "1", core_options::option_type::BOOLEAN, "display UI mouse cursor" },
+ { OPTION_LANGUAGE ";lang", "", core_options::option_type::STRING, "set UI display language" },
+ { OPTION_NVRAM_SAVE ";nvwrite", "1", core_options::option_type::BOOLEAN, "save NVRAM data on exit" },
+
+ { nullptr, nullptr, core_options::option_type::HEADER, "SCRIPTING OPTIONS" },
+ { OPTION_AUTOBOOT_COMMAND ";ab", nullptr, core_options::option_type::STRING, "command to execute after machine boot" },
+ { OPTION_AUTOBOOT_DELAY, "0", core_options::option_type::INTEGER, "delay before executing autoboot command (seconds)" },
+ { OPTION_AUTOBOOT_SCRIPT ";script", nullptr, core_options::option_type::PATH, "Lua script to execute after machine boot" },
+ { OPTION_CONSOLE, "0", core_options::option_type::BOOLEAN, "enable emulator Lua console" },
+ { OPTION_PLUGINS, "1", core_options::option_type::BOOLEAN, "enable Lua plugin support" },
+ { OPTION_PLUGIN, nullptr, core_options::option_type::STRING, "list of plugins to enable" },
+ { OPTION_NO_PLUGIN, nullptr, core_options::option_type::STRING, "list of plugins to disable" },
+
+ { nullptr, nullptr, core_options::option_type::HEADER, "HTTP SERVER OPTIONS" },
+ { OPTION_HTTP, "0", core_options::option_type::BOOLEAN, "enable HTTP server" },
+ { OPTION_HTTP_PORT, "8080", core_options::option_type::INTEGER, "HTTP server port" },
+ { OPTION_HTTP_ROOT, "web", core_options::option_type::PATH, "HTTP server document root" },
{ nullptr }
};
@@ -253,7 +259,7 @@ namespace
}
protected:
- virtual void internal_set_value(std::string &&newvalue) override
+ virtual void internal_set_value(std::string &&newvalue, bool perform_substitutions) override
{
m_host.set_system_name(std::move(newvalue));
}
@@ -273,7 +279,7 @@ namespace
}
protected:
- virtual void internal_set_value(std::string &&newvalue) override
+ virtual void internal_set_value(std::string &&newvalue, bool perform_substitutions) override
{
m_host.set_software(std::move(newvalue));
}
@@ -311,7 +317,7 @@ namespace
}
protected:
- virtual void internal_set_value(std::string &&newvalue) override
+ virtual void internal_set_value(std::string &&newvalue, bool perform_substitutions) override
{
m_host.specify(std::move(newvalue), false);
}
@@ -337,7 +343,7 @@ namespace
}
protected:
- virtual void internal_set_value(std::string &&newvalue) override
+ virtual void internal_set_value(std::string &&newvalue, bool perform_substitutions) override
{
m_host.specify(std::move(newvalue), false);
}
@@ -527,7 +533,7 @@ void emu_options::update_slot_and_image_options()
if (add_and_remove_slot_options())
changed = true;
- // second, we perform an analgous operation with m_image_options
+ // second, we perform an analogous operation with m_image_options
if (add_and_remove_image_options())
changed = true;
@@ -613,8 +619,8 @@ bool emu_options::add_and_remove_slot_options()
//-------------------------------------------------
-// add_and_remove_slot_options - add any missing
-// and/or purge extraneous slot options
+// add_and_remove_image_options - add any missing
+// and/or purge extraneous image options
//-------------------------------------------------
bool emu_options::add_and_remove_image_options()
@@ -717,7 +723,7 @@ bool emu_options::add_and_remove_image_options()
//-------------------------------------------------
// reevaluate_default_card_software - based on recent
-// changes in what images are mounted, give drivers
+// changes in what images are mounted, give devices
// a chance to specify new default slot options
//-------------------------------------------------
@@ -756,6 +762,16 @@ void emu_options::reevaluate_default_card_software()
std::string default_card_software = get_default_card_software(slot);
if (slot_opt.default_card_software() != default_card_software)
{
+ // HACK: prevent option values set from "XXX_default" in software list entries
+ // from getting cleared out, using crude heuristic to distinguish these from
+ // values representing cartridge types and such
+ if (default_card_software.empty())
+ {
+ auto *opt = slot.option(slot_opt.default_card_software().c_str());
+ if (opt && opt->selectable())
+ continue;
+ }
+
slot_opt.set_default_card_software(std::move(default_card_software));
// calling set_default_card_software() can cause a cascade of slot/image
@@ -844,7 +860,8 @@ void emu_options::set_software(std::string &&new_software)
}
// keep any deferred options for the next round
- softlist_opts = std::move(deferred_opts);
+ softlist_opts.slot = std::move(deferred_opts.slot);
+ softlist_opts.image = std::move(deferred_opts.image);
// do we have any pending options after failing to distribute any?
size_t after_size = softlist_opts.slot.size() + softlist_opts.image.size();
@@ -852,6 +869,14 @@ void emu_options::set_software(std::string &&new_software)
throw options_error_exception("Could not assign software option");
}
+ // distribute slot option defaults
+ for (auto &slot_opt : softlist_opts.slot_defaults)
+ {
+ auto iter = m_slot_options.find(slot_opt.first);
+ if (iter != m_slot_options.end())
+ iter->second.set_default_card_software(std::move(slot_opt.second));
+ }
+
// we've succeeded; update the set name
m_software_name = std::move(new_software);
}
@@ -921,9 +946,12 @@ emu_options::software_options emu_options::evaluate_initial_softlist_options(con
// we need to find a mountable image slot, but we need to ensure it is a slot
// for which we have not already distributed a part to
device_image_interface *image = software_list_device::find_mountable_image(
- config,
- swpart,
- [&results](const device_image_interface &candidate) { return results.image.count(candidate.instance_name()) == 0; });
+ config,
+ swpart,
+ [&results] (const device_image_interface &candidate)
+ {
+ return results.image.count(candidate.instance_name()) == 0;
+ });
// did we find a slot to put this part into?
if (image != nullptr)
@@ -949,14 +977,22 @@ emu_options::software_options emu_options::evaluate_initial_softlist_options(con
// ...
// <sharedfeat name = "ctrl1_default" value = "paddle" />
// </software>
- for (const feature_list_item &fi : swinfo->shared_info())
+ for (const software_info_item &fi : swinfo->shared_features())
{
const std::string default_suffix = "_default";
if (fi.name().size() > default_suffix.size()
&& fi.name().compare(fi.name().size() - default_suffix.size(), default_suffix.size(), default_suffix) == 0)
{
std::string slot_name = fi.name().substr(0, fi.name().size() - default_suffix.size());
- results.slot[slot_name] = fi.value();
+
+ // only add defaults if they exist in this configuration
+ device_t *device = config.root_device().subdevice(slot_name.c_str());
+ if (device)
+ {
+ device_slot_interface *intf;
+ if (device->interface(intf) && intf->option(fi.value().c_str()))
+ results.slot_defaults[slot_name] = fi.value();
+ }
}
}
}
@@ -1049,8 +1085,9 @@ image_option &emu_options::image_option(const std::string &device_name)
void emu_options::command_argument_processed()
{
// some command line arguments require that the system name be set, so we can get slot options
- if (command_arguments().size() == 1 && !core_iswildstr(command_arguments()[0].c_str()) &&
- (command() == "listdevices" || (command() == "listslots") || (command() == "listmedia") || (command() == "listsoftware")))
+ // FIXME: having this here is a massively leaky abstraction
+ if (command_arguments().size() == 1 && !core_iswildstr(command_arguments()[0]) &&
+ (command() == "listdevices" || (command() == "listslots") || (command() == "listbios") || (command() == "listmedia") || (command() == "listsoftware")))
{
set_system_name(command_arguments()[0]);
}
@@ -1219,8 +1256,8 @@ void slot_option::set_bios(std::string &&text)
{
if (!m_specified)
{
- m_specified = true;
m_specified_value = value();
+ m_specified = true;
}
m_specified_bios = std::move(text);
}