Merge branch 'master' of github-lodefmode:lodefmode/stella

This commit is contained in:
Lo Def 2021-09-18 15:51:35 -04:00
commit f501d2d00b
70 changed files with 788 additions and 775 deletions

View File

@ -21,6 +21,12 @@
* Added web links for many games
* Added dead zone and linearity settings for analog controllers
* Fixed MindLink controller
* Added TIA randomization on startup option
* Debugger: enhanced prompt's auto complete and history
* Debugger: added optional logging of breaks and traps

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -272,9 +272,9 @@
Atari 2600 FPGA project, including cycle-exact audio, analog interference
from mixing of audio channels, as well as stereo sound support; dynamic
sound resampling is also included</li>
<li>Emulates the Atari 2600 Joystick, Paddle, Driving, CBS BoosterGrip, Sega Genesis, QuadTari controllers using your computer's keyboard,
<li>Emulates the Atari 2600 Joystick, Paddle, Driving, CBS Booster Grip, Sega Genesis, QuadTari controllers using your computer's keyboard,
joysticks or mouse</li>
<li>Emulates CX22/CX80 style Trackballs, Amiga/Atari Mouse, Mindlink controller and the Light Gun using your
<li>Emulates CX22/CX80 style Trak-Balls, Amiga/Atari mouse, MindLink controller and the Light Gun using your
computer's mouse</li>
<li>Emulates the Atari 2600 Keyboard controllers using your computer's keyboard</li>
<li>Emulates <a href="https://en.wikipedia.org/wiki/CompuMate">Spectravideo CompuMate</a> system using your computer's keyboard,
@ -781,7 +781,7 @@
</table>
<p><b>Joystick/BoosterGrip Controller (can be remapped)</b></p>
<p><b>Joystick/Booster Grip Controller (can be remapped)</b></p>
<table BORDER=2>
<tr>
@ -880,7 +880,7 @@
</tr>
</table>
<p><b>Sega Genesis Controller (cannot be remapped, always associated with joystick and booster-grip controllers)</b></p>
<p><b>Sega Genesis Controller (cannot be remapped, always associated with joystick and Booster Grip controllers)</b></p>
<table BORDER=2>
<tr>
@ -1574,16 +1574,27 @@
</tr>
<tr>
<td><i>Decrease</i> joystick deadzone</td>
<td><i>Decrease</i> analog joystick dead zone for digital controllers</td>
<td>Shift-Control + F1</td>
<td>Shift-Control + F1</td>
</tr>
<tr>
<td><i>Increase</i> joystick deadzone</td>
<td><i>Increase</i> analog joystick dead zone for digital controllers</td>
<td>Control + F1</td>
<td>Control + F1</td>
</tr>
<tr>
<td><i>Decrease</i> analog joystick dead zone for analog controllers</td>
<td>Shift-Control-Alt + F1</td>
<td>Shift-Control-Cmd + F1</td>
</tr>
<tr>
<td><i>Increase</i> analog joystick dead zone for analog controllers</td>
<td>Control-Alt + F1</td>
<td>Control-Cmd + F1</td>
</tr>
<tr>
<td><i>Decrease</i> analog paddle sensitivity</td>
<td>Shift-Control + F2</td>
@ -1595,6 +1606,17 @@
<td>Control + F2</td>
</tr>
<tr>
<td><i>Decrease</i> analog paddle linearity</td>
<td>Shift-Control-Alt + F2</td>
<td>Shift-Control-Cmd + F2</td>
</tr>
<tr>
<td><i>Increase</i> analog paddle linearity</td>
<td>Control-Alt + F2</td>
<td>Control-Cmd + F2</td>
</tr>
<tr>
<td><i>Decrease</i> analog paddle dejitter averaging</td>
<td>Shift-Control + F3</td>
@ -1933,8 +1955,9 @@
</table>
<p><b><a name="GlobalKeys">Global Keys</a> (can be remapped)</b></p>
<p>These keys allow selecting and changing settings without having to remember the
dedicated keys. They keys are grouped by 'Audio & Video', 'Input Device & Ports' and 'Debug' settings.</p>
<p>These keys allow selecting and changing settings without having to remember
the dedicated hotkeys. The global keys are grouped by 'Audio & Video',
'Input Devices & Ports' and 'Debug' settings.</p>
<table BORDER=2 cellpadding=4>
<tr>
<th>Function</th>
@ -1976,8 +1999,8 @@
<ul>
<li>Only available if UI messages are enabled.</li>
<li>Currently not available settings are automatically skipped.</li>
<li>If a setting was previously selected via a dedicated key, its value can also be changed with the
global keys.</li>
<li>If a setting was previously selected via a dedicated hotkey, its
value can also be directly changed with the global keys.</li>
</ul>
</p>
@ -2395,7 +2418,7 @@
<td> &#x2713;</td>
</tr>
<tr>
<th> Booster</th>
<th> Booster Grip</th>
<td> &#x2713;</td>
<td> &#x2713;</td>
<td> &#x2713; (+ extra)</td>
@ -2403,7 +2426,7 @@
<td> &#x2713; (+ extra)</td>
</tr>
<tr>
<th> Genesis</th>
<th> Sega Genesis</th>
<td> &#x2713;</td>
<td> &#x2713; (+ extra)</td>
<td> &#x2713;</td>
@ -2427,7 +2450,7 @@
<td> &#x2713;</td>
</tr>
<tr>
<th> Trackball/Mouse</th>
<th> Trak-Ball/Mouse</th>
<td> &#x2715;</td>
<td> &#x2715;</td>
<td> &#x2713;</td>
@ -2451,7 +2474,7 @@
<td> &#x2715;</td>
</tr>
<tr>
<th> Mindlink</th>
<th> MindLink</th>
<td> &#x2715;</td>
<td> &#x2715;</td>
<td> &#x2713;</td>
@ -2938,30 +2961,48 @@
</tr>
<tr>
<td><pre>-joydeadzone &lt;number&gt;</pre></td>
<td>Set the joystick axis deadzone area for analog joysticks/gamepads.
All values within the deadzone are treated as zero-axis values,
while only those values outside are registered as valid input.
Accepts a number from 0 - 29, and uses the formula
3200 + number * 1000. So the possible deadzone values
range from 3200 to 32200.</td>
<td><pre>-joydeadzone &lt;0 - 29&gt;</pre></td>
<td>Set the joystick axis dead zone area for analog joysticks/gamepads
emulating digital controllers.
All values within the dead zone are treated as zero-axis values,
while only those values outside are registered as valid input.</br>
Dead zone is calculated as 3200 + value * 1000. So the possible dead
zone values range from 3200 to 32200 (= 10% - 98%).</td>
</tr>
<tr>
<td><pre>-psense &lt;number&gt;</pre></td>
<td>Sensitivity for emulation of paddles when using analog paddles.
Valid range of values is from 0 to 30, with larger numbers causing
faster movement.</td>
<td><pre>-adeadzone &lt;0 - 29&gt;</pre></td>
<td>Set the joystick axis dead zone area for analog joysticks/gamepads
emulating analog controllers. All values within the dead zone are
treated as zero-axis values, while only those values outside are
registered as valid input. </br>
Dead zone is calculated as value * 565. So the possible dead zone
values range from 0 to 16384 (= 0% - 50%)</td>
</tr>
<tr>
<td><pre>-psense &lt;0 - 30&gt;</pre></td>
<td>Sensitivity for emulation of paddles when using analog controllers.
Larger numbers are causing faster movement.</td>
</tr>
<tr>
<td><pre>-plinear &lt;25 - 100&gt;</pre></td>
<td>Linearity of analog paddles. Lower numbers allow finer control
around the paddle center.</td>
</tr>
<tr>
<td><pre>-dejitter.base &lt;0 - 10&gt;</pre></td>
<td>Strength of paddle input averaging.</td>
<td>Strength of analog paddle input averaging. Higher values will make
the movement smoother, but also less responsive.</td>
</tr>
<tr>
<td><pre>-dejitter.diff &lt;0 - 10&gt;</pre></td>
<td>Impact of fast paddle movement on input averaging.</td>
<td>Impact of fast analog paddle movement on input averaging. Higher
values will reduce the movement smoothing while the paddle is moved
fast, making fast paddle movements more responsive.</td>
</tr>
<tr>
@ -2990,7 +3031,7 @@
when you want to disable them.</br>
E.g. a 2-player game is using either the 'F' or 'R' keys for movement,
and pressing Control (for Fire) will perform an unwanted action
associated with 'Control + R' or 'Control + F' default keys.</td>
associated with 'Control + F' or 'Control + R' default keys.</td>
</tr>
<tr>
@ -3527,6 +3568,9 @@
</tr><tr>
<td><pre>-&lt;plr.|dev.&gt;bankrandom &lt;1|0&gt;</pre></td>
<td>On reset, randomize the startup bank (only for selected bankswitch types).</td>
</tr><tr>
<td><pre>-&lt;plr.|dev.&gt;tiarandom &lt;1|0&gt;</pre></td>
<td>On reset, randomize the TIA registers.</td>
</tr><tr>
<td><pre>-&lt;plr.|dev.&gt;ramrandom &lt;1|0&gt;</pre></td>
<td>On reset, either randomize all RAM content, or initialize with zero (console = 2600)/startup values (console = 7800) instead.</td>
@ -3988,12 +4032,18 @@
<td valign="top">
<table border="1" cellpadding="4">
<tr><th>Item</th><th>Brief description</th><th>For more information,<br>see <a href="#CommandLine">Command Line</a></th></tr>
<tr><td>Joystick deadzone size</td><td>Deadzone area for axes on joysticks/gamepads</td><td>-joydeadzone</td></tr>
<tr><td>(Analog paddle) Sensitivity</td><td>Sensitivity of an analog paddle</td><td>-psense</td></tr>
<tr><td>(Analog paddle) Dejitter averaging</td><td>Strength of paddle input averaging, suppresses paddle jitter.<br>
<tr><td>Digital dead zone size</td><td>Dead zone area for axes on joysticks/gamepads emulating
digital controllers
</td><td>-joydeadzone</td></tr>
<tr><td>Analog dead zone size</td><td>Dead zone area for axes on joysticks/gamepads emulating
analog controllers
</td><td>-adeadzone</td></tr>
<tr><td>(Analog paddle) Sensitivity</td><td>Sensitivity of analog paddles</td><td>-psense</td></tr>
<tr><td>(Analog paddle) Linearity</td><td>Linearity of analog paddles</td><td>-plinear</td></tr>
<tr><td>(Analog paddle) Dejitter averaging</td><td>Strength of paddle input averaging, suppresses paddle jitter<br>
Note: The 2600-daptor has built-in dejitter, so there should be no need to use Stella's dejitter.
</td><td>-dejitter.base</td></tr>
<tr><td>(Analog paddle) Dejitter reaction</td><td>Strength of paddle reaction to fast paddle movements, suppresses paddle jitter.</td><td>-dejitter.diff</td></tr>
<tr><td>(Analog paddle) Dejitter reaction</td><td>Strength of paddle reaction to fast paddle movements, suppresses paddle jitter</td><td>-dejitter.diff</td></tr>
<tr><td>Digital paddle sensitivity</td><td>Sensitivity used when emulating a paddle using a digital device</td><td>-dsense</td></tr>
<tr><td>Autofire rate</td><td>Automatic trigger rate of the fire buttons in Hz</td><td>-autofirerate</td></tr>
<tr><td>Allow all 4 directions ...</td><td>Allow all 4 joystick directions to be pressed simultaneously</td><td>-joyallow4</td></tr>
@ -4278,15 +4328,57 @@
<td>&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td valign="top">
<table border="1" cellpadding="4">
<tr><th>Item</th><th>Brief description</th><th>For more information,<br>see <a href="#CommandLine">Command Line</a></th></tr>
<tr><td>Player/Developer settings</td><td>Selects the active settings set</td><td>-dev.settings</td></tr>
<tr><td>Console info overlay</td><td>Overlay console info on the TIA image during emulation.</td><td>-plr.stats<br/>-dev.stats</td></tr>
<tr><td>Detected settings info</td><td>Display detected settings when a ROM is loaded.</td><td>-plr.detectedinfo<br/>-dev.detectedinfo</td></tr>
<tr><td>Console</td><td>Select the console type, this affects Color/B&W/Pause key emulation and zero-page RAM initialization</td><td>-plr.console <br/>-dev.console</td></tr>
<tr><td>Random startup bank</td><td>Randomize the startup bank (only for selected bankswitch types)</td><td>-plr.bankrandom<br/>-dev.bankrandom</td></tr>
<tr><td>Randomize zero-page ...</td><td>When loading a ROM, randomize all RAM content instead of initializing with all zeroes (for 'Console' = 'Atari 2600' only)</td><td>-plr.ramrandom<br/>-dev.ramrandom</td></tr>
<tr><td>Randomize CPU</td><td>When loading a ROM, randomize the content of the specified CPU registers</td><td>-plr.cpurandom<br/>-dev.cpurandom</td></tr>
<tr><td>Drive unused TIA pins ...</td><td>Unused TIA pins are read random instead of the last databus values</td><td>-dev.tiadriven</td></tr>
<tr>
<th>Item</th>
<th>Brief description</th>
<th>For more information,<br>see <a href="#CommandLine">Command Line</a></th>
</tr>
<tr>
<td>Player/Developer settings</td>
<td>Selects the active settings set</td>
<td>-dev.settings</td>
</tr>
<tr>
<td>Console info overlay</td>
<td>Overlay console info on the TIA image during emulation.</td>
<td>-plr.stats<br/>-dev.stats</td></tr>
<tr>
<td>Detected settings info</td>
<td>Display detected settings when a ROM is loaded.</td>
<td>-plr.detectedinfo<br/>-dev.detectedinfo</td>
</tr>
<tr>
<td>Console</td>
<td>Select the console type, this affects Color/B&W/Pause key
emulation and zero-page RAM initialization</td>
<td>-plr.console <br/>-dev.console</td>
</tr>
<tr>
<td>Random startup bank</td>
<td>Randomize the startup bank (only for selected bankswitch types)</td>
<td>-plr.bankrandom<br/>-dev.bankrandom</td>
</tr>
<tr>
<td>Randomize TIA</td>
<td>Randomize TIA registers when loading a ROM</td>
<td>-plr.tiarandom<br/>-dev.tiarandom</td>
</tr>
<tr>
<td>Randomize zero-page ...</td>
<td>When loading a ROM, randomize all RAM content instead of
initializing with all zeroes (for 'Console' = 'Atari 2600' only)</td>
<td>-plr.ramrandom<br/>-dev.ramrandom</td>
</tr>
<tr>
<td>Randomize CPU</td>
<td>When loading a ROM, randomize the content of the specified CPU registers</td>
<td>-plr.cpurandom<br/>-dev.cpurandom</td>
</tr>
<tr>
<td>Drive unused TIA pins ...</td>
<td>Unused TIA pins are read random instead of the last databus values</td>
<td>-dev.tiadriven</td>
</tr>
<tr>
<td>Break on reads from ...</td>
<td>A read from a write port interrupts emulation and the debugger is entered.</td>
@ -4302,7 +4394,11 @@
<td>Thumb ARM emulation throws an exception and enters the debugger on fatal errors</td>
<td><span style="white-space:nowrap">-dev.thumb.trapfatal</span></td>
</tr>
<tr><td>Display AtariVox...</td><td>Display a message when the AtariVox/SaveKey EEPROM is read or written</td><td>-plr.eepromaccess<br/>-dev.eepromaccess</td></tr>
<tr>
<td>Display AtariVox...</td>
<td>Display a message when the AtariVox/SaveKey EEPROM is read or written</td>
<td>-plr.eepromaccess<br/>-dev.eepromaccess</td>
</tr>
</table>
</td>
</tr>
@ -4896,11 +4992,11 @@ Ms Pac-Man (Stella extended codes):
<tr><td>Trakball</td><td>Standard Atari 2600 CX22/CX80 'Trak-Ball' controller.</td></tr>
<tr><td><a href="https://atariage.com/store/index.php?l=product_detail&p=1045">AtariVox &#185</a></td><td>A SpeakJet based unlimited-vocabulary speech/sound synthesizer with 32K EEPROM.</td></tr>
<tr><td>SaveKey</td><td>A 32K EEPROM for saving high scores, etc. (the EEPROM portion of an AtariVox).</td></tr>
<tr><td>Genesis </td><td>Sega Genesis controller, which can be used similar to a BoosterGrip, giving an extra button.</td></tr>
<tr><td>Genesis </td><td>Sega Genesis controller, which can be used similar to a Booster Grip, giving an extra button.</td></tr>
<tr><td>CompuMate &#185</td><td>Spectravideo CompuMate (if either left or right is set, CompuMate is used for both).</td></tr>
<tr><td>Lightgun</td><td>Atari XG-1 compatible Light Gun</td></tr>
<tr><td>Mindlink &#185</td><td>Mindlink controller.</td></tr>
<tr><td>KidVid &#185</td><td>KidVid controller, limited support (8, 9 and 0 start the games).</td></tr>
<tr><td>Lightgun</td><td>Atari XG-1 compatible Light Gun.</td></tr>
<tr><td>MindLink &#185</td><td>MindLink controller.</td></tr>
<tr><td>KidVid</td><td>Kid Vid Voice Module, limited support (Right Keyboard controller buttons 1, 2 and 3 start the games, default mapping is 8, 9 and 0).</td></tr>
<tr><td>QuadTari</td><td><a href="#Quadtari">QuadTari</a> controller, limited support (see below).</td></tr>
</table></td>
</tr>

View File

@ -20,6 +20,7 @@
#include "Console.hxx"
#include "Joystick.hxx"
#include "Paddles.hxx"
#include "MindLink.hxx"
#include "PointingDevice.hxx"
#include "Driving.hxx"
#include "Settings.hxx"
@ -664,7 +665,6 @@ bool PhysicalJoystickHandler::addJoyMapping(Event::Type event, EventMode mode, i
{
EventMode evMode = getEventMode(event, mode);
// This confusing code is because each axis has two associated values,
// but analog events only affect one of the axis.
if (Event::isAnalog(event))
@ -798,13 +798,13 @@ void PhysicalJoystickHandler::handleRegularAxisEvent(const PhysicalJoystickPtr j
Event::Type eventAxisNeg = j->joyMap.get(EventMode::kEmulationMode, button, JoyAxis(axis), JoyDir::NEG);
Event::Type eventAxisPos = j->joyMap.get(EventMode::kEmulationMode, button, JoyAxis(axis), JoyDir::POS);
if(value > Joystick::deadzone())
if(value > Controller::digitalDeadZone())
myHandler.handleEvent(eventAxisPos);
else if(value < -Joystick::deadzone())
else if(value < -Controller::digitalDeadZone())
myHandler.handleEvent(eventAxisNeg);
else
{
// Treat any deadzone value as zero
// Treat any dead zone value as zero
value = 0;
// Now filter out consecutive, similar values
@ -813,8 +813,8 @@ void PhysicalJoystickHandler::handleRegularAxisEvent(const PhysicalJoystickPtr j
{
// Turn off both events, since we don't know exactly which one
// was previously activated.
myHandler.handleEvent(eventAxisNeg, false);
myHandler.handleEvent(eventAxisPos, false);
myHandler.handleEvent(eventAxisNeg, 0);
myHandler.handleEvent(eventAxisPos, 0);
}
}
}
@ -823,14 +823,14 @@ void PhysicalJoystickHandler::handleRegularAxisEvent(const PhysicalJoystickPtr j
#ifdef GUI_SUPPORT
else if(myHandler.hasOverlay())
{
// A value change lower than Joystick::deadzone indicates analog input which is ignored
if((abs(j->axisLastValue[axis] - value) > Joystick::deadzone()))
// A value change lower than Controller::digitalDeadzone indicates analog input which is ignored
if((abs(j->axisLastValue[axis] - value) > Controller::digitalDeadZone()))
{
// First, clamp the values to simulate digital input
// (the only thing that the underlying code understands)
if(value > Joystick::deadzone())
if(value > Controller::digitalDeadZone())
value = 32000;
else if(value < -Joystick::deadzone())
else if(value < -Controller::digitalDeadZone())
value = -32000;
else
value = 0;
@ -945,18 +945,35 @@ ostream& operator<<(ostream& os, const PhysicalJoystickHandler& jh)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PhysicalJoystickHandler::changeDeadzone(int direction)
void PhysicalJoystickHandler::changeDigitalDeadZone(int direction)
{
int deadzone = BSPF::clamp(myOSystem.settings().getInt("joydeadzone") + direction,
Joystick::DEAD_ZONE_MIN, Joystick::DEAD_ZONE_MAX);
myOSystem.settings().setValue("joydeadzone", deadzone);
int deadZone = BSPF::clamp(myOSystem.settings().getInt("joydeadzone") + direction,
Controller::MIN_DIGITAL_DEADZONE, Controller::MAX_DIGITAL_DEADZONE);
myOSystem.settings().setValue("joydeadzone", deadZone);
Joystick::setDeadZone(deadzone);
Controller::setDigitalDeadZone(deadZone);
int value = Joystick::deadZoneValue(deadzone);
ostringstream ss;
ss << std::round(Controller::digitalDeadZoneValue(deadZone) * 100.F / 32768) << "%";
myOSystem.frameBuffer().showGaugeMessage("Joystick deadzone", std::to_string(value),
value, 3200, 32200);
myOSystem.frameBuffer().showGaugeMessage("Digital controller dead zone", ss. str(), deadZone,
Controller::MIN_DIGITAL_DEADZONE, Controller::MAX_DIGITAL_DEADZONE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PhysicalJoystickHandler::changeAnalogPaddleDeadZone(int direction)
{
int deadZone = BSPF::clamp(myOSystem.settings().getInt("adeadzone") + direction,
Controller::MIN_ANALOG_DEADZONE, Controller::MAX_ANALOG_DEADZONE);
myOSystem.settings().setValue("adeadzone", deadZone);
Controller::setAnalogDeadZone(deadZone);
ostringstream ss;
ss << std::round(Controller::analogDeadZoneValue(deadZone) * 100.F / 32768) << "%";
myOSystem.frameBuffer().showGaugeMessage("Analog controller dead zone", ss.str(), deadZone,
Controller::MIN_ANALOG_DEADZONE, Controller::MAX_ANALOG_DEADZONE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -970,10 +987,30 @@ void PhysicalJoystickHandler::changeAnalogPaddleSensitivity(int direction)
ostringstream ss;
ss << std::round(Paddles::analogSensitivityValue(sense) * 100.F) << "%";
myOSystem.frameBuffer().showGaugeMessage("Analog paddle sensitivity", ss.str(), sense,
Paddles::MIN_ANALOG_SENSE, Paddles::MAX_ANALOG_SENSE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PhysicalJoystickHandler::changeAnalogPaddleLinearity(int direction)
{
int linear = BSPF::clamp(myOSystem.settings().getInt("plinear") + direction * 5,
Paddles::MIN_ANALOG_LINEARITY, Paddles::MAX_ANALOG_LINEARITY);
myOSystem.settings().setValue("plinear", linear);
Paddles::setAnalogLinearity(linear);
ostringstream ss;
if(linear)
ss << linear << "%";
else
ss << "Off";
myOSystem.frameBuffer().showGaugeMessage("Analog paddle linearity", ss.str(), linear,
Paddles::MIN_ANALOG_LINEARITY, Paddles::MAX_ANALOG_LINEARITY);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void PhysicalJoystickHandler::changePaddleDejitterAveraging(int direction)
{
@ -1038,17 +1075,17 @@ void PhysicalJoystickHandler::changeDigitalPaddleSensitivity(int direction)
void PhysicalJoystickHandler::changeMousePaddleSensitivity(int direction)
{
int sense = BSPF::clamp(myOSystem.settings().getInt("msense") + direction,
Paddles::MIN_MOUSE_SENSE, Paddles::MAX_MOUSE_SENSE);
Controller::MIN_MOUSE_SENSE, Controller::MAX_MOUSE_SENSE);
myOSystem.settings().setValue("msense", sense);
Paddles::setMouseSensitivity(sense);
Controller::setMouseSensitivity(sense);
ostringstream ss;
ss << sense * 10 << "%";
myOSystem.frameBuffer().showGaugeMessage("Mouse paddle sensitivity",
ss.str(), sense,
Paddles::MIN_MOUSE_SENSE, Paddles::MAX_MOUSE_SENSE);
Controller::MIN_MOUSE_SENSE, Controller::MAX_MOUSE_SENSE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -110,8 +110,10 @@ class PhysicalJoystickHandler
/** Returns a list of pairs consisting of joystick name and associated ID. */
VariantList database() const;
void changeDeadzone(int direction = +1);
void changeDigitalDeadZone(int direction = +1);
void changeAnalogPaddleDeadZone(int direction = +1);
void changeAnalogPaddleSensitivity(int direction = +1);
void changeAnalogPaddleLinearity(int direction = +1);
void changePaddleDejitterAveraging(int direction = +1);
void changePaddleDejitterReaction(int direction = +1);
void changeDigitalPaddleSensitivity(int direction = +1);

View File

@ -689,8 +689,12 @@ PhysicalKeyboardHandler::DefaultCommonMapping = {
{ Event::DecreaseDeadzone, KBDK_F1, KBDM_CTRL | KBDM_SHIFT },
{ Event::IncreaseDeadzone, KBDK_F1, KBDM_CTRL },
{ Event::DecAnalogDeadzone, KBDK_F1, KBDM_CTRL | MOD3 | KBDM_SHIFT},
{ Event::IncAnalogDeadzone, KBDK_F1, KBDM_CTRL | MOD3},
{ Event::DecAnalogSense, KBDK_F2, KBDM_CTRL | KBDM_SHIFT },
{ Event::IncAnalogSense, KBDK_F2, KBDM_CTRL },
{ Event::DecAnalogLinear, KBDK_F2, KBDM_CTRL | MOD3 | KBDM_SHIFT},
{ Event::IncAnalogLinear, KBDK_F2, KBDM_CTRL | MOD3},
{ Event::DecDejtterAveraging, KBDK_F3, KBDM_CTRL | KBDM_SHIFT },
{ Event::IncDejtterAveraging, KBDK_F3, KBDM_CTRL },
{ Event::DecDejtterReaction, KBDK_F4, KBDM_CTRL | KBDM_SHIFT },

View File

@ -195,8 +195,12 @@ NLOHMANN_JSON_SERIALIZE_ENUM(Event::Type, {
{Event::DecreaseDeadzone, "DecreaseDeadzone"},
{Event::IncreaseDeadzone, "IncreaseDeadzone"},
{Event::DecAnalogDeadzone, "DecAnalogDeadzone"},
{Event::IncAnalogDeadzone, "IncAnalogDeadzone"},
{Event::DecAnalogSense, "DecAnalogSense"},
{Event::IncAnalogSense, "IncAnalogSense"},
{Event::DecAnalogLinear, "DecAnalogLinear"},
{Event::IncAnalogLinear, "IncAnalogLinear"},
{Event::DecDejtterAveraging, "DecDejtterAveraging"},
{Event::IncDejtterAveraging, "IncDejtterAveraging"},
{Event::DecDejtterReaction, "DecDejtterReaction"},

View File

@ -1,374 +0,0 @@
"Cart.MD5" "05215b73ec33b502449ee726ac6b201f"
"Cart.Name" "draconian_20171013_RC6"
"Display.Phosphor" "YES"
"Cart.Variations" "4"
"Cart.Formats" "8,0,B,0,B,1,SECT.,D,1,VARIATIONS_ARE_DIFFICULTY_LEVEL"
"Cart.Addresses" "177B,177A,1779,1778,811,1780"
""
"Cart.MD5" "081e2c114c9c20b61acf25fc95c71bf4"
"Cart.Manufacturer" "Parker Brothers, Ed English, David Lamkins"
"Cart.ModelNo" "PB5300"
"Cart.Name" "Frogger (1982) (Parker Bros)"
"Display.Phosphor" "YES"
"Cart.Variations" "6"
"Cart.Addresses" "CC,CE,DD,E6"
""
"Cart.MD5" "136f75c4dd02c29283752b7e5799f978"
"Cart.Manufacturer" "Atari, Dan Hitchens - Sears"
"Cart.ModelNo" "CX2650 - 49-75168"
"Cart.Name" "Berzerk (1982) (Atari)"
"Cart.Rarity" "Common"
"Cart.Variations" "12"
"Cart.Formats" "6"
"Cart.Addresses" "DD,DE,DF,80"
""
"Cart.MD5" "137373599e9b7bf2cf162a102eb5927f"
"Cart.Manufacturer" "AtariAge, Joe Grand"
"Cart.Name" "Ultra SCSIcide (SCSIcide 2.0)"
"Controller.Left" "PADDLES"
"Cart.Formats" "6,0,H"
"Cart.Addresses" "DC,DD,DE"
""
"Cart.MD5" "211774f4c5739042618be8ff67351177"
"Cart.Manufacturer" "Atari - GCC, Mark Ackerman, Tom Calderwood, Glenn Parker"
"Cart.ModelNo" "CX2684"
"Cart.Name" "Galaxian (1983) (Atari)"
"Display.Phosphor" "YES"
"Cart.Variations" "9"
"Cart.Formats" "6,0,B,0,B,0,WAVE"
"Cart.Addresses" "AC,AD,AE,B3,AF"
""
"Cart.MD5" "240bfbac5163af4df5ae713985386f92"
"Cart.Manufacturer" "Activision, Steve Cartwright"
"Cart.ModelNo" "AX-022"
"Cart.Name" "Seaquest (1983) (Activision)"
"Cart.Formats" "6,0,B,0,B,0,_,B,0,HIGH_SCORE_IS_FROM_CURRENT_PLAYER"
"Cart.Addresses" "B8,B9,BA"
""
"Cart.MD5" "278f14887d601b5e5b620f1870bc09f6"
"Cart.Manufacturer" "Thomas Jentzsch"
"Cart.Name" "SWOOPS! (v0.96) (TJ)"
"Cart.Note" "Uses the Joystick (L) and Paddle (R) Controllers"
"Cart.Rarity" "Homebrew"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,0,B,1"
"Cart.Addresses" "FD,FE,FF,FC"
""
"Cart.MD5" "2903896d88a341511586d69fcfc20f7d"
"Cart.Manufacturer" "Activision, David Crane"
"Cart.ModelNo" "AX-014, AX-014-04"
"Cart.Name" "Grand Prix (1982) (Activision)"
"Cart.Variations" "4"
"Cart.Formats" "5,0,B,1,B,1,_,B,0,TIME/SCORE_SHOWS_EXTRA_DIGIT"
"Cart.Addresses" "EB,EC,ED,80"
""
"Cart.MD5" "2a0ba55e56e7a596146fa729acf0e109"
"Cart.Manufacturer" "Activision, Bob Whitehead"
"Cart.ModelNo" "AG-019"
"Cart.Name" "Sky Jinks (1982) (Activision)"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,1,B,1"
"Cart.Addresses" "9E,A6,A2,99"
""
"Cart.MD5" "2bb9f4686f7e08c5fcc69ec1a1c66fe7"
"Cart.Manufacturer" "Atari - GCC, John Allred, Mike Feinstein"
"Cart.ModelNo" "CX2688"
"Cart.Name" "Jungle Hunt (1983) (Atari)"
"Cart.Variations" "2"
"Cart.Formats" "6,0,B,0,B,1"
"Cart.Addresses" "85,84,83,8B"
""
"Cart.MD5" "318a9d6dda791268df92d72679914ac3"
"Cart.Manufacturer" "Activision, Steve Cartwright"
"Cart.ModelNo" "AX-017, AX-017-04"
"Cart.Name" "MegaMania (1982) (Activision)"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,0,B,1"
"Cart.Addresses" "DB,DC,DD,80"
""
"Cart.MD5" "36b20c427975760cb9cf4a47e41369e4"
"Cart.Manufacturer" "Coleco - Woodside Design Associates - Imaginative Systems Software, Garry Kitchen"
"Cart.ModelNo" "2451"
"Cart.Name" "Donkey Kong (1982) (Coleco)"
"Cart.Formats" "6,2"
"Cart.Addresses" "87,88"
""
"Cart.MD5" "3a2e2d0c6892aa14544083dfb7762782"
"Cart.Manufacturer" "Atari, Rob Fulop - Sears"
"Cart.ModelNo" "CX2638 - 49-75166"
"Cart.Name" "Missile Command (1981) (Atari)"
"Display.Phosphor" "YES"
"Cart.Variations" "34"
"Cart.Formats" "6"
"Cart.Addresses" "F3,F1,EF,E9"
""
"Cart.MD5" "3e90cf23106f2e08b2781e41299de556"
"Cart.Manufacturer" "Activision, David Crane"
"Cart.ModelNo" "AX-018, AX-018-04"
"Cart.Name" "Pitfall! (1982) (Activision)"
"Cart.Note" "Pitfall Harry's Jungle Adventure (Jungle Runner)"
"Cart.Formats" "6"
"Cart.Addresses" "D5,D6,D7"
""
"Cart.MD5" "4ca73eb959299471788f0b685c3ba0b5"
"Cart.Manufacturer" "Activision, Steve Cartwright"
"Cart.ModelNo" "AX-031"
"Cart.Name" "Frostbite (1983) (Activision)"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,0,B,1,LEVEL,B,1"
"Cart.Addresses" "C8,C9,CA,80,CB"
""
"Cart.MD5" "515046e3061b7b18aa3a551c3ae12673"
"Cart.Manufacturer" "Atari - GCC, Mark Ackerman, Noellie Alito"
"Cart.ModelNo" "CX2692"
"Cart.Name" "Moon Patrol (1983) (Atari)"
"Cart.Variations" "6"
"Cart.Formats" "6,0,B,0,B,1"
"Cart.Addresses" "EA,EB,EC,F9"
""
"Cart.MD5" "541cac55ebcf7891d9d51c415922303f"
"Cart.Name" "SF2_20131217_RC8_NTSC"
"Display.Phosphor" "YES"
"Cart.Formats" "8,0,B,0,B,0,LEVEL,D,1"
"Cart.Addresses" "1CF7,1CF6,1CF5,1CF4,0,18AC"
""
"Cart.MD5" "6dda84fb8e442ecf34241ac0d1d91d69"
"Cart.Manufacturer" "Atari - GCC, Douglas B. Macrae"
"Cart.ModelNo" "CX2677"
"Cart.Name" "Dig Dug (1983) (Atari)"
"Cart.Variations" "2"
"Cart.Formats" "4,0,B,0,B,1,_,B,0,VARIATION_1_IS_EASY;_2_IS_NORMAL"
"Cart.Addresses" "F0FE,F0FD,80"
""
"Cart.MD5" "72ffbef6504b75e69ee1045af9075f66"
"Cart.Manufacturer" "Atari, Richard Maurer - Sears"
"Cart.ModelNo" "CX2632 - 49-75153"
"Cart.Name" "Space Invaders (1980) (Atari)"
"Cart.Variations" "112"
"Cart.Formats" "4,0,B,0,D,1,_,B,0,ONLY_PLAYER_1_SUPPORTED"
"Cart.Addresses" "E6,E8,DC"
""
"Cart.MD5" "77057d9d14b99e465ea9e29783af0ae3"
"Cart.Manufacturer" "Activision, David Crane"
"Cart.ModelNo" "AG-001"
"Cart.Name" "Dragster (1980) (Activision)"
"Cart.Note" "AKA Drag Strip"
"Cart.Formats" "4,0,B,1,B,1"
"Cart.Addresses" "B3,B5,80,0"
""
"Cart.MD5" "7e52a95074a66640fcfde124fffd491a"
"Cart.Manufacturer" "Atari - GCC, Mike Feinstein, John Mracek"
"Cart.ModelNo" "CX2673"
"Cart.Name" "Phoenix (1983) (Atari)"
"Cart.Formats" "6"
"Cart.Addresses" "C9,C8,C7"
""
"Cart.MD5" "87e79cd41ce136fd4f72cc6e2c161bee"
"Cart.Manufacturer" "Atari - GCC, Mark Ackerman, Glenn Parker"
"Cart.ModelNo" "CX2675"
"Cart.Name" "Ms. Pac-Man (1983) (Atari)"
"Display.Phosphor" "YES"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,0,B,1,_,D,1,VARS_VALID_AT_GAME_OVER;_CHERRIES_=_VAR_#4"
"Cart.Addresses" "FA,F9,F8,F7,0"
""
"Cart.MD5" "91c2098e88a6b13f977af8c003e0bca5"
"Cart.Manufacturer" "Atari - GCC"
"Cart.ModelNo" "CX2676"
"Cart.Name" "Centipede (1983) (Atari)"
"Cart.Formats" "6,0,B,0,B,0,_,B,0,VARIATIONS_CANNOT_BE_DEFINED"
"Cart.Addresses" "F4,F5,F6"
""
"Cart.MD5" "91f0a708eeb93c133e9672ad2c8e0429"
"Cart.Name" "Oystron (V2.9) (Piero Cavina) (PD)"
"Cart.Rarity" "New Release"
"Cart.Variations" "3"
"Cart.Formats" "5,1,B,0,B,1"
"Cart.Addresses" "D4,D3,E5"
""
"Cart.MD5" "94b92a882f6dbaa6993a46e2dcc58402"
"Cart.Manufacturer" "Activision, Larry Miller"
"Cart.ModelNo" "AX-026, AX-026-04"
"Cart.Name" "Enduro (1983) (Activision)"
"Cart.Formats" "6,0,B,0,B,0,DAY"
"Cart.Addresses" "AA,A9,A8,0,AD"
""
"Cart.MD5" "9ad36e699ef6f45d9eb6c4cf90475c9f"
"Cart.Manufacturer" "Imagic, Dennis Koble"
"Cart.ModelNo" "720103-1A, 720103-1B, IA3203, IX-010-04"
"Cart.Name" "Atlantis (1982) (Imagic)"
"Cart.Note" "AKA Lost City of Atlantis"
"Cart.Rarity" "Uncommon"
"Cart.Variations" "4"
"Cart.Formats" "6,2,B,0,B,1"
"Cart.Addresses" "A3,A2,8D"
""
"Cart.MD5" "ab5bf1ef5e463ad1cbb11b6a33797228"
"Cart.Manufacturer" "Imagic, Rob Fulop"
"Cart.ModelNo" "720104-1A, 720104-1B, IA3204"
"Cart.Name" "Cosmic Ark (1982) (Imagic)"
"Cart.Variations" "6"
"Cart.Formats" "6"
"Cart.Addresses" "AE,B0,B2,BC"
""
"Cart.MD5" "ac7c2260378975614192ca2bc3d20e0b"
"Cart.Manufacturer" "Activision, David Crane"
"Cart.ModelNo" "AG-930-04, AZ-030"
"Cart.Name" "Decathlon (1983) (Activision)"
"Cart.Rarity" "Rare"
"Cart.Variations" "10"
"Cart.Formats" "4,0,B,0,D,1,_,B,0,DECATHLON_&_100M_DASH_SHARE_VARIATION_1"
"Cart.Addresses" "95,96,80,0"
""
"Cart.MD5" "be929419902e21bd7830a7a7d746195d"
"Cart.Manufacturer" "Activision, Garry Kitchen"
"Cart.ModelNo" "AX-025, AX-025-04"
"Cart.Name" "Keystone Kapers (1983) (Activision)"
"Cart.Formats" "6"
"Cart.Addresses" "9A,9B,9C"
""
"Cart.MD5" "c1cb228470a87beb5f36e90ac745da26"
"Cart.Manufacturer" "Activision, Bob Whitehead"
"Cart.ModelNo" "AX-015, AX-015-04"
"Cart.Name" "Chopper Command (1982) (Activision)"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,0,B,1"
"Cart.Addresses" "EC,EE,F0,E0"
""
"Cart.MD5" "c5930d0e8cdae3e037349bfa08e871be"
"Cart.Manufacturer" "Atari, Howard Scott Warshaw - Sears"
"Cart.ModelNo" "CX2655 - 49-75167"
"Cart.Name" "Yars' Revenge (1982) (Atari)"
"Display.Phosphor" "YES"
"Cart.Variations" "8"
"Cart.Formats" "6,0,B,0,B,1,_,B,0,VARIATIONS_ARE_LARGER_BY_1"
"Cart.Addresses" "E0,E1,E2,80"
""
"Cart.MD5" "c6556e082aac04260596b4045bc122de"
"Cart.Manufacturer" "Atari - GCC, Dave Payne"
"Cart.ModelNo" "CX2669"
"Cart.Name" "Vanguard (1983) (Atari)"
"Cart.Formats" "6,0,B,0,B,0,_,B,0,SCORE_IS_FOR_CURRENT_PLAYER"
"Cart.Addresses" "99,98,97"
""
"Cart.MD5" "ccbd36746ed4525821a8083b0d6d2c2c"
"Cart.Manufacturer" "Atari, Brad Stewart - Sears"
"Cart.ModelNo" "CX2649, 49-75163"
"Cart.Name" "Asteroids (1981) (Atari) [no copyright]"
"Cart.Rarity" "Common"
"Display.Phosphor" "YES"
"Cart.Variations" "66"
"Cart.Formats" "5,1,H,1,D,0,_,B,0,VARIATIONS_>_32_DIFFER_BY_1"
"Cart.Addresses" "BD,BE,80"
""
"Cart.MD5" "d69559f9c9dc6ef528d841bf9d91b275"
"Cart.Manufacturer" "Activision, Alan Miller"
"Cart.ModelNo" "AX-016"
"Cart.Name" "StarMaster (1982) (Activision)"
"Cart.Note" "Use Color/BW switch to change between galactic chart and front views"
"Cart.Variations" "4"
"Cart.Formats" "4,0,B,0,B,1,_,B,0,SCORE_ONLY_CALCULATED_WHEN_GAME_IS_OVER"
"Cart.Addresses" "C1,C2,80"
""
"Cart.MD5" "dd7884b4f93cab423ac471aa1935e3df"
"Cart.Manufacturer" "Atari, Brad Stewart - Sears"
"Cart.ModelNo" "CX2649, 49-75163"
"Cart.Name" "Asteroids (1981) (Atari)"
"Cart.Variations" "66"
"Cart.Formats" "5,1,H,1,D,0,_,B,0,VARIATIONS_>_32_DIFFER_BY_1"
"Cart.Addresses" "BD,BE,80"
""
"Cart.MD5" "dde55d9868911407fe8b3fefef396f00"
"Cart.Name" "Seawolf (2004) (Xype, Manuel Rotschkar)"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,0,B,0,_,B,0,USER_DEFINED_VARIATION_BASED_ON_SWITCHES"
"Cart.Addresses" "90,91,92,0,0"
""
"Cart.MD5" "f0e0addc07971561ab80d9abe1b8d333"
"Cart.Manufacturer" "Imagic, Rob Fulop"
"Cart.ModelNo" "720000-200, 720101-1B, 720101-1C, IA3200, IA3200C, IX-006-04"
"Cart.Name" "Demon Attack (1982) (Imagic)"
"Cart.Note" "AKA Death from Above"
"Cart.Variations" "10"
"Cart.Formats" "6,0,B,0,B,0,WAVE,B,1"
"Cart.Addresses" "81,83,85,EA,80"
""
"Cart.MD5" "f1489e27a4539a0c6c8529262f9f7e18"
"Cart.Manufacturer" "Champ Games"
"Cart.ModelNo" "CG-01-P"
"Cart.Name" "Lady Bug (PAL60)"
"Cart.Rarity" "Homebrew"
"Console.RightDiff" "A"
"Display.Format" "PAL60"
"Display.Phosphor" "YES"
"Cart.Variations" "3"
"Cart.Formats" "6,0,B,0,B,1,PART,D,1"
"Cart.Addresses" "8E,8D,8C,8A,89"
""
"Cart.MD5" "f34f08e5eb96e500e851a80be3277a56"
"Cart.Manufacturer" "Atari, Brad Stewart - Sears"
"Cart.ModelNo" "CX2622 - 6-99813, 49-75107"
"Cart.Name" "Breakout (1978) (Atari)"
"Cart.Note" "Uses the Paddle Controllers"
"Controller.MouseAxis" "01 60"
"Cart.Formats" "3,0,B,0,B,0,_,B,0,VARIATIONS_CANNOT_BE_DEFINED"
"Cart.Addresses" "CE,CD"
""
"Cart.MD5" "f8240e62d8c0a64a61e19388414e3104"
"Cart.Manufacturer" "Activision, Steve Cartwright"
"Cart.ModelNo" "AX-013"
"Cart.Name" "Barnstorming (1982) (Activision)"
"Cart.Rarity" "Uncommon"
"Cart.Variations" "4"
"Cart.Formats" "6,0,B,1,B,1"
"Cart.Addresses" "B5,B6,B7,80"
""
"Cart.MD5" "fca4a5be1251927027f2c24774a02160"
"Cart.Manufacturer" "Activision, John Van Ryzin"
"Cart.ModelNo" "AZ-036-04"
"Cart.Name" "H.E.R.O. (1984) (Activision)"
"Cart.Variations" "5"
"Cart.Formats" "6,0,B,0,B,1,LEVEL,D,1"
"Cart.Addresses" "B7,B8,B9,80,F5"
""

View File

@ -285,7 +285,7 @@ void DebuggerDialog::handleCommand(CommandSender* sender, int cmd,
getDynamicBounds(w, h);
myOptions = make_unique<OptionsDialog>(instance(), parent(), this, w, h,
Menu::AppMode::debugger);
OptionsMenu::AppMode::debugger);
}
myOptions->open();

View File

@ -38,7 +38,7 @@ class AmigaMouse : public PointingDevice
/**
Returns the name of this controller.
*/
string name() const override { return "AmigaMouse"; }
string name() const override { return "Amiga mouse"; }
protected:
uInt8 ioPortA(uInt8 countH, uInt8 countV, uInt8, uInt8) override

View File

@ -38,7 +38,7 @@ class AtariMouse : public PointingDevice
/**
Returns the name of this controller.
*/
string name() const override { return "AtariMouse"; }
string name() const override { return "Atari mouse"; }
protected:
uInt8 ioPortA(uInt8 countH, uInt8 countV, uInt8, uInt8) override

View File

@ -44,7 +44,7 @@ class BoosterGrip : public Joystick
/**
Returns the name of this controller.
*/
string name() const override { return "BoosterGrip"; }
string name() const override { return "Booster Grip"; }
private:
/**

View File

@ -301,7 +301,7 @@ class MovieInputs : public Serializable
// Automatically generated
// Several not used
#define addr_kernel_48 0x800
// #define addr_kernel_48 0x800
#define addr_transport_direction 0x880
#define addr_transport_buttons 0x894
#define addr_right_line 0x948
@ -317,7 +317,7 @@ class MovieInputs : public Serializable
#define addr_set_gcol7 0x96a
#define addr_set_gdata7 0x96e
#define addr_set_gcol8 0x972
#define addr_left_line 0x980
// #define addr_left_line 0x980
#define addr_set_gdata1 0x982
#define addr_set_gcol1 0x988
#define addr_set_aud_left 0x98c
@ -331,27 +331,27 @@ class MovieInputs : public Serializable
#define addr_set_gdata2 0x9a8
#define addr_set_gcol3 0x9ac
#define addr_pick_continue 0x9be
#define addr_main_start 0xa00
#define addr_aud_bank_setup 0xa0c
#define addr_tg0 0xa24
#define addr_title_again 0xa3b
#define addr_wait_cnt 0xa77
// #define addr_main_start 0xa00
// #define addr_aud_bank_setup 0xa0c
// #define addr_tg0 0xa24
// #define addr_title_again 0xa3b
// #define addr_wait_cnt 0xa77
#define addr_end_lines 0xa80
#define addr_set_aud_endlines 0xa80
#define addr_set_overscan_size 0xa9a
#define addr_set_vblank_size 0xab0
#define addr_pick_extra_lines 0xab9
#define addr_pick_transport 0xac6
#define addr_wait_lines 0xac9
#define addr_transport_done1 0xada
#define addr_draw_title 0xb00
// #define addr_wait_lines 0xac9
// #define addr_transport_done1 0xada
// #define addr_draw_title 0xb00
#define addr_title_loop 0xb50
#define addr_black_bar 0xb52
#define addr_animate_bar1 0xb58
#define addr_animate_bar_again1 0xb5a
#define addr_animate_dex1 0xb65
// #define addr_black_bar 0xb52
// #define addr_animate_bar1 0xb58
// #define addr_animate_bar_again1 0xb5a
// #define addr_animate_dex1 0xb65
#define addr_audio_bank 0xb80
#define addr_reset_loop 0xbfa
// #define addr_reset_loop 0xbfa
// scale adjustments, automatically generated
static constexpr uInt8 scale0[16] = {
@ -480,7 +480,7 @@ static constexpr uInt8 brightLabelEven[] = {
0, 49, 48, 12, 96,
6, 140, 231, 96, 0,
0, 225, 48, 12, 96,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
@ -497,7 +497,7 @@ static constexpr uInt8 brightLabelOdd[] = {
0, 113, 48, 12, 96,
7, 142, 127, 96, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
@ -514,7 +514,7 @@ static constexpr uInt8 volumeLabelEven[] = {
0, 12, 192, 15, 192,
30, 112, 119, 176, 0,
0, 7, 252, 12, 254,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};
@ -531,7 +531,7 @@ static constexpr uInt8 volumeLabelOdd[] = {
0, 14, 192, 13, 192,
14, 224, 62, 48, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0,
0, 0, 0, 0, 0
};

View File

@ -16,6 +16,7 @@
//============================================================================
#include <cassert>
#include <cmath>
#include "System.hxx"
#include "Control.hxx"
@ -107,10 +108,10 @@ string Controller::getName(const Type type)
static const std::array<string, int(Controller::Type::LastType)> NAMES =
{
"Unknown",
"AmigaMouse", "AtariMouse", "AtariVox", "BoosterGrip", "CompuMate",
"Driving", "Sega Genesis", "Joystick", "Keyboard", "KidVid", "MindLink",
"Paddles", "Paddles_IAxis", "Paddles_IAxDr", "SaveKey", "TrakBall",
"Lightgun", "QuadTari"
"Amiga mouse", "Atari mouse", "AtariVox", "Booster Grip", "CompuMate",
"Driving", "Sega Genesis", "Joystick", "Keyboard", "Kid Vid", "MindLink",
"Paddles", "Paddles_IAxis", "Paddles_IAxDr", "SaveKey", "Trak-Ball",
"Light Gun", "QuadTari"
};
return NAMES[int(type)];
@ -148,6 +149,41 @@ Controller::Type Controller::getType(const string& propName)
return Type::Unknown;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Controller::setDigitalDeadZone(int deadZone)
{
DIGITAL_DEAD_ZONE = digitalDeadZoneValue(deadZone);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Controller::digitalDeadZoneValue(int deadZone)
{
deadZone = BSPF::clamp(deadZone, MIN_DIGITAL_DEADZONE, MAX_DIGITAL_DEADZONE);
return 3200 + deadZone * 1000;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Controller::setAnalogDeadZone(int deadZone)
{
ANALOG_DEAD_ZONE = analogDeadZoneValue(deadZone);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Controller::analogDeadZoneValue(int deadZone)
{
deadZone = BSPF::clamp(deadZone, MIN_ANALOG_DEADZONE, MAX_ANALOG_DEADZONE);
return deadZone * std::round(32768 / 2. / MAX_DIGITAL_DEADZONE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Controller::setMouseSensitivity(int sensitivity)
{
MOUSE_SENSITIVITY = BSPF::clamp(sensitivity, MIN_MOUSE_SENSE, MAX_MOUSE_SENSE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Controller::setAutoFireRate(int rate, bool isNTSC)
{
@ -156,5 +192,7 @@ void Controller::setAutoFireRate(int rate, bool isNTSC)
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Controller::DIGITAL_DEAD_ZONE = 3200;
int Controller::ANALOG_DEAD_ZONE = 0;
int Controller::MOUSE_SENSITIVITY = -1;
int Controller::AUTO_FIRE_RATE = 0;

View File

@ -71,6 +71,13 @@ class Controller : public Serializable
friend class ControllerLowLevel;
public:
static constexpr int MIN_DIGITAL_DEADZONE = 0;
static constexpr int MAX_DIGITAL_DEADZONE = 29;
static constexpr int MIN_ANALOG_DEADZONE = 0;
static constexpr int MAX_ANALOG_DEADZONE = 29;
static constexpr int MIN_MOUSE_SENSE = 1;
static constexpr int MAX_MOUSE_SENSE = 20;
/**
Enumeration of the controller jacks
*/
@ -273,6 +280,43 @@ class Controller : public Serializable
*/
static Type getType(const string& propName);
/**
Sets the dead zone amount for real analog joysticks.
@param deadZone Value from 0 to 29
*/
static void setDigitalDeadZone(int deadZone);
/**
Sets the dead zone for analog paddles.
@param deadZone Value from 0 to 29
*/
static void setAnalogDeadZone(int deadZone);
/**
Retrieves the effective digital dead zone value
*/
static int digitalDeadZoneValue(int deadZone);
/**
Retrieves the effective analog dead zone value
*/
static int analogDeadZoneValue(int deadZone);
inline static int digitalDeadZone() { return DIGITAL_DEAD_ZONE; }
inline static int analogDeadZone() { return ANALOG_DEAD_ZONE; }
/**
Sets the sensitivity for analog emulation movement
using a mouse.
@param sensitivity Value from 1 to MAX_MOUSE_SENSE, with larger
values causing more movement
*/
static void setMouseSensitivity(int sensitivity);
/**
Sets the auto fire rate. 0 disables auto fire.
@ -366,6 +410,14 @@ class Controller : public Serializable
/// The callback that is dispatched whenver an analog pin has changed
onAnalogPinUpdateCallback myOnAnalogPinUpdateCallback{nullptr};
/// Defines the dead zone of analog joysticks for digital Atari controllers
static int DIGITAL_DEAD_ZONE;
/// Defines the dead zone of analog joysticks for analog Atari controllers
static int ANALOG_DEAD_ZONE;
static int MOUSE_SENSITIVITY;
/// Defines the speed of the auto fire
static int AUTO_FIRE_RATE;

View File

@ -86,8 +86,10 @@ Controller::Type ControllerDetector::autodetectPort(
{
if(usesPaddle(image, size, port, settings))
type = Controller::Type::Paddles;
else if(isProbablyKidVid(image, size, port))
type = Controller::Type::KidVid;
}
// TODO: BOOSTERGRIP, DRIVING, MINDLINK, ATARIVOX, KIDVID
// TODO: BOOSTERGRIP, DRIVING, COMPUMATE, MINDLINK, ATARIVOX
// not detectable: PADDLES_IAXIS, PADDLES_IAXDR
return type;
}
@ -728,3 +730,17 @@ bool ControllerDetector::isProbablyQuadTari(const ByteBuffer& image, size_t size
}
return false;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool ControllerDetector::isProbablyKidVid(const ByteBuffer& image, size_t size,
Controller::Jack port)
{
if(port == Controller::Jack::Right)
{
const int SIG_SIZE = 5;
uInt8 signature[SIG_SIZE] = {0xA9, 0x03, 0x8D, 0x81, 0x02};
return searchForBytes(image, size, signature, SIG_SIZE);
}
return false;
}

View File

@ -125,6 +125,9 @@ class ControllerDetector
static bool isProbablyQuadTari(const ByteBuffer& image, size_t size,
Controller::Jack port);
// Returns true if a Kid Vid code pattern is found.
static bool isProbablyKidVid(const ByteBuffer& image, size_t size,
Controller::Jack port);
private:
// Following constructors and assignment operators not supported
ControllerDetector() = delete;

View File

@ -223,7 +223,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "0dfbdadf8f1bc718e7e1bb3ccd5fef3d", "", "", "Mr. Pac-Man (New start tune) (El Destructo)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "0e0808227ef41f6825c06f25082c2e56", "", "", "Candi (Hack) [a]", "Hack of Space Invaders", "Hack", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"notes\":\"Only player 1 supported\",\"score_addresses\":[\"0xe6\",\"0xe8\"],\"variations_address\":\"0xdc\",\"variations_bcd\":false,\"variations_bcd_A\":false,\"variations_count\":112,\"variations_zero_based\":true}", "" },
{ "0e08cd2c5bcf11c6a7e5a009a7715b6a", "", "", "Boing! (PD) [a1]", "", "New Release", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "0e224ea74310da4e7e2103400eb1b4bf", "Atari, Peter C. Niday, Gary Shannon, Howard Scott Warshaw", "", "Mind Maze (10-10-1984) (Atari) (Prototype)", "Uses the MindLink controller", "Prototype", "", "", "", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/mindmaze/mindmaze.htm" },
{ "0e224ea74310da4e7e2103400eb1b4bf", "Atari, Peter C. Niday, Gary Shannon, Howard Scott Warshaw", "", "Mind Maze (10-10-1984) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/mindmaze/mindmaze.htm" },
{ "0e23d0ed4c33b2011ab4cc93a7619683", "Thomas Jentzsch", "", "Centipede - Amiga Mouse Hack v1.4 (PAL60) (Half-Speed) (TJ)", "Uses Amiga Mouse Controller", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"notes\":\"Variations cannot be defined\",\"score_addresses\":[\"0xf4\",\"0xf5\",\"0xf6\"],\"score_digits\":6,\"variations_count\":1}", "https://atariage.com/store/index.php?l=product_detail&p=1180" },
{ "0e4b2b6e014a93ef8be896823da0d4ec", "", "", "Skiing (208 in 1) (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "0e713d4e272ea7322c5b27d645f56dd0", "Home Vision - Gem International Corp. - VDI", "VCS83105", "Panda Chase (1983) (Home Vision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -268,7 +268,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "10c47acca2ecd212b900ad3cf6942dbb", "Atari - Axlon, Tod Frye - Heuristica, Agustin Ortiz", "CX26169", "Shooting Arcade (03-07-1989) (Atari) (Prototype) [a4]", "Uses the Light Gun Controller (left only)", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/shootingarcade/shootingarcade.htm" },
{ "10c8cfd8c37522f11d47540ff024e5f9", "Canal 3 - Intellivision", "C 3016", "Demon Attack (Canal 3)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"score_addresses\":[\"0x81\",\"0x83\",\"0x85\"],\"score_digits\":6,\"special_address\":\"0x80\",\"special_label\":\"Wave\",\"special_zero_based\":true,\"variations_address\":\"0xea\",\"variations_count\":10}", "" },
{ "10eae73a07b3da044b72473d8d366267", "Funvision - Fund. Int'l Co.", "", "Karate (1982) (Funvision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "10f0ecaf962aef1fc28abed870b01b65", "Atari, Paul Donaldson", "", "Bionic Breakthrough (06-22-1984) (Atari) (Prototype)", "Uses the Mindlink Controller", "Prototype", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/bionic/bionic.htm" },
{ "10f0ecaf962aef1fc28abed870b01b65", "Atari, Paul Donaldson", "", "Bionic Breakthrough (06-22-1984) (Atari) (Prototype)", "Uses MindLink Controller", "Prototype", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/bionic/bionic.htm" },
{ "10f62443f1ae087dc588a77f9e8f43e9", "Atari, Carla Meninsky", "CX2637, CX2637P", "Dodge 'Em (1980) (Atari) (PAL) [fixed]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "110ac8ecaf1b69f41bc94c59dfcb8b2d", "", "", "Demon Attack (Unknown)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"score_addresses\":[\"0x81\",\"0x83\",\"0x85\"],\"score_digits\":6,\"special_address\":\"0x80\",\"special_label\":\"Wave\",\"special_zero_based\":true,\"variations_address\":\"0xea\",\"variations_count\":10}", "" },
{ "111029770226b319524134193886a10e", "Hozer Video Games", "", "Gunfight 2600 - One Limit Reached! (2001) (MP)", "", "New Release", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -880,7 +880,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "3d48b8b586a09bdbf49f1a016bf4d29a", "Video Game Cartridge - Ariola", "TP-606", "Hole Hunter (Video Game Cartridge)", "AKA Topy", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d6fc7a19be76d808aa233415cb583fc", "CCE", "C-833", "Target Practice (1983) (CCE)", "AKA Carnival", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d7749fb9c2f91a276dfe494495234c5", "Jone Yuan Telephonic Enterprise Co", "", "Checkers (Jone Yuan)", "2600 Screen Search Console", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d7aad37c55692814211c8b590a0334c", "Atari, Dan Oliver", "", "Telepathy (1983) (Atari) (Prototype)", "Uses both left joystick and right Mindlink controllers (press Fire on respective controller to begin)", "Prototype", "", "", "", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "78", "", "", "", "", "", "http://www.atariprotos.com/2600/software/telepathy/telepathy.htm" },
{ "3d7aad37c55692814211c8b590a0334c", "Atari, Dan Oliver", "", "Telepathy (1983) (Atari) (Prototype)", "Uses both left joystick and right MindLink controllers (press Fire on respective controller to begin)", "Prototype", "", "", "", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "78", "", "", "", "", "", "http://www.atariprotos.com/2600/software/telepathy/telepathy.htm" },
{ "3d8a2d6493123a53ade45e3e2c5cafa0", "Atari, Jim Huether - Sears", "CX2629 - 6-99843, 49-75118", "Sky Diver (1979) (Atari) (4K)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "3d934bb980e2e63e1ead3e7756928ccd", "Activision, Steve Cartwright - Ariola", "EAX-017, EAX-017-04I - 711 017-720", "MegaMania (1982) (Activision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"score_addresses\":[\"0xdb\",\"0xdc\",\"0xdd\"],\"score_digits\":6,\"variations_address\":\"0x80\",\"variations_count\":4,\"variations_zero_based\":true}", "" },
{ "3d9c2fccf8b11630762ff00811c19277", "", "", "Challenge of.... Nexar, The (Unknown) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -1168,7 +1168,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "524693b337f7ecc9e8b9126e04a232af", "", "", "Euchre (19-08-2001) (Eric Eid) (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "5256f68d1491986aae5cfdff539bfeb5", "Atari - GCC, Mark Ackerman, Noellie Alito", "CX2692", "Moon Patrol (07-26-1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/moonpatrol/moonpatrol.htm" },
{ "525ea747d746f3e80e3027720e1fa7ac", "Activision, Garry Kitchen - Ariola", "EAZ-032 - 771 032-712", "Pressure Cooker (1983) (Activision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "525f2dfc8b21b0186cff2568e0509bfc", "Activision, David Crane", "AG-930-04, AZ-030", "Decathlon (1983) (Activision) [fixed]", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"notes\":\"Decathlon & 100m dash share variation 1\",\"score_addresses\":[\"0x95\",\"0x96\"],\"variations_address\":\"0x80\",\"variations_bcd\":false,\"variations_count\":10,\"variations_zero_based\":true}", "" },
{ "525f2dfc8b21b0186cff2568e0509bfc", "Activision, David Crane", "AG-930-04, AZ-030", "Decathlon (1983) (Activision) [fixed]", "", "", "", "", "", "", "", "", "", "", "", "", "PADDLES", "", "", "", "", "", "", "", "", "", "", "{\"notes\":\"Decathlon & 100m dash share variation 1\",\"score_addresses\":[\"0x95\",\"0x96\"],\"variations_address\":\"0x80\",\"variations_bcd\":false,\"variations_count\":10,\"variations_zero_based\":true}", "" },
{ "52615ae358a68de6e76467e95eb404c7", "", "", "DJdsl-wopd (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "", "", "" },
{ "528400fad9a77fd5ad7fc5fdc2b7d69d", "Starpath Corporation, Stephen H. Landrum, Jon Leupp", "11 AR-4201", "Sword of Saros (1983) (Starpath)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "52a0003efb3b1c49fcde4dbc2c685d8f", "Atari, Alan Miller - Sears", "CX2641 - 99807, 49-75105", "Surround (1977) (Atari) (4K) [a]", "", "", "", "", "2K", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -2246,7 +2246,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "a1ca372388b6465a693e4626cc98b865", "Quelle", "176.543 7", "Der Vielfrass (1983) (Quelle) (PAL)", "AKA Fast Food", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "a1ead9c181d67859aa93c44e40f1709c", "American Videogame - Dunhill Electronics, Darrell Wagner, Todd Clark Holm, John Simonds", "", "Tax Avoiders (1986) (American Videogame)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "a1f9159121142d42e63e6fb807d337aa", "Quelle - Otto Versand", "700.223 1 - 781627", "Der moderne Ritter (1983) (Quelle) (PAL)", "AKA Fast Eddie", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "a204cd4fb1944c86e800120706512a64", "Coleco, Rob Harris", "2511", "Smurfs Save the Day (1983) (Coleco)", "Uses the Kid Vid Controller", "", "", "", "", "", "", "", "", "", "", "", "KIDVID", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "a204cd4fb1944c86e800120706512a64", "Coleco, Rob Harris", "2511", "Smurfs Save the Day (1983) (Coleco)", "Uses the Kid Vid Voice Module", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "a20b7abbcdf90fbc29ac0fafa195bd12", "Quelle - Otto Versand", "719.383 2 - 649635, 781393, 781784, 986404", "Motocross (1983) (Quelle) (PAL)", "AKA Motorcross", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "a20d931a8fddcd6f6116ed21ff5c4832", "Apollo - Games by Apollo, Ed Salvo, Byron Parks", "AP-2003", "Racquetball (1982) (Apollo)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "", "", "" },
{ "a2170318a8ef4b50a1b1d38567c220d6", "Amiga - Video Soft", "3125", "Surf's Up (1983) (Amiga) (Prototype) [a1]", "Uses the Joyboard controller", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/surfsup/surfsup.htm" },
@ -2391,7 +2391,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "ac3dd22dd945724be705ddd2785487c2", "Atari - GCC, Mark Ackerman, Noellie Alito", "CX2692", "Moon Patrol (06-15-1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/moonpatrol/moonpatrol.htm" },
{ "ac53b83e1b57a601eeae9d3ce1b4a458", "Retroactive", "", "Qb (2.15) (Retroactive) (NTSC)", "", "New Release", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "", "{\"score_addresses\":[\"0xe6\",\"0xe5\",\"0xe4\"],\"score_digits\":6,\"variations_count\":1}", "https://atariage.com/store/index.php?l=product_detail&p=926" },
{ "ac5f78bae0638cf3f2a0c8d07eb4df69", "", "", "Minesweeper (V.99) (Soren Gust) (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "ac7c2260378975614192ca2bc3d20e0b", "Activision, David Crane", "AG-930-04, AZ-030", "Decathlon (1983) (Activision)", "", "Rare", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "{\"notes\":\"Decathlon & 100m dash share variation 1\",\"score_addresses\":[\"0x95\",\"0x96\"],\"variations_address\":\"0x80\",\"variations_bcd\":false,\"variations_count\":10,\"variations_zero_based\":true}", "" },
{ "ac7c2260378975614192ca2bc3d20e0b", "Activision, David Crane", "AG-930-04, AZ-030", "Decathlon (1983) (Activision)", "", "Rare", "", "", "", "", "", "", "", "", "", "", "PADDLES", "", "", "", "", "", "", "", "", "", "", "{\"notes\":\"Decathlon & 100m dash share variation 1\",\"score_addresses\":[\"0x95\",\"0x96\"],\"variations_address\":\"0x80\",\"variations_bcd\":false,\"variations_count\":10,\"variations_zero_based\":true}", "" },
{ "ac9adbd6de786a242e19d4bec527982b", "Activision, Alan Miller - Ariola", "EAG-012-04I, EAX-012, EAX-012-04B - 711 012-720", "Ice Hockey (1981) (Activision) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "aca09ffea77174b148b96b205109db4d", "Activision, Alan Miller", "AG-007, CAG-007", "Tennis (1981) (Activision) (4K)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "acaa27d214039d89d7031609aafa55c3", "", "", "Sprite Demo 6 (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -3285,7 +3285,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "ee456542b93fa8d7e6a8c689b5a0413c", "", "", "Chronocolor Donkey Kong Clean (PD)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "ee4c186123d31a279ed7a84d3578df23", "Atari, Carol Shaw, Nick 'Sandy Maiwald' Turner", "CX2608", "Super Breakout (1982 - 1981) (Atari) (PAL)", "Uses the Paddle Controllers (left only)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "01 45", "", "", "", "", "{\"score_addresses\":[\"0xdc\",\"0xdd\"],\"variations_address\":\"0xc0\",\"variations_count\":9}", "" },
{ "ee659ae50e9df886ac4f8d7ad10d046a", "Exus Corporation", "", "Video Reflex (1983) (Exus)", "AKA Foot Craz", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "ee6665683ebdb539e89ba620981cb0f6", "Coleco", "2658", "Berenstain Bears (1983) (Coleco)", "Uses the KidVid Controller", "Unbelievably Rare", "", "", "", "A", "", "", "", "", "", "", "KIDVID", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "ee6665683ebdb539e89ba620981cb0f6", "Coleco", "2658", "Berenstain Bears (1983) (Coleco)", "Uses the Kid Vid Voice Module", "Unbelievably Rare", "", "", "", "A", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "ee67dc0b01746372d2b983d88f48e24f", "", "", "Scroller Demo (02-01-2003) (CT)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "ee681f566aad6c07c61bbbfc66d74a27", "Activision", "", "Unknown Activision Game (10-29-1982) (Activision) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/unknown1/unknown1.htm" },
{ "ee6cbedf6c0aac90faa0a8dbc093ffbe", "CCE", "", "My Golf (CCE) (PAL)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
@ -3315,7 +3315,7 @@ static const BSPF::array2D<const char*, DEF_PROPS_SIZE, 29> DefProps = {{
{ "f04ee80011d95798006378643650aaa7", "Atari, Bill Aspromonte, John Russell, Michael Sierchio, Robert Zdybel", "CX26114", "Pigs in Space (1983) (Atari) (Prototype)", "", "Prototype", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/pigsinspace/pigsinspace.htm" },
{ "f0510abbfbe24ead552e92e3841f63f3", "Thomas Jentzsch", "", "Reactor - Atari Mouse Hack v1.3 (NTSC) (Full-Speed) (TJ)", "Uses Atari Mouse Controller", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "https://atariage.com/store/index.php?l=product_detail&p=1186" },
{ "f0536303f49006806bac3aec15738336", "Arcadia Corporation, Dennis Caswell", "AR-4200", "Escape from the Mindmaster (4 of 4) (1982) (Arcadia)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "f0541d2f7cda5ec7bab6d62b6128b823", "Atari, Paul Donaldson", "", "Bionic Breakthrough (1984) (Atari) (Prototype)", "Uses Mindlink Controller (left only)", "Prototype", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/bionic/bionic.htm" },
{ "f0541d2f7cda5ec7bab6d62b6128b823", "Atari, Paul Donaldson", "", "Bionic Breakthrough (1984) (Atari) (Prototype)", "Uses MindLink Controller", "Prototype", "", "", "", "", "", "", "", "MINDLINK", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "http://www.atariprotos.com/2600/software/bionic/bionic.htm" },
{ "f060826626aac9e0d8cda0282f4b7fc3", "Atari, David Crane - Sears", "CX2605 - 6-99822, 49-75109", "Outlaw (1978) (Atari) (4K)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },
{ "f0631c6675033428238408885d7e4fde", "Paul Slocum", "", "Test Cart (2002) (Paul Slocum)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "YES", "", "", "https://atariage.com/store/index.php?l=product_detail&p=102" },
{ "f066bea7ab0a37b83c83c924a87c5b67", "", "", "Air Raiders (1982) (Unknown)", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" },

View File

@ -147,7 +147,9 @@ class Event
HighScoresMenuMode,
// Input settings
DecreaseDeadzone, IncreaseDeadzone,
DecAnalogDeadzone, IncAnalogDeadzone,
DecAnalogSense, IncAnalogSense,
DecAnalogLinear, IncAnalogLinear,
DecDejtterAveraging, IncDejtterAveraging,
DecDejtterReaction, IncDejtterReaction,
DecDigitalSense, IncDigitalSense,

View File

@ -28,6 +28,7 @@
#include "OSystem.hxx"
#include "Joystick.hxx"
#include "Paddles.hxx"
#include "MindLink.hxx"
#include "Lightgun.hxx"
#include "PointingDevice.hxx"
#include "Driving.hxx"
@ -57,7 +58,7 @@
#include "DebuggerParser.hxx"
#endif
#ifdef GUI_SUPPORT
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "CommandMenu.hxx"
#include "HighScoresMenu.hxx"
#include "MessageMenu.hxx"
@ -98,11 +99,14 @@ void EventHandler::initialize()
setActionMappings(EventMode::kEmulationMode);
setActionMappings(EventMode::kMenuMode);
Joystick::setDeadZone(myOSystem.settings().getInt("joydeadzone"));
Controller::setDigitalDeadZone(myOSystem.settings().getInt("joydeadzone"));
Controller::setAnalogDeadZone(myOSystem.settings().getInt("adeadzone"));
Paddles::setAnalogLinearity(myOSystem.settings().getInt("plinear"));
Paddles::setDejitterDiff(myOSystem.settings().getInt("dejitter.diff"));
Paddles::setDejitterBase(myOSystem.settings().getInt("dejitter.base"));
Paddles::setDejitterDiff(myOSystem.settings().getInt("dejitter.diff"));
Paddles::setDigitalSensitivity(myOSystem.settings().getInt("dsense"));
Paddles::setMouseSensitivity(myOSystem.settings().getInt("msense"));
Controller::setMouseSensitivity(myOSystem.settings().getInt("msense"));
PointingDevice::setSensitivity(myOSystem.settings().getInt("tsense"));
Driving::setSensitivity(myOSystem.settings().getInt("dcsense"));
Controller::setAutoFireRate(myOSystem.settings().getInt("autofirerate"));
@ -455,7 +459,9 @@ bool EventHandler::skipInputSetting() const
&& (myAdjustSetting == AdjustSetting::DEADZONE
|| myAdjustSetting == AdjustSetting::FOUR_DIRECTIONS))
|| (!paddle
&& (myAdjustSetting == AdjustSetting::ANALOG_SENSITIVITY
&& (myAdjustSetting == AdjustSetting::ANALOG_DEADZONE
|| myAdjustSetting == AdjustSetting::ANALOG_SENSITIVITY
|| myAdjustSetting == AdjustSetting::ANALOG_LINEARITY
|| myAdjustSetting == AdjustSetting::DEJITTER_AVERAGING
|| myAdjustSetting == AdjustSetting::DEJITTER_REACTION
|| myAdjustSetting == AdjustSetting::DIGITAL_SENSITIVITY
@ -590,8 +596,10 @@ AdjustFunction EventHandler::getAdjustSetting(AdjustSetting setting)
std::bind(&Console::toggleInter, &myOSystem.console(), _1),
// *** Input settings ***
std::bind(&PhysicalJoystickHandler::changeDeadzone, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changeDigitalDeadZone, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changeAnalogPaddleDeadZone, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changeAnalogPaddleSensitivity, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changeAnalogPaddleLinearity, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changePaddleDejitterAveraging, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changePaddleDejitterReaction, &joyHandler(), _1),
std::bind(&PhysicalJoystickHandler::changeDigitalPaddleSensitivity, &joyHandler(), _1),
@ -1356,7 +1364,7 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated)
case Event::DecreaseDeadzone:
if(pressed)
{
myPJoyHandler->changeDeadzone(-1);
myPJoyHandler->changeDigitalDeadZone(-1);
myAdjustSetting = AdjustSetting::DEADZONE;
myAdjustActive = true;
}
@ -1365,17 +1373,35 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated)
case Event::IncreaseDeadzone:
if(pressed)
{
myPJoyHandler->changeDeadzone(+1);
myPJoyHandler->changeDigitalDeadZone(+1);
myAdjustSetting = AdjustSetting::DEADZONE;
myAdjustActive = true;
}
return;
case Event::DecAnalogDeadzone:
if(pressed)
{
myPJoyHandler->changeAnalogPaddleDeadZone(-1);
myAdjustSetting = AdjustSetting::ANALOG_DEADZONE;
myAdjustActive = true;
}
return;
case Event::IncAnalogDeadzone:
if(pressed)
{
myPJoyHandler->changeAnalogPaddleDeadZone(+1);
myAdjustSetting = AdjustSetting::ANALOG_DEADZONE;
myAdjustActive = true;
}
return;
case Event::DecAnalogSense:
if(pressed)
{
myPJoyHandler->changeAnalogPaddleSensitivity(-1);
myAdjustSetting = AdjustSetting::PADDLE_SENSITIVITY;
myAdjustSetting = AdjustSetting::ANALOG_SENSITIVITY;
myAdjustActive = true;
}
return;
@ -1384,10 +1410,27 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated)
if(pressed)
{
myPJoyHandler->changeAnalogPaddleSensitivity(+1);
myAdjustSetting = AdjustSetting::PADDLE_SENSITIVITY;
myAdjustSetting = AdjustSetting::ANALOG_SENSITIVITY;
myAdjustActive = true;
}
return;
case Event::DecAnalogLinear:
if(pressed)
{
myPJoyHandler->changeAnalogPaddleLinearity(-1);
myAdjustSetting = AdjustSetting::ANALOG_LINEARITY;
myAdjustActive = true;
}
return;
case Event::IncAnalogLinear:
if(pressed)
{
myPJoyHandler->changeAnalogPaddleLinearity(+1);
myAdjustSetting = AdjustSetting::ANALOG_LINEARITY;
myAdjustActive = true;
}
return;
case Event::DecDejtterAveraging:
@ -2991,7 +3034,7 @@ void EventHandler::setState(EventHandlerState state)
#ifdef GUI_SUPPORT
case EventHandlerState::OPTIONSMENU:
myOverlay = &myOSystem.menu();
myOverlay = &myOSystem.optionsMenu();
enableTextEvents(true);
break;
@ -3040,11 +3083,11 @@ void EventHandler::setState(EventHandlerState state)
}
// Inform various subsystems about the new state
myOSystem.stateChanged(myState);
myOSystem.frameBuffer().stateChanged(myState);
myOSystem.frameBuffer().setCursorState();
myOSystem.stateChanged(myState); // does nothing
myOSystem.frameBuffer().stateChanged(myState); // ignores state
myOSystem.frameBuffer().setCursorState(); // en/disables cursor for UI and emulation states
if(myOSystem.hasConsole())
myOSystem.console().stateChanged(myState);
myOSystem.console().stateChanged(myState); // does nothing
// Sometimes an extraneous mouse motion event is generated
// after a state change, which should be supressed
@ -3279,11 +3322,14 @@ EventHandler::EmulActionList EventHandler::ourEmulActionList = { {
{ Event::VolumeDecrease, "Decrease volume", "" },
{ Event::VolumeIncrease, "Increase volume", "" },
{ Event::DecreaseDeadzone, "Decrease joystick deadzone", "" },
{ Event::IncreaseDeadzone, "Increase joystick deadzone", "" },
{ Event::DecreaseDeadzone, "Decrease digital dead zone", "" },
{ Event::IncreaseDeadzone, "Increase digital dead zone", "" },
{ Event::DecAnalogDeadzone, "Decrease analog dead zone", "" },
{ Event::IncAnalogDeadzone, "Increase analog dead zone", "" },
{ Event::DecAnalogSense, "Decrease analog paddle sensitivity", "" },
{ Event::IncAnalogSense, "Increase analog paddle sensitivity", "" },
{ Event::DecAnalogLinear, "Decrease analog paddle linearity", "" },
{ Event::IncAnalogLinear, "Increase analog paddle linearity", "" },
{ Event::DecDejtterAveraging, "Decrease paddle dejitter averaging", "" },
{ Event::IncDejtterAveraging, "Increase paddle dejitter averaging", "" },
{ Event::DecDejtterReaction, "Decrease paddle dejitter reaction", "" },
@ -3467,7 +3513,9 @@ const Event::EventSet EventHandler::KeyboardEvents = {
const Event::EventSet EventHandler::DevicesEvents = {
Event::DecreaseDeadzone, Event::IncreaseDeadzone,
Event::DecAnalogDeadzone, Event::IncAnalogDeadzone,
Event::DecAnalogSense, Event::IncAnalogSense,
Event::DecAnalogLinear, Event::IncAnalogLinear,
Event::DecDejtterAveraging, Event::IncDejtterAveraging,
Event::DecDejtterReaction, Event::IncDejtterReaction,
Event::DecDigitalSense, Event::IncDigitalSense,

View File

@ -473,7 +473,9 @@ class EventHandler
INTERPOLATION,
// *** Input group ***
DEADZONE,
ANALOG_DEADZONE,
ANALOG_SENSITIVITY,
ANALOG_LINEARITY,
DEJITTER_AVERAGING,
DEJITTER_REACTION,
DIGITAL_SENSITIVITY,
@ -645,7 +647,7 @@ class EventHandler
#else
REFRESH_SIZE = 0,
#endif
EMUL_ACTIONLIST_SIZE = 212 + PNG_SIZE + COMBO_SIZE + REFRESH_SIZE,
EMUL_ACTIONLIST_SIZE = 216 + PNG_SIZE + COMBO_SIZE + REFRESH_SIZE,
MENU_ACTIONLIST_SIZE = 19
;

View File

@ -51,7 +51,7 @@
#include "ConsoleFont.hxx"
#include "ConsoleBFont.hxx"
#include "Launcher.hxx"
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "CommandMenu.hxx"
#include "HighScoresMenu.hxx"
#include "MessageMenu.hxx"
@ -379,19 +379,19 @@ void FrameBuffer::update(UpdateMode mode)
#ifdef GUI_SUPPORT
case EventHandlerState::OPTIONSMENU:
{
myOSystem.menu().tick();
redraw |= myOSystem.menu().needsRedraw();
myOSystem.optionsMenu().tick();
redraw |= myOSystem.optionsMenu().needsRedraw();
if(redraw)
{
clear();
myTIASurface->render(true);
myOSystem.menu().draw(forceRedraw);
myOSystem.optionsMenu().draw(forceRedraw);
}
else if(rerender)
{
clear();
myTIASurface->render(true);
myOSystem.menu().render();
myOSystem.optionsMenu().render();
}
break; // EventHandlerState::OPTIONSMENU
}

View File

@ -45,7 +45,7 @@ class Genesis : public Joystick
/**
Returns the name of this controller.
*/
string name() const override { return "Genesis"; }
string name() const override { return "Sega Genesis"; }
private:
/**

View File

@ -157,20 +157,3 @@ bool Joystick::setMouseControl(
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Joystick::setDeadZone(int deadzone)
{
_DEAD_ZONE = deadZoneValue(deadzone);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Joystick::deadZoneValue(int deadzone)
{
deadzone = BSPF::clamp(deadzone, DEAD_ZONE_MIN, DEAD_ZONE_MAX);
return 3200 + deadzone * 1000;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
int Joystick::_DEAD_ZONE = 3200;

View File

@ -29,9 +29,6 @@
class Joystick : public Controller
{
public:
static constexpr int DEAD_ZONE_MIN = 0;
static constexpr int DEAD_ZONE_MAX = 29;
/**
Create a new joystick controller plugged into the specified jack
@ -88,19 +85,6 @@ class Joystick : public Controller
bool setMouseControl(
Controller::Type xtype, int xid, Controller::Type ytype, int yid) override;
/**
Sets the deadzone amount for real analog joysticks.
Technically, this isn't really used by the Joystick class at all,
but it seemed like the best place to put it.
*/
static void setDeadZone(int deadzone);
/**
Retrieves the effective deadzone value
*/
static int deadZoneValue(int deadzone);
inline static int deadzone() { return _DEAD_ZONE; }
protected:
/**
Update the button pin states.
@ -123,8 +107,6 @@ class Joystick : public Controller
// Controller to emulate in normal mouse axis mode
int myControlID{-1};
static int _DEAD_ZONE;
private:
/**
Update the axes pin states according to the keyboard

View File

@ -66,7 +66,7 @@ class Lightgun : public Controller
/**
Returns the name of this controller.
*/
string name() const override { return "Lightgun"; }
string name() const override { return "Light Gun"; }
private:
const FrameBuffer& myFrameBuffer;

View File

@ -22,10 +22,6 @@
MindLink::MindLink(Jack jack, const Event& event, const System& system)
: Controller(jack, event, system, Controller::Type::MindLink)
{
setPin(DigitalPin::One, true);
setPin(DigitalPin::Two, true);
setPin(DigitalPin::Three, true);
setPin(DigitalPin::Four, true);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -39,19 +35,16 @@ void MindLink::update()
if(!myMouseEnabled)
return;
myMindlinkPos = (myMindlinkPos & 0x3fffffff) +
(myEvent.get(Event::MouseAxisXMove) << 3);
if(myMindlinkPos < 0x2800)
myMindlinkPos = 0x2800;
if(myMindlinkPos >= 0x3800)
myMindlinkPos = 0x3800;
myMindlinkShift = 1;
nextMindlinkBit();
myMindlinkPos = BSPF::clamp((myMindlinkPos & ~CALIBRATE_FLAG) +
myEvent.get(Event::MouseAxisXMove) * MOUSE_SENSITIVITY,
MIN_POS, MAX_POS);
if(myEvent.get(Event::MouseButtonLeftValue) ||
myEvent.get(Event::MouseButtonRightValue))
myMindlinkPos |= 0x4000; // this bit starts a game
myMindlinkPos = CALIBRATE_FLAG; // flag starts game & calibates
myMindlinkShift = 1; // start transfer with least significant bit
nextMindlinkBit();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -63,8 +56,8 @@ void MindLink::nextMindlinkBit()
setPin(DigitalPin::Four, false);
if(myMindlinkPos & myMindlinkShift)
setPin(DigitalPin::Four, true);
myMindlinkShift <<= 1;
}
myMindlinkShift <<= 1; // next bit
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -79,3 +72,4 @@ bool MindLink::setMouseControl(
(xid != -1 || yid != -1);
return true;
}

View File

@ -35,7 +35,7 @@
the Stella core actually stores this information in boolean arrays
addressable by DigitalPin number.
@author Stephen Anthony & z26 team
@author Stephen Anthony, Thomas Jentzsch & z26 team
*/
class MindLink : public Controller
{
@ -104,10 +104,15 @@ class MindLink : public Controller
private:
void nextMindlinkBit();
// Range of valid values
static constexpr int MIN_POS = 0x2700;
static constexpr int MAX_POS = 0x3e00;
static constexpr int CALIBRATE_FLAG = 0x8000; // this causes a left side calibration
private:
// Position value in Mindlink controller
// Gets transferred bitwise (16 bits)
int myMindlinkPos{0x2800};
int myMindlinkPos{MIN_POS};
// Which bit to transfer next
int myMindlinkShift{1};

View File

@ -31,7 +31,7 @@
#include "Debugger.hxx"
#endif
#ifdef GUI_SUPPORT
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "CommandMenu.hxx"
#include "HighScoresMenu.hxx"
#include "MessageMenu.hxx"
@ -177,7 +177,7 @@ bool OSystem::initialize(const Settings::Options& options)
#ifdef GUI_SUPPORT
// Create various subsystems (menu and launcher GUI objects, etc)
myMenu = make_unique<Menu>(*this);
myOptionsMenu = make_unique<OptionsMenu>(*this);
myCommandMenu = make_unique<CommandMenu>(*this);
myHighScoresManager = make_unique<HighScoresManager>(*this);
myHighScoresMenu = make_unique<HighScoresMenu>(*this);
@ -510,7 +510,7 @@ string OSystem::createConsole(const FilesystemNode& rom, const string& md5sum,
}
// Check for first PlusROM start
if(myConsole->cartridge().isPlusROM() &&
settings().getString("plusroms.nick") == EmptyString)
settings().getString("plusroms.id") == EmptyString)
{
myEventHandler->changeStateByEvent(Event::PlusRomsSetupMode);
}

View File

@ -40,7 +40,7 @@ class AudioSettings;
class CommandMenu;
class HighScoresMenu;
class Launcher;
class Menu;
class OptionsMenu;
class MessageMenu;
class PlusRomsMenu;
class TimeMachine;
@ -200,11 +200,11 @@ class OSystem
#ifdef GUI_SUPPORT
/**
Get the settings menu of the system.
Get the option menu of the system.
@return The settings menu object
@return The option menu object
*/
Menu& menu() const { return *myMenu; }
OptionsMenu& optionsMenu() const { return *myOptionsMenu; }
/**
Get the command menu of the system.
@ -516,8 +516,8 @@ class OSystem
#endif
#ifdef GUI_SUPPORT
// Pointer to the Menu object
unique_ptr<Menu> myMenu;
// Pointer to the OptionMenu object
unique_ptr<OptionsMenu> myOptionsMenu;
// Pointer to the CommandMenu object
unique_ptr<CommandMenu> myCommandMenu;

View File

@ -25,8 +25,8 @@ Paddles::Paddles(Jack jack, const Event& event, const System& system,
bool swappaddle, bool swapaxis, bool swapdir, bool altmap)
: Controller(jack, event, system, Controller::Type::Paddles)
{
// We must start with minimum resistance; see commit
// 38b452e1a047a0dca38c5bcce7c271d40f76736e for more information
// We must start with a physical valid resistance (e.g. 0);
// see commit 38b452e1a047a0dca38c5bcce7c271d40f76736e for more information
setPin(AnalogPin::Five, AnalogReadout::connectToVcc());
setPin(AnalogPin::Nine, AnalogReadout::connectToVcc());
@ -195,10 +195,65 @@ void Paddles::update()
setPin(DigitalPin::Three, !getAutoFireStateP1(firePressedB));
}
AnalogReadout::Connection Paddles::getReadOut(int lastAxis, int& newAxis, int center)
{
const float range = ANALOG_RANGE - analogDeadZone() * 2;
// dead zone, ignore changes inside the dead zone
if(newAxis > analogDeadZone())
newAxis -= analogDeadZone();
else if(newAxis < -analogDeadZone())
newAxis += analogDeadZone();
else
newAxis = 0; // treat any dead zone value as zero
static constexpr std::array<float, MAX_DEJITTER - MIN_DEJITTER + 1> bFac = {
// higher values mean more dejitter strength
0.f, // off
0.50f, 0.59f, 0.67f, 0.74f, 0.80f,
0.85f, 0.89f, 0.92f, 0.94f, 0.95f
};
static constexpr std::array<float, MAX_DEJITTER - MIN_DEJITTER + 1> dFac = {
// lower values mean more dejitter strength
1.f, // off
1.0f / 181, 1.0f / 256, 1.0f / 362, 1.0f / 512, 1.0f / 724,
1.0f / 1024, 1.0f / 1448, 1.0f / 2048, 1.0f / 2896, 1.0f / 4096
};
const float baseFactor = bFac[DEJITTER_BASE];
const float diffFactor = dFac[DEJITTER_DIFF];
// dejitter, suppress small changes only
float dejitter = powf(baseFactor, std::abs(newAxis - lastAxis) * diffFactor);
int newVal = newAxis * (1 - dejitter) + lastAxis * dejitter;
// only use new dejittered value for larger differences
if(abs(newVal - newAxis) > 10)
newAxis = newVal;
// apply linearity
float linearVal = newAxis / (range / 2); // scale to -1.0..+1.0
if(newAxis >= 0)
linearVal = powf(std::abs(linearVal), LINEARITY);
else
linearVal = -powf(std::abs(linearVal), LINEARITY);
newAxis = linearVal * (range / 2); // scale back to ANALOG_RANGE
// scale axis to range including dead zone
const Int32 scaledAxis = newAxis * ANALOG_RANGE / range;
// scale result
return AnalogReadout::connectToVcc(MAX_RESISTANCE *
BSPF::clamp((ANALOG_MAX_VALUE - (scaledAxis * SENSITIVITY + center)) /
float(ANALOG_RANGE), 0.F, 1.F));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Paddles::updateAnalogAxes()
{
// Analog axis events from Stelladaptor-like devices
// Analog axis events from Stelladaptor-like devices,
// (which includes analog USB controllers)
// These devices generate data in the range -32768 to 32767,
// so we have to scale appropriately
// Since these events are generated and stored indefinitely,
@ -206,20 +261,6 @@ bool Paddles::updateAnalogAxes()
// previous values by a pre-defined amount)
// Otherwise, it would always override input from digital and mouse
static constexpr std::array<double, MAX_DEJITTER - MIN_DEJITTER + 1> bFac = {
// higher values mean more dejitter strength
0, // off
0.50, 0.59, 0.67, 0.74, 0.80,
0.85, 0.89, 0.92, 0.94, 0.95
};
static constexpr std::array<double, MAX_DEJITTER - MIN_DEJITTER + 1> dFac = {
// lower values mean more dejitter strength
1, // off
1.0 / 181, 1.0 / 256, 1.0 / 362, 1.0 / 512, 1.0 / 724,
1.0 / 1024, 1.0 / 1448, 1.0 / 2048, 1.0 / 2896, 1.0 / 4096
};
const double baseFactor = bFac[DEJITTER_BASE];
const double diffFactor = dFac[DEJITTER_DIFF];
int sa_xaxis = myEvent.get(myAAxisValue);
int sa_yaxis = myEvent.get(myBAxisValue);
@ -227,31 +268,13 @@ bool Paddles::updateAnalogAxes()
if(abs(myLastAxisX - sa_xaxis) > 10)
{
// dejitter, suppress small changes only
double dejitter = std::pow(baseFactor, abs(sa_xaxis - myLastAxisX) * diffFactor);
int new_val = sa_xaxis * (1 - dejitter) + myLastAxisX * dejitter;
// only use new dejittered value for larger differences
if(abs(new_val - sa_xaxis) > 10)
sa_xaxis = new_val;
setPin(AnalogPin::Nine, AnalogReadout::connectToVcc(MAX_RESISTANCE *
(BSPF::clamp(32768 - Int32(Int32(sa_xaxis) * SENSITIVITY + XCENTER), 0, 65536) / 65536.0)));
setPin(AnalogPin::Nine, getReadOut(myLastAxisX, sa_xaxis, XCENTER));
sa_changed = true;
}
if(abs(myLastAxisY - sa_yaxis) > 10)
{
// dejitter, suppress small changes only
double dejitter = std::pow(baseFactor, abs(sa_yaxis - myLastAxisY) * diffFactor);
int new_val = sa_yaxis * (1 - dejitter) + myLastAxisY * dejitter;
// only use new dejittered value for larger differences
if(abs(new_val - sa_yaxis) > 10)
sa_yaxis = new_val;
setPin(AnalogPin::Five, AnalogReadout::connectToVcc(MAX_RESISTANCE *
(BSPF::clamp(32768 - Int32(Int32(sa_yaxis) * SENSITIVITY + YCENTER), 0, 65536) / 65536.0)));
setPin(AnalogPin::Five, getReadOut(myLastAxisY, sa_yaxis, YCENTER));
sa_changed = true;
}
myLastAxisX = sa_xaxis;
@ -271,6 +294,7 @@ void Paddles::updateMouse(bool& firePressedA, bool& firePressedB)
myCharge[myMPaddleID] = BSPF::clamp(myCharge[myMPaddleID] -
(myEvent.get(myAxisMouseMotion) * MOUSE_SENSITIVITY),
TRIGMIN, TRIGRANGE);
if(myMPaddleID == 0)
firePressedA = firePressedA
|| myEvent.get(Event::MouseButtonLeftValue)
@ -424,6 +448,11 @@ float Paddles::analogSensitivityValue(int sensitivity)
static_cast<float>(BSPF::clamp(sensitivity, MIN_ANALOG_SENSE, MAX_ANALOG_SENSE)));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setAnalogLinearity(int linearity)
{
LINEARITY = 100.f / BSPF::clamp(linearity, MIN_ANALOG_LINEARITY, MAX_ANALOG_LINEARITY);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setDejitterBase(int strength)
{
@ -443,12 +472,6 @@ void Paddles::setDigitalSensitivity(int sensitivity)
DIGITAL_DISTANCE = 20 + (DIGITAL_SENSITIVITY << 3);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setMouseSensitivity(int sensitivity)
{
MOUSE_SENSITIVITY = BSPF::clamp(sensitivity, MIN_MOUSE_SENSE, MAX_MOUSE_SENSE);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Paddles::setDigitalPaddleRange(int range)
{
@ -460,10 +483,10 @@ void Paddles::setDigitalPaddleRange(int range)
int Paddles::XCENTER = 0;
int Paddles::YCENTER = 0;
float Paddles::SENSITIVITY = 1.0;
int Paddles::TRIGRANGE = Paddles::TRIGMAX;
int Paddles::DIGITAL_SENSITIVITY = -1;
int Paddles::DIGITAL_DISTANCE = -1;
int Paddles::MOUSE_SENSITIVITY = -1;
float Paddles::LINEARITY = 1.0;
int Paddles::DEJITTER_BASE = 0;
int Paddles::DEJITTER_DIFF = 0;
int Paddles::TRIGRANGE = Paddles::TRIGMAX;
int Paddles::DIGITAL_SENSITIVITY = -1;
int Paddles::DIGITAL_DISTANCE = -1;

View File

@ -48,15 +48,18 @@ class Paddles : public Controller
~Paddles() override = default;
public:
static constexpr int ANALOG_MIN_VALUE = -32768;
static constexpr int ANALOG_MAX_VALUE = 32767;
static constexpr int ANALOG_RANGE = ANALOG_MAX_VALUE - ANALOG_MIN_VALUE + 1;
static constexpr float BASE_ANALOG_SENSE = 0.148643628F;
static constexpr int MIN_ANALOG_SENSE = 0;
static constexpr int MAX_ANALOG_SENSE = 30;
static constexpr int MIN_ANALOG_LINEARITY = 25;
static constexpr int MAX_ANALOG_LINEARITY = 100;
static constexpr int MIN_ANALOG_CENTER = -10;
static constexpr int MAX_ANALOG_CENTER = 30;
static constexpr int MIN_DIGITAL_SENSE = 1;
static constexpr int MAX_DIGITAL_SENSE = 20;
static constexpr int MIN_MOUSE_SENSE = 1;
static constexpr int MAX_MOUSE_SENSE = 20;
static constexpr int MIN_DEJITTER = 0;
static constexpr int MAX_DEJITTER = 10;
static constexpr int MIN_MOUSE_RANGE = 1;
@ -111,6 +114,13 @@ class Paddles : public Controller
*/
static void setAnalogYCenter(int ycenter);
/**
Sets the linearity of analog paddles.
@param linearity Value from 25 to 100
*/
static void setAnalogLinearity(int linearity);
/**
Sets the sensitivity for analog paddles.
@ -121,6 +131,7 @@ class Paddles : public Controller
static float analogSensitivityValue(int sensitivity);
/**
@param strength Value from 0 to 10
*/
@ -142,15 +153,6 @@ class Paddles : public Controller
*/
static void setDigitalSensitivity(int sensitivity);
/**
Sets the sensitivity for analog emulation of paddle movement
using a mouse.
@param sensitivity Value from 1 to MAX_MOUSE_SENSE, with larger
values causing more movement
*/
static void setMouseSensitivity(int sensitivity);
/**
Sets the maximum upper range for digital/mouse emulation of paddle
movement (ie, a value of 50 means to only use 50% of the possible
@ -192,17 +194,18 @@ class Paddles : public Controller
static int XCENTER;
static int YCENTER;
static float SENSITIVITY;
static float SENSITIVITY, LINEARITY;
static int DIGITAL_SENSITIVITY, DIGITAL_DISTANCE;
static int DEJITTER_BASE, DEJITTER_DIFF;
static int MOUSE_SENSITIVITY;
/**
Swap two events.
*/
void swapEvents(Event::Type& event1, Event::Type& event2);
AnalogReadout::Connection getReadOut(int lastAxis, int& newAxis, int center);
/**
Update the axes pin state according to the events currently set.
*/

View File

@ -326,7 +326,7 @@ void PlusROM::send()
{
#if defined(HTTP_LIB_SUPPORT)
if (myPendingRequests.size() >= MAX_CONCURRENT_REQUESTS) {
// Try to make room by cosuming any requests that have completed.
// Try to make room by consuming any requests that have completed.
receive();
}

View File

@ -22,6 +22,7 @@
#include "Logger.hxx"
#include "AudioSettings.hxx"
#include "PaletteHandler.hxx"
#include "Joystick.hxx"
#include "Paddles.hxx"
#ifdef DEBUGGER_SUPPORT
@ -114,6 +115,8 @@ Settings::Settings()
setPermanent("usemouse", "analog");
setPermanent("grabmouse", "true");
setPermanent("cursor", "2");
setPermanent("adeadzone", "0");
setPermanent("plinear", "100");
setPermanent("dejitter.base", "0");
setPermanent("dejitter.diff", "0");
setPermanent("dsense", "10");
@ -205,6 +208,7 @@ Settings::Settings()
setPermanent("plr.bankrandom", "false");
setPermanent("plr.ramrandom", "true");
setPermanent("plr.cpurandom", "AXYP");
setPermanent("plr.tiarandom", "true");
setPermanent("plr.colorloss", "false");
setPermanent("plr.tv.jitter", "true");
setPermanent("plr.tv.jitter_recovery", "10");
@ -224,6 +228,7 @@ Settings::Settings()
setPermanent("dev.bankrandom", "true");
setPermanent("dev.ramrandom", "true");
setPermanent("dev.cpurandom", "SAXYP");
setPermanent("dev.tiarandom", "true");
setPermanent("dev.colorloss", "true");
setPermanent("dev.tv.jitter", "true");
setPermanent("dev.tv.jitter_recovery", "2");
@ -354,26 +359,34 @@ void Settings::validate()
AudioSettings::normalize(*this);
#endif
i = getInt("joydeadzone");
if(i < 0) setValue("joydeadzone", "0");
else if(i > 29) setValue("joydeadzone", "29");
setValue("joydeadzone", BSPF::clamp(getInt("joydeadzone"),
Controller::MIN_DIGITAL_DEADZONE, Joystick::MAX_DIGITAL_DEADZONE));
setValue("adeadzone", BSPF::clamp(getInt("adeadzone"),
Controller::MIN_ANALOG_DEADZONE, Controller::MAX_ANALOG_DEADZONE));
setValue("psense", BSPF::clamp(getInt("psense"),
Paddles::MIN_ANALOG_SENSE, Paddles::MAX_ANALOG_SENSE));
setValue("plinear", BSPF::clamp(getInt("plinear"),
Paddles::MIN_ANALOG_LINEARITY, Paddles::MAX_ANALOG_LINEARITY));
setValue("dejitter.base", BSPF::clamp(getInt("dejitter.base"),
Paddles::MIN_DEJITTER, Paddles::MAX_DEJITTER));
setValue("dejitter.diff", BSPF::clamp(getInt("dejitter.diff"),
Paddles::MIN_DEJITTER, Paddles::MAX_DEJITTER));
setValue("dsense", BSPF::clamp(getInt("dsense"),
Paddles::MIN_DIGITAL_SENSE, Paddles::MAX_DIGITAL_SENSE));
setValue("msense", BSPF::clamp(getInt("msense"),
Controller::MIN_MOUSE_SENSE, Controller::MAX_MOUSE_SENSE));
i = getInt("cursor");
if(i < 0 || i > 3)
setValue("cursor", "2");
i = getInt("psense");
if(i < Paddles::MIN_ANALOG_SENSE || i > Paddles::MAX_ANALOG_SENSE)
setValue("psense", "20");
i = getInt("dsense");
if(i < Paddles::MIN_DIGITAL_SENSE || i > Paddles::MAX_DIGITAL_SENSE)
setValue("dsense", "10");
i = getInt("msense");
if(i < 1 || i > 20)
setValue("msense", "10");
i = getInt("tsense");
if(i < 1 || i > 20)
setValue("tsense", "10");
@ -503,22 +516,24 @@ void Settings::usage() const
<< " -loglevel <0|1|2> Set level of logging during application run\n"
<< endl
<< " -logtoconsole <1|0> Log output to console/commandline\n"
<< " -joydeadzone <number> Sets 'deadzone' area for analog joysticks (0-29)\n"
<< " -joydeadzone <0-29> Sets digital 'dead zone' area for analog joysticks\n"
<< " -joyallow4 <1|0> Allow all 4 directions on a joystick to be\n"
<< " pressed simultaneously\n"
<< " -usemouse <always|\n"
<< " analog|\n"
<< " never> Use mouse as a controller as specified by ROM\n"
<< " properties in given mode(see manual)\n"
<< " -grabmouse <1|0> Locks the mouse cursor in the TIA window\n"
<< " -cursor <0,1,2,3> Set cursor state in UI/emulation modes\n"
<< " -dejitter.base <0-10> Strength of analog paddle value averaging\n"
<< " -dejitter.diff <0-10> Strength of analog paddle reaction to fast movements\n"
<< " -psense <0-30> Sensitivity of analog paddle movement\n"
<< " -dsense <1-20> Sensitivity of digital emulated paddle movement\n"
<< " -msense <1-20> Sensitivity of mouse emulated paddle movement\n"
<< " -tsense <1-20> Sensitivity of mouse emulated trackball movement\n"
<< " -dcsense <1-20> Sensitivity of digital emulated driving controller\n"
<< " -grabmouse <1|0> Locks the mouse cursor in the TIA window\n"
<< " -cursor <0,1,2,3> Set cursor state in UI/emulation modes\n"
<< " -adeadzone <0-29> Sets analog 'dead zone' area for analog joysticks\n"
<< " -plinear <25-100> Sets paddle linearity\n"
<< " -dejitter.base <0-10> Strength of analog paddle value averaging\n"
<< " -dejitter.diff <0-10> Strength of analog paddle reaction to fast movements\n"
<< " -psense <0-30> Sensitivity of analog paddle movement\n"
<< " -dsense <1-20> Sensitivity of digital emulated paddle movement\n"
<< " -msense <1-20> Sensitivity of mouse emulated paddle movement\n"
<< " -tsense <1-20> Sensitivity of mouse emulated trackball movement\n"
<< " -dcsense <1-20> Sensitivity of digital emulated driving controller\n"
<< " movement\n"
<< " -autofirerate <0-30> Set fire button's autofire rate (0 means off)\n"
<< " -saport <lr|rl> How to assign virtual ports to multiple\n"
@ -663,8 +678,8 @@ void Settings::usage() const
<< " handling and RAM initialization\n"
<< " -plr.bankrandom <1|0> Randomize the startup bank on reset\n"
<< " -plr.ramrandom <1|0> Randomize the contents of RAM on reset\n"
<< " -plr.cpurandom <1|0> Randomize the contents of CPU registers on\n"
<< " reset\n"
<< " -plr.tiarandom <1|0> Randomize the TIA registers on reset\n"
<< " -plr.ramrandom <1|0> Randomize the contents of RAM on reset\n"
<< " -plr.debugcolors <1|0> Enable debug colors\n"
<< " -plr.colorloss <1|0> Enable PAL color-loss effect\n"
<< " -plr.tv.jitter <1|0> Enable TV jitter effect\n"
@ -681,6 +696,7 @@ void Settings::usage() const
<< " -dev.ramrandom <1|0> Randomize the contents of RAM on reset\n"
<< " -dev.cpurandom <1|0> Randomize the contents of CPU registers on\n"
<< " reset\n"
<< " -dev.tiarandom <1|0> Randomize the TIA registers on reset\n"
<< " -dev.debugcolors <1|0> Enable debug colors\n"
<< " -dev.colorloss <1|0> Enable PAL color-loss effect\n"
<< " -dev.tv.jitter <1|0> Enable TV jitter effect\n"

View File

@ -38,7 +38,7 @@ class TrakBall : public PointingDevice
/**
Returns the name of this controller.
*/
string name() const override { return "TrakBall"; }
string name() const override { return "Trak-Ball"; }
protected:
uInt8 ioPortA(uInt8 countH, uInt8 countV, uInt8 left, uInt8 down) override

View File

@ -1249,10 +1249,8 @@
"Cart.MD5" "0e224ea74310da4e7e2103400eb1b4bf"
"Cart.Manufacturer" "Atari, Peter C. Niday, Gary Shannon, Howard Scott Warshaw"
"Cart.Name" "Mind Maze (10-10-1984) (Atari) (Prototype)"
"Cart.Note" "Uses the MindLink controller"
"Cart.Rarity" "Prototype"
"Cart.Url" "http://www.atariprotos.com/2600/software/mindmaze/mindmaze.htm"
"Controller.Right" "MINDLINK"
""
"Cart.MD5" "0e23d0ed4c33b2011ab4cc93a7619683"
@ -1544,7 +1542,7 @@
"Cart.MD5" "10f0ecaf962aef1fc28abed870b01b65"
"Cart.Manufacturer" "Atari, Paul Donaldson"
"Cart.Name" "Bionic Breakthrough (06-22-1984) (Atari) (Prototype)"
"Cart.Note" "Uses the Mindlink Controller"
"Cart.Note" "Uses MindLink Controller"
"Cart.Rarity" "Prototype"
"Cart.Url" "http://www.atariprotos.com/2600/software/bionic/bionic.htm"
"Controller.Left" "MINDLINK"
@ -5482,7 +5480,7 @@
"Cart.MD5" "3d7aad37c55692814211c8b590a0334c"
"Cart.Manufacturer" "Atari, Dan Oliver"
"Cart.Name" "Telepathy (1983) (Atari) (Prototype)"
"Cart.Note" "Uses both left joystick and right Mindlink controllers (press Fire on respective controller to begin)"
"Cart.Note" "Uses both left joystick and right MindLink controllers (press Fire on respective controller to begin)"
"Cart.Rarity" "Prototype"
"Cart.Url" "http://www.atariprotos.com/2600/software/telepathy/telepathy.htm"
"Controller.Right" "MINDLINK"
@ -7301,6 +7299,7 @@
"Cart.ModelNo" "AG-930-04, AZ-030"
"Cart.Name" "Decathlon (1983) (Activision) [fixed]"
"Cart.Highscore" "{\"notes\":\"Decathlon & 100m dash share variation 1\",\"score_addresses\":[\"0x95\",\"0x96\"],\"variations_address\":\"0x80\",\"variations_bcd\":false,\"variations_count\":10,\"variations_zero_based\":true}"
"Controller.Right" "PADDLES"
""
"Cart.MD5" "52615ae358a68de6e76467e95eb404c7"
@ -14183,8 +14182,7 @@
"Cart.Manufacturer" "Coleco, Rob Harris"
"Cart.ModelNo" "2511"
"Cart.Name" "Smurfs Save the Day (1983) (Coleco)"
"Cart.Note" "Uses the Kid Vid Controller"
"Controller.Right" "KIDVID"
"Cart.Note" "Uses the Kid Vid Voice Module"
""
"Cart.MD5" "a20b7abbcdf90fbc29ac0fafa195bd12"
@ -15086,6 +15084,7 @@
"Cart.Name" "Decathlon (1983) (Activision)"
"Cart.Rarity" "Rare"
"Cart.Highscore" "{\"notes\":\"Decathlon & 100m dash share variation 1\",\"score_addresses\":[\"0x95\",\"0x96\"],\"variations_address\":\"0x80\",\"variations_bcd\":false,\"variations_count\":10,\"variations_zero_based\":true}"
"Controller.Right" "PADDLES"
""
"Cart.MD5" "ac9adbd6de786a242e19d4bec527982b"
@ -20774,10 +20773,9 @@
"Cart.Manufacturer" "Coleco"
"Cart.ModelNo" "2658"
"Cart.Name" "Berenstain Bears (1983) (Coleco)"
"Cart.Note" "Uses the KidVid Controller"
"Cart.Note" "Uses the Kid Vid Voice Module"
"Cart.Rarity" "Unbelievably Rare"
"Console.LeftDiff" "A"
"Controller.Right" "KIDVID"
""
"Cart.MD5" "ee67dc0b01746372d2b983d88f48e24f"
@ -20958,7 +20956,7 @@
"Cart.MD5" "f0541d2f7cda5ec7bab6d62b6128b823"
"Cart.Manufacturer" "Atari, Paul Donaldson"
"Cart.Name" "Bionic Breakthrough (1984) (Atari) (Prototype)"
"Cart.Note" "Uses Mindlink Controller (left only)"
"Cart.Note" "Uses MindLink Controller"
"Cart.Rarity" "Prototype"
"Cart.Url" "http://www.atariprotos.com/2600/software/bionic/bionic.htm"
"Controller.Left" "MINDLINK"

View File

@ -198,6 +198,15 @@ void TIA::reset()
// Simply call initialize(); mostly to get around calling a virtual method
// from the constructor
initialize();
if(myRandomize)
for(uInt32 i = 0; i < 0x10000; ++i)
{
uInt16 address = mySystem->randGenerator().next() & 0x3F;
uInt8 value = mySystem->randGenerator().next();
poke(address, value);
cycle(2); // process delay queue
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -956,6 +965,7 @@ void TIA::applyDeveloperSettings()
setBlSwapDelay(false);
}
myRandomize = mySettings.getBool(devSettings ? "dev.tiarandom" : "plr.tiarandom");
myTIAPinsDriven = devSettings ? mySettings.getBool("dev.tiadriven") : false;
myEnableJitter = mySettings.getBool(devSettings ? "dev.tv.jitter" : "plr.tv.jitter");

View File

@ -819,6 +819,11 @@ class TIA : public Device
// Frames since the last time a frame was rendered to the render buffer
uInt32 myFramesSinceLastRender{0};
/**
* Setting this to true randomizes TIA on reset.
*/
bool myRandomize{false};
/**
* Setting this to true injects random values into undefined reads.
*/

View File

@ -145,11 +145,15 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
myRandomBankWidget->setToolTip("Randomize the startup bank for\n"
"most classic bankswitching types.");
wid.push_back(myRandomBankWidget);
myRandomizeTIAWidget = new CheckboxWidget(myTab, font, myRandomBankWidget->getRight() + fontWidth * 2.5, ypos + 1,
"Randomize TIA");
wid.push_back(myRandomizeTIAWidget);
ypos += lineHeight + VGAP;
// Randomize RAM
myRandomizeRAMWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1,
"Randomize zero-page and extended RAM", kRandRAMID);
"Randomize zero-page and extended RAM");
wid.push_back(myRandomizeRAMWidget);
ypos += lineHeight + VGAP;
@ -162,7 +166,7 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
for(int i = 0; i < 5; ++i)
{
myRandomizeCPUWidget[i] = new CheckboxWidget(myTab, font, xpos, ypos + 1,
cpuregsLabels[i], kRandCPUID);
cpuregsLabels[i]);
wid.push_back(myRandomizeCPUWidget[i]);
xpos += CheckboxWidget::boxSize(font) + font.getStringWidth("XX") + fontWidth * 2.5;
}
@ -669,6 +673,7 @@ void DeveloperDialog::loadSettings(SettingsSet set)
myConsole[set] = instance().settings().getString(prefix + "console") == "7800" ? 1 : 0;
// Randomization
myRandomBank[set] = instance().settings().getBool(prefix + "bankrandom");
myRandomizeTIA[set] = instance().settings().getBool(prefix + "tiarandom");
myRandomizeRAM[set] = instance().settings().getBool(prefix + "ramrandom");
myRandomizeCPU[set] = instance().settings().getString(prefix + "cpurandom");
// Undriven TIA pins
@ -725,6 +730,7 @@ void DeveloperDialog::saveSettings(SettingsSet set)
// Randomization
instance().settings().setValue(prefix + "bankrandom", myRandomBank[set]);
instance().settings().setValue(prefix + "tiarandom", myRandomizeTIA[set]);
instance().settings().setValue(prefix + "ramrandom", myRandomizeRAM[set]);
instance().settings().setValue(prefix + "cpurandom", myRandomizeCPU[set]);
@ -786,6 +792,7 @@ void DeveloperDialog::getWidgetStates(SettingsSet set)
myConsole[set] = myConsoleWidget->getSelected() == 1;
// Randomization
myRandomBank[set] = myRandomBankWidget->getState();
myRandomizeTIA[set] = myRandomizeTIAWidget->getState();
myRandomizeRAM[set] = myRandomizeRAMWidget->getState();
string cpurandom;
const std::array<string, 5> cpuregs = {"S", "A", "X", "Y", "P"};
@ -841,6 +848,7 @@ void DeveloperDialog::setWidgetStates(SettingsSet set)
myConsoleWidget->setSelectedIndex(myConsole[set]);
// Randomization
myRandomBankWidget->setState(myRandomBank[set]);
myRandomizeTIAWidget->setState(myRandomizeTIA[set]);
myRandomizeRAMWidget->setState(myRandomizeRAM[set]);
const string& cpurandom = myRandomizeCPU[set];
@ -1025,6 +1033,7 @@ void DeveloperDialog::setDefaults()
myConsole[set] = 0;
// Randomization
myRandomBank[set] = devSettings ? true : false;
myRandomizeTIA[set] = true;
myRandomizeRAM[set] = true;
myRandomizeCPU[set] = devSettings ? "SAXYP" : "AXYP";
// Undriven TIA pins

View File

@ -57,8 +57,6 @@ class DeveloperDialog : public Dialog
kPlrSettings = 'DVpl',
kDevSettings = 'DVdv',
kConsole = 'DVco',
kRandRAMID = 'DVrm',
kRandCPUID = 'DVcp',
kTIAType = 'DVtt',
kTVJitter = 'DVjt',
kTVJitterChanged = 'DVjr',
@ -94,6 +92,7 @@ class DeveloperDialog : public Dialog
PopUpWidget* myConsoleWidget{nullptr};
StaticTextWidget* myLoadingROMLabel{nullptr};
CheckboxWidget* myRandomBankWidget{nullptr};
CheckboxWidget* myRandomizeTIAWidget{nullptr};
CheckboxWidget* myRandomizeRAMWidget{nullptr};
StaticTextWidget* myRandomizeCPULabel{nullptr};
CheckboxWidget* myUndrivenPinsWidget{nullptr};
@ -154,6 +153,7 @@ class DeveloperDialog : public Dialog
std::array<bool, 2> myDetectedInfo;
std::array<int, 2> myConsole;
std::array<bool, 2> myRandomBank;
std::array<bool, 2> myRandomizeTIA;
std::array<bool, 2> myRandomizeRAM;
std::array<string, 2> myRandomizeCPU;
std::array<bool, 2> myColorLoss;

View File

@ -23,7 +23,7 @@
#include "FrameBuffer.hxx"
#include "FBSurface.hxx"
#include "Font.hxx"
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "Dialog.hxx"
#include "Widget.hxx"
#include "TabWidget.hxx"

View File

@ -277,17 +277,17 @@ void GameInfoDialog::addControllersTab()
VarList::push_back(items, "Paddles", "PADDLES");
VarList::push_back(items, "Paddles_IAxis", "PADDLES_IAXIS");
VarList::push_back(items, "Paddles_IAxDr", "PADDLES_IAXDR");
VarList::push_back(items, "BoosterGrip", "BOOSTERGRIP");
VarList::push_back(items, "Booster Grip", "BOOSTERGRIP");
VarList::push_back(items, "Driving", "DRIVING");
VarList::push_back(items, "Keyboard", "KEYBOARD");
VarList::push_back(items, "AmigaMouse", "AMIGAMOUSE");
VarList::push_back(items, "AtariMouse", "ATARIMOUSE");
VarList::push_back(items, "Trakball", "TRAKBALL");
VarList::push_back(items, "Amiga mouse", "AMIGAMOUSE");
VarList::push_back(items, "Atari mouse", "ATARIMOUSE");
VarList::push_back(items, "Trak-Ball", "TRAKBALL");
VarList::push_back(items, "AtariVox", "ATARIVOX");
VarList::push_back(items, "SaveKey", "SAVEKEY");
VarList::push_back(items, "Sega Genesis", "GENESIS");
VarList::push_back(items, "KidVid", "KIDVID");
VarList::push_back(items, "Lightgun", "LIGHTGUN");
VarList::push_back(items, "Kid Vid", "KIDVID");
VarList::push_back(items, "Light Gun", "LIGHTGUN");
VarList::push_back(items, "MindLink", "MINDLINK");
VarList::push_back(items, "QuadTari", "QUADTARI");

View File

@ -98,7 +98,7 @@ static constexpr std::array<uInt32, BUTTON_GFX_H_LARGE> NEXT_GFX_LARGE = {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
HighScoresDialog::HighScoresDialog(OSystem& osystem, DialogContainer& parent,
int max_w, int max_h,
Menu::AppMode mode)
OptionsMenu::AppMode mode)
: Dialog(osystem, parent, osystem.frameBuffer().font(), "High Scores"),
_max_w{max_w},
_max_h{max_h},
@ -219,7 +219,7 @@ HighScoresDialog::~HighScoresDialog()
void HighScoresDialog::loadConfig()
{
// Enable blending (only once is necessary)
if (myMode == Menu::AppMode::emulator && !surface().attributes().blending)
if (myMode == OptionsMenu::AppMode::emulator && !surface().attributes().blending)
{
surface().attributes().blending = true;
surface().attributes().blendalpha = 90;
@ -314,7 +314,7 @@ void HighScoresDialog::handleCommand(CommandSender* sender, int cmd, int data, i
saveConfig();
[[fallthrough]];
case kCloseCmd:
if(myMode != Menu::AppMode::emulator)
if(myMode != OptionsMenu::AppMode::emulator)
close();
else
instance().eventHandler().leaveMenuMode();

View File

@ -28,7 +28,7 @@ namespace GUI {
}
class Serializer;
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "Dialog.hxx"
#include "HighScoresManager.hxx"
#include "json_lib.hxx"
@ -47,7 +47,7 @@ class HighScoresDialog : public Dialog
static constexpr uInt32 NUM_RANKS = 10;
HighScoresDialog(OSystem& osystem, DialogContainer& parent,
int max_w, int max_h, Menu::AppMode mode);
int max_w, int max_h, OptionsMenu::AppMode mode);
~HighScoresDialog() override;
protected:
@ -110,7 +110,7 @@ class HighScoresDialog : public Dialog
StaticTextWidget* myMD5Widget{nullptr};
StaticTextWidget* myCheckSumWidget{nullptr};
Menu::AppMode myMode{Menu::AppMode::emulator};
OptionsMenu::AppMode myMode{OptionsMenu::AppMode::emulator};
private:
// Following constructors and assignment operators not supported

View File

@ -38,7 +38,7 @@ Dialog* HighScoresMenu::baseDialog()
if (myHighScoresDialog == nullptr)
myHighScoresDialog = new HighScoresDialog(myOSystem, *this,
FBMinimum::Width, FBMinimum::Height,
Menu::AppMode::emulator);
OptionsMenu::AppMode::emulator);
return myHighScoresDialog;
}

View File

@ -21,6 +21,7 @@
#include "EventHandler.hxx"
#include "Joystick.hxx"
#include "Paddles.hxx"
#include "MindLink.hxx"
#include "PointingDevice.hxx"
#include "Driving.hxx"
#include "SaveKey.hxx"
@ -54,7 +55,7 @@ InputDialog::InputDialog(OSystem& osystem, DialogContainer& parent,
// Set real dimensions
setSize(48 * fontWidth + PopUpWidget::dropDownWidth(_font) + HBORDER * 2,
_th + VGAP * 3 + lineHeight + 13 * (lineHeight + VGAP) + VGAP * 8 + buttonHeight + VBORDER * 3,
_th + VGAP * 3 + lineHeight + 13 * (lineHeight + VGAP) + VGAP * 9 + buttonHeight + VBORDER * 3,
max_w, max_h);
// The tab widget
@ -111,30 +112,54 @@ void InputDialog::addDevicePortTab()
// Devices/ports
tabID = myTab->addTab(" Devices & Ports ", TabWidget::AUTO_WIDTH);
ypos = VBORDER;
xpos = HBORDER; ypos = VBORDER;
lwidth = _font.getStringWidth("Digital paddle sensitivity ");
// Add joystick deadzone setting
myDeadzone = new SliderWidget(myTab, _font, HBORDER, ypos - 1, 13 * fontWidth, lineHeight,
"Joystick deadzone size", lwidth, kDeadzoneChanged, 5 * fontWidth);
myDeadzone->setMinValue(Joystick::DEAD_ZONE_MIN);
myDeadzone->setMaxValue(Joystick::DEAD_ZONE_MAX);
myDeadzone->setTickmarkIntervals(4);
wid.push_back(myDeadzone);
// Add digital dead zone setting
myDigitalDeadzone = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Digital dead zone size ",
lwidth, kDDeadzoneChanged, 3 * fontWidth, "%");
myDigitalDeadzone->setMinValue(Controller::MIN_DIGITAL_DEADZONE);
myDigitalDeadzone->setMaxValue(Controller::MAX_DIGITAL_DEADZONE);
myDigitalDeadzone->setTickmarkIntervals(5);
myDigitalDeadzone->setToolTip("Adjust dead zone size for analog joysticks when emulating digital controllers.");
wid.push_back(myDigitalDeadzone);
xpos = HBORDER; ypos += lineHeight + VGAP * 3;
// Add analog dead zone
ypos += lineHeight + VGAP;
myAnalogDeadzone = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Analog dead zone size",
lwidth, kADeadzoneChanged, 3 * fontWidth, "%");
myAnalogDeadzone->setMinValue(Controller::MIN_ANALOG_DEADZONE);
myAnalogDeadzone->setMaxValue(Controller::MAX_ANALOG_DEADZONE);
myAnalogDeadzone->setTickmarkIntervals(5);
myAnalogDeadzone->setToolTip("Adjust dead zone size for analog joysticks when emulating analog controllers.");
wid.push_back(myAnalogDeadzone);
ypos += lineHeight + VGAP * (3 - 2);
new StaticTextWidget(myTab, _font, xpos, ypos+1, "Analog paddle:");
xpos += fontWidth * 2;
// Add analog paddle sensitivity
ypos += lineHeight;
myPaddleSpeed = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Sensitivity",
lwidth - fontWidth * 2, kPSpeedChanged, 4 * fontWidth, "%");
myPaddleSpeed->setMinValue(0); myPaddleSpeed->setMaxValue(Paddles::MAX_ANALOG_SENSE);
"Sensitivity",
lwidth - fontWidth * 2, kPSpeedChanged, 4 * fontWidth, "%");
myPaddleSpeed->setMinValue(0);
myPaddleSpeed->setMaxValue(Paddles::MAX_ANALOG_SENSE);
myPaddleSpeed->setTickmarkIntervals(3);
wid.push_back(myPaddleSpeed);
// Add analog paddle linearity
ypos += lineHeight + VGAP;
myPaddleLinearity = new SliderWidget(myTab, _font, xpos, ypos - 1, 13 * fontWidth, lineHeight,
"Linearity", lwidth - fontWidth * 2, 0, 4 * fontWidth, "%");
myPaddleLinearity->setMinValue(Paddles::MIN_ANALOG_LINEARITY);
myPaddleLinearity->setMaxValue(Paddles::MAX_ANALOG_LINEARITY);
myPaddleLinearity->setStepValue(5);
myPaddleLinearity->setTickmarkIntervals(3);
myPaddleLinearity->setToolTip("Adjust paddle movement linearity.");
wid.push_back(myPaddleLinearity);
// Add dejitter (analog paddles)
ypos += lineHeight + VGAP;
@ -160,7 +185,7 @@ void InputDialog::addDevicePortTab()
wid.push_back(myDejitterDiff);
// Add paddle speed (digital emulation)
ypos += lineHeight + VGAP * 3;
ypos += lineHeight + VGAP * (3 - 2);
myDPaddleSpeed = new SliderWidget(myTab, _font, HBORDER, ypos - 1, 13 * fontWidth, lineHeight,
"Digital paddle sensitivity",
lwidth, kDPSpeedChanged, 4 * fontWidth, "%");
@ -168,7 +193,7 @@ void InputDialog::addDevicePortTab()
myDPaddleSpeed->setTickmarkIntervals(4);
wid.push_back(myDPaddleSpeed);
ypos += lineHeight + VGAP * 3;
ypos += lineHeight + VGAP * (3 - 2);
myAutoFireRate = new SliderWidget(myTab, _font, HBORDER, ypos - 1, 13 * fontWidth, lineHeight,
"Autofire rate",
lwidth, kAutoFireChanged, 5 * fontWidth, "Hz");
@ -177,7 +202,7 @@ void InputDialog::addDevicePortTab()
wid.push_back(myAutoFireRate);
// Add 'allow all 4 directions' for joystick
ypos += lineHeight + VGAP * 4;
ypos += lineHeight + VGAP * (4 - 2);
myAllowAll4 = new CheckboxWidget(myTab, _font, HBORDER, ypos,
"Allow all 4 directions on joystick");
wid.push_back(myAllowAll4);
@ -197,7 +222,7 @@ void InputDialog::addDevicePortTab()
int fwidth;
// Add EEPROM erase (part 1/2)
ypos += VGAP * 3;
ypos += VGAP * (3 - 1);
fwidth = _font.getStringWidth("AtariVox/SaveKey");
new StaticTextWidget(myTab, _font, _w - HBORDER - 2 - fwidth, ypos,
"AtariVox/SaveKey");
@ -337,11 +362,15 @@ void InputDialog::loadConfig()
myCursorState->setSelected(settings.getString("cursor"), "2");
handleCursorState();
// Joystick deadzone
myDeadzone->setValue(settings.getInt("joydeadzone"));
// Digital dead zone
myDigitalDeadzone->setValue(settings.getInt("joydeadzone"));
// Analog dead zone
myAnalogDeadzone->setValue(settings.getInt("adeadzone"));
// Paddle speed (analog)
myPaddleSpeed->setValue(settings.getInt("psense"));
// Paddle linearity (analog)
myPaddleLinearity->setValue(settings.getInt("plinear"));
// Paddle dejitter (analog)
myDejitterBase->setValue(settings.getInt("dejitter.base"));
myDejitterDiff->setValue(settings.getInt("dejitter.diff"));
@ -403,17 +432,25 @@ void InputDialog::saveConfig()
Settings& settings = instance().settings();
// *** Device & Ports ***
// Joystick deadzone
int deadzone = myDeadzone->getValue();
settings.setValue("joydeadzone", deadzone);
Joystick::setDeadZone(deadzone);
// Digital dead zone
int deadZone = myDigitalDeadzone->getValue();
settings.setValue("joydeadzone", deadZone);
Controller::setDigitalDeadZone(deadZone);
// Analog dead zone
deadZone = myAnalogDeadzone->getValue();
settings.setValue("adeadzone", deadZone);
Controller::setAnalogDeadZone(deadZone);
// Paddle speed (analog)
int sensitivity = myPaddleSpeed->getValue();
settings.setValue("psense", sensitivity);
Paddles::setAnalogSensitivity(sensitivity);
// Paddle linearity (analog)
int linearity = myPaddleLinearity->getValue();
settings.setValue("plinear", linearity);
Paddles::setAnalogLinearity(linearity);
// Paddle speed (digital and mouse)
// Paddle dejitter (analog)
int dejitter = myDejitterBase->getValue();
settings.setValue("dejitter.base", dejitter);
Paddles::setDejitterBase(dejitter);
@ -453,6 +490,7 @@ void InputDialog::saveConfig()
sensitivity = myMPaddleSpeed->getValue();
settings.setValue("msense", sensitivity);
Paddles::setMouseSensitivity(sensitivity);
MindLink::setMouseSensitivity(sensitivity);
// Trackball speed
sensitivity = myTrackBallSpeed->getValue();
@ -490,11 +528,17 @@ void InputDialog::setDefaults()
break;
case 1: // Devices & Ports
// Joystick deadzone
myDeadzone->setValue(0);
// Digital dead zone
myDigitalDeadzone->setValue(0);
// Analog dead zone
myAnalogDeadzone->setValue(0);
// Paddle speed (analog)
myPaddleSpeed->setValue(20);
// Paddle linearity
myPaddleLinearity->setValue(100);
#if defined(RETRON77)
myDejitterBase->setValue(2);
myDejitterDiff->setValue(6);
@ -653,8 +697,14 @@ void InputDialog::handleCommand(CommandSender* sender, int cmd,
setDefaults();
break;
case kDeadzoneChanged:
myDeadzone->setValueLabel(Joystick::deadZoneValue(myDeadzone->getValue()));
case kDDeadzoneChanged:
myDigitalDeadzone->setValueLabel(std::round(Controller::digitalDeadZoneValue(myDigitalDeadzone->getValue()) * 100.f /
(Paddles::ANALOG_RANGE / 2)));
break;
case kADeadzoneChanged:
myAnalogDeadzone->setValueLabel(std::round(Controller::analogDeadZoneValue(myAnalogDeadzone->getValue()) * 100.f /
(Paddles::ANALOG_RANGE / 2)));
break;
case kPSpeedChanged:

View File

@ -71,11 +71,12 @@ class InputDialog : public Dialog
private:
enum {
kDeadzoneChanged = 'DZch',
kDDeadzoneChanged = 'DDch',
kADeadzoneChanged = 'ADch',
kPSpeedChanged = 'Ppch',
kDejitterAvChanged = 'JAch',
kDejitterReChanged = 'JRch',
kDPSpeedChanged = 'PDch',
kDPSpeedChanged = 'DSch',
kAutoFireChanged = 'AFch',
kTBSpeedChanged = 'TBch',
kDCSpeedChanged = 'DCch',
@ -96,8 +97,10 @@ class InputDialog : public Dialog
PopUpWidget* myAVoxPort{nullptr};
SliderWidget* myDeadzone{nullptr};
SliderWidget* myDigitalDeadzone{nullptr};
SliderWidget* myAnalogDeadzone{nullptr};
SliderWidget* myPaddleSpeed{nullptr};
SliderWidget* myPaddleLinearity{nullptr};
SliderWidget* myDejitterBase{nullptr};
SliderWidget* myDejitterDiff{nullptr};
SliderWidget* myDPaddleSpeed{nullptr};

View File

@ -926,10 +926,10 @@ void LauncherDialog::openSettings()
// Create an options dialog, similar to the in-game one
if (instance().settings().getBool("basic_settings"))
myDialog = make_unique<StellaSettingsDialog>(instance(), parent(),
_w, _h, Menu::AppMode::launcher);
_w, _h, OptionsMenu::AppMode::launcher);
else
myDialog = make_unique<OptionsDialog>(instance(), parent(), this, _w, _h,
Menu::AppMode::launcher);
OptionsMenu::AppMode::launcher);
myDialog->open();
}
@ -938,7 +938,7 @@ void LauncherDialog::openHighScores()
{
// Create an high scores dialog, similar to the in-game one
myDialog = make_unique<HighScoresDialog>(instance(), parent(), _w, _h,
Menu::AppMode::launcher);
OptionsMenu::AppMode::launcher);
myDialog->open();
}

View File

@ -321,14 +321,14 @@ void MinUICommandDialog::openSettings()
if (instance().settings().getBool("basic_settings"))
{
myDialog = make_unique<StellaSettingsDialog>(instance(), parent(),
1280, 720, Menu::AppMode::launcher);
1280, 720, OptionsMenu::AppMode::launcher);
myDialog->open();
}
else
{
myDialog = make_unique<OptionsDialog>(instance(), parent(), this,
FBMinimum::Width, FBMinimum::Height,
Menu::AppMode::launcher);
OptionsMenu::AppMode::launcher);
myDialog->open();
}
}
@ -337,6 +337,6 @@ void MinUICommandDialog::openSettings()
void MinUICommandDialog::openHighscores()
{
myDialog = make_unique<HighScoresDialog>(instance(), parent(),
1280, 720, Menu::AppMode::emulator);
1280, 720, OptionsMenu::AppMode::emulator);
myDialog->open();
}

View File

@ -37,7 +37,7 @@
#include "OptionsDialog.hxx"
#include "Launcher.hxx"
#include "Settings.hxx"
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#ifdef CHEATCODE_SUPPORT
#include "CheatCodeDialog.hxx"
@ -47,13 +47,13 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
GuiObject* boss, int max_w, int max_h, Menu::AppMode mode)
GuiObject* boss, int max_w, int max_h, OptionsMenu::AppMode mode)
: Dialog(osystem, parent, osystem.frameBuffer().font(), "Options"),
myBoss{boss},
myMode{mode}
{
// do not show basic settings options in debugger
bool minSettings = osystem.settings().getBool("minimal_ui") && mode != Menu::AppMode::debugger;
bool minSettings = osystem.settings().getBool("minimal_ui") && mode != OptionsMenu::AppMode::debugger;
const int buttonHeight = Dialog::buttonHeight(),
VBORDER = Dialog::vBorder(),
HBORDER = Dialog::hBorder(),
@ -138,7 +138,7 @@ OptionsDialog::OptionsDialog(OSystem& osystem, DialogContainer& parent,
addToFocusList(wid);
// Certain buttons are disabled depending on mode
if(myMode == Menu::AppMode::launcher)
if(myMode == OptionsMenu::AppMode::launcher)
{
myCheatCodeButton->clearFlags(Widget::FLAG_ENABLED);
}
@ -186,7 +186,7 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
case kBasSetCmd:
// enable basic settings
instance().settings().setValue("basic_settings", true);
if (myMode != Menu::AppMode::emulator)
if (myMode != OptionsMenu::AppMode::emulator)
close();
else
instance().eventHandler().leaveMenuMode();
@ -297,7 +297,7 @@ void OptionsDialog::handleCommand(CommandSender* sender, int cmd,
break;
case kExitCmd:
if(myMode != Menu::AppMode::emulator)
if(myMode != OptionsMenu::AppMode::emulator)
close();
else
instance().eventHandler().leaveMenuMode();

View File

@ -23,14 +23,14 @@ class DialogContainer;
class GuiObject;
class OSystem;
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "Dialog.hxx"
class OptionsDialog : public Dialog
{
public:
OptionsDialog(OSystem& osystem, DialogContainer& parent, GuiObject* boss,
int max_w, int max_h, Menu::AppMode mode);
int max_w, int max_h, OptionsMenu::AppMode mode);
~OptionsDialog() override;
private:
@ -46,7 +46,7 @@ class OptionsDialog : public Dialog
GuiObject* myBoss{nullptr};
// Indicates if this dialog is used for global (vs. in-game) settings
Menu::AppMode myMode{Menu::AppMode::emulator};
OptionsMenu::AppMode myMode{OptionsMenu::AppMode::emulator};
enum {
kBasSetCmd = 'BAST',

View File

@ -22,23 +22,23 @@
#include "OSystem.hxx"
#include "FrameBuffer.hxx"
#include "bspf.hxx"
#include "Menu.hxx"
#include "OptionsMenu.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Menu::Menu(OSystem& osystem)
OptionsMenu::OptionsMenu(OSystem& osystem)
: DialogContainer(osystem)
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Menu::~Menu()
OptionsMenu::~OptionsMenu()
{
delete stellaSettingDialog; stellaSettingDialog = nullptr;
delete optionsDialog; optionsDialog = nullptr;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Dialog* Menu::baseDialog()
Dialog* OptionsMenu::baseDialog()
{
if (myOSystem.settings().getBool("basic_settings"))
{

View File

@ -15,8 +15,8 @@
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
#ifndef MENU_HXX
#define MENU_HXX
#ifndef OPTIONS_MENU_HXX
#define OPTIONS_MENU_HXX
class OSystem;
class StellaSettingsDialog;
@ -29,7 +29,7 @@ class OptionsDialog;
@author Stephen Anthony
*/
class Menu : public DialogContainer
class OptionsMenu : public DialogContainer
{
public:
// Current Stella mode
@ -38,8 +38,8 @@ class Menu : public DialogContainer
/**
Create a new menu stack
*/
explicit Menu(OSystem& osystem);
~Menu() override;
explicit OptionsMenu(OSystem& osystem);
~OptionsMenu() override;
private:
Dialog* baseDialog() override;
@ -48,11 +48,11 @@ class Menu : public DialogContainer
private:
// Following constructors and assignment operators not supported
Menu() = delete;
Menu(const Menu&) = delete;
Menu(Menu&&) = delete;
Menu& operator=(const Menu&) = delete;
Menu& operator=(Menu&&) = delete;
OptionsMenu() = delete;
OptionsMenu(const OptionsMenu&) = delete;
OptionsMenu(OptionsMenu&&) = delete;
OptionsMenu& operator=(const OptionsMenu&) = delete;
OptionsMenu& operator=(OptionsMenu&&) = delete;
};
#endif

View File

@ -20,9 +20,7 @@
#include "PlusRomsSetupDialog.hxx"
static const int MIN_NICK_LEN = 2;
static const int MAX_NICK_LEN = 16;
static const char* MIN_NICK_LEN_STR = "Two";
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PlusRomsSetupDialog::PlusRomsSetupDialog(OSystem& osystem, DialogContainer& parent,
@ -33,7 +31,8 @@ PlusRomsSetupDialog::PlusRomsSetupDialog(OSystem& osystem, DialogContainer& pare
return isalnum(c) || (c == '_');
};
setTextFilter(filter, 0);
setTextFilter(filter);
setToolTip("Enter your PlusCart High Score Club nickname here.");
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -46,6 +45,9 @@ void PlusRomsSetupDialog::loadConfig()
void PlusRomsSetupDialog::saveConfig()
{
instance().settings().setValue("plusroms.nick", getResult(0));
if(instance().settings().getString("plusroms.id") == EmptyString)
instance().settings().setValue("plusroms.id", "12345678901234567890123456789012"); // TODO: generate in PlusROM class
// Note: The user can cancel, so the existance of an ID must be checked (and generated if not existing) when transmitting scores
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -56,13 +58,8 @@ void PlusRomsSetupDialog::handleCommand(CommandSender* sender, int cmd,
{
case GuiObject::kOKCmd:
case EditableWidget::kAcceptCmd:
if(getResult(0).length() >= MIN_NICK_LEN)
{
saveConfig();
instance().eventHandler().leaveMenuMode();
}
else
setMessage(MIN_NICK_LEN_STR + string(" characters minimum"));
saveConfig();
instance().eventHandler().leaveMenuMode();
break;
case kCloseCmd:

View File

@ -47,17 +47,17 @@ QuadTariDialog::QuadTariDialog(GuiObject* boss, const GUI::Font& font, int max_w
VarList::push_back(ctrls, "Paddles", "PADDLES");
//VarList::push_back(ctrls, "Paddles_IAxis", "PADDLES_IAXIS");
//VarList::push_back(ctrls, "Paddles_IAxDr", "PADDLES_IAXDR");
//VarList::push_back(ctrls, "BoosterGrip", "BOOSTERGRIP");
//VarList::push_back(ctrls, "Booster Grip", "BOOSTERGRIP");
VarList::push_back(ctrls, "Driving", "DRIVING");
//VarList::push_back(ctrls, "Keyboard", "KEYBOARD");
//VarList::push_back(ctrls, "AmigaMouse", "AMIGAMOUSE");
//VarList::push_back(ctrls, "AtariMouse", "ATARIMOUSE");
//VarList::push_back(ctrls, "Trakball", "TRAKBALL");
//VarList::push_back(ctrls, "Amiga mouse", "AMIGAMOUSE");
//VarList::push_back(ctrls, "Atari mouse", "ATARIMOUSE");
//VarList::push_back(ctrls, "Trak-Ball", "TRAKBALL");
VarList::push_back(ctrls, "AtariVox", "ATARIVOX");
VarList::push_back(ctrls, "SaveKey", "SAVEKEY");
//VarList::push_back(ctrls, "Sega Genesis", "GENESIS");
//VarList::push_back(ctrls, "KidVid", "KIDVID");
//VarList::push_back(ctrls, "Lightgun", "LIGHTGUN");
//VarList::push_back(ctrls, "Kid Vid", "KIDVID");
//VarList::push_back(ctrls, "Light Gun", "LIGHTGUN");
//VarList::push_back(ctrls, "MindLink", "MINDLINK");
//VarList::push_back(ctrls, "QuadTari", "QUADTARI");

View File

@ -30,7 +30,7 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
StellaSettingsDialog::StellaSettingsDialog(OSystem& osystem, DialogContainer& parent,
int max_w, int max_h, Menu::AppMode mode)
int max_w, int max_h, OptionsMenu::AppMode mode)
: Dialog(osystem, parent, osystem.frameBuffer().font(), "Basic settings"),
myMode{mode}
{
@ -187,12 +187,12 @@ void StellaSettingsDialog::addGameOptions(WidgetArray& wid, int& xpos, int& ypos
VarList::push_back(ctrls, "Auto-detect", "AUTO");
VarList::push_back(ctrls, "Joystick", "JOYSTICK");
VarList::push_back(ctrls, "Paddles", "PADDLES");
VarList::push_back(ctrls, "BoosterGrip", "BOOSTERGRIP");
VarList::push_back(ctrls, "Booster Grip", "BOOSTERGRIP");
VarList::push_back(ctrls, "Driving", "DRIVING");
VarList::push_back(ctrls, "Keyboard", "KEYBOARD");
VarList::push_back(ctrls, "AmigaMouse", "AMIGAMOUSE");
VarList::push_back(ctrls, "AtariMouse", "ATARIMOUSE");
VarList::push_back(ctrls, "Trakball", "TRAKBALL");
VarList::push_back(ctrls, "Amiga mouse", "AMIGAMOUSE");
VarList::push_back(ctrls, "Atari mouse", "ATARIMOUSE");
VarList::push_back(ctrls, "Trak-Ball", "TRAKBALL");
VarList::push_back(ctrls, "Sega Genesis", "GENESIS");
VarList::push_back(ctrls, "QuadTari", "QUADTARI");
@ -351,7 +351,7 @@ void StellaSettingsDialog::handleCommand(CommandSender* sender, int cmd,
saveConfig();
[[fallthrough]];
case GuiObject::kCloseCmd:
if (myMode != Menu::AppMode::emulator)
if (myMode != OptionsMenu::AppMode::emulator)
close();
else
instance().eventHandler().leaveMenuMode();
@ -363,7 +363,7 @@ void StellaSettingsDialog::handleCommand(CommandSender* sender, int cmd,
case kConfirmSwitchCmd:
instance().settings().setValue("basic_settings", false);
if (myMode != Menu::AppMode::emulator)
if (myMode != OptionsMenu::AppMode::emulator)
close();
else
instance().eventHandler().leaveMenuMode();

View File

@ -21,7 +21,7 @@
class PopUpWidget;
#include "Props.hxx"
#include "Menu.hxx"
#include "OptionsMenu.hxx"
#include "Dialog.hxx"
#if defined(RETRON77)
@ -39,7 +39,7 @@ class StellaSettingsDialog : public Dialog
{
public:
StellaSettingsDialog(OSystem& osystem, DialogContainer& parent,
int max_w, int max_h, Menu::AppMode mode);
int max_w, int max_h, OptionsMenu::AppMode mode);
~StellaSettingsDialog() override;
private:
@ -103,7 +103,7 @@ class StellaSettingsDialog : public Dialog
#endif
// Indicates if this dialog is used for global (vs. in-game) settings
Menu::AppMode myMode{Menu::AppMode::emulator};
OptionsMenu::AppMode myMode{OptionsMenu::AppMode::emulator};
enum {
kAdvancedSettings = 'SSad',

View File

@ -23,7 +23,6 @@
#include "Cart.hxx"
#include "CartDPC.hxx"
#include "Dialog.hxx"
#include "Menu.hxx"
#include "OSystem.hxx"
#include "EditTextWidget.hxx"
#include "PopUpWidget.hxx"

View File

@ -30,12 +30,12 @@ MODULE_OBJS := \
src/gui/Launcher.o \
src/gui/ListWidget.o \
src/gui/LoggerDialog.o \
src/gui/Menu.o \
src/gui/MessageBox.o \
src/gui/MessageDialog.o \
src/gui/MessageMenu.o \
src/gui/MinUICommandDialog.o\
src/gui/OptionsDialog.o \
src/gui/OptionsMenu.o \
src/gui/PlusRomsMenu.o\
src/gui/PlusRomsSetupDialog.o\
src/gui/PopUpWidget.o \

View File

@ -981,7 +981,7 @@
<ClCompile Include="..\gui\Launcher.cxx" />
<ClCompile Include="..\gui\LauncherDialog.cxx" />
<ClCompile Include="..\gui\ListWidget.cxx" />
<ClCompile Include="..\gui\Menu.cxx" />
<ClCompile Include="..\gui\OptionsMenu.cxx" />
<ClCompile Include="..\gui\MessageBox.cxx" />
<ClCompile Include="..\gui\OptionsDialog.cxx" />
<ClCompile Include="..\gui\PopUpWidget.cxx" />
@ -2096,7 +2096,7 @@
<ClInclude Include="..\gui\Launcher.hxx" />
<ClInclude Include="..\gui\LauncherDialog.hxx" />
<ClInclude Include="..\gui\ListWidget.hxx" />
<ClInclude Include="..\gui\Menu.hxx" />
<ClInclude Include="..\gui\OptionsMenu.hxx" />
<ClInclude Include="..\gui\MessageBox.hxx" />
<ClInclude Include="..\gui\OptionsDialog.hxx" />
<ClInclude Include="..\gui\PopUpWidget.hxx" />

View File

@ -423,7 +423,7 @@
<ClCompile Include="..\gui\ListWidget.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\Menu.cxx">
<ClCompile Include="..\gui\OptionsMenu.cxx">
<Filter>Source Files\gui</Filter>
</ClCompile>
<ClCompile Include="..\gui\MessageBox.cxx">
@ -1505,7 +1505,7 @@
<ClInclude Include="..\gui\ListWidget.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\Menu.hxx">
<ClInclude Include="..\gui\OptionsMenu.hxx">
<Filter>Header Files\gui</Filter>
</ClInclude>
<ClInclude Include="..\gui\MessageBox.hxx">

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.