diff --git a/docs/index.html b/docs/index.html
index 49e4c50bc..38b3da174 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -1767,7 +1767,17 @@
Backspace |
- Toggle 'Turbo' mode |
+ Decrease emulation speed (disables 'Turbo' mode) |
+ Shift-Control + s |
+ Shift-Control + s |
+
+
+ Increase emulation speed (disables 'Turbo' mode) |
+ Control + s |
+ Control + s |
+
+
+ Toggle 'Turbo' mode (maximum emulation speed) |
Control + t |
Control + t |
diff --git a/src/common/PKeyboardHandler.cxx b/src/common/PKeyboardHandler.cxx
index 6d726f3fc..7532a1632 100644
--- a/src/common/PKeyboardHandler.cxx
+++ b/src/common/PKeyboardHandler.cxx
@@ -525,6 +525,8 @@ PhysicalKeyboardHandler::EventMappingArray PhysicalKeyboardHandler::DefaultCommo
{Event::SettingIncrease, KBDK_KP_9, KBDM_CTRL},
{Event::ToggleInter, KBDK_I, KBDM_CTRL},
+ {Event::DecreaseSpeed, KBDK_S, KBDM_SHIFT | KBDM_CTRL},
+ {Event::IncreaseSpeed, KBDK_S, KBDM_CTRL },
{Event::ToggleTurbo, KBDK_T, KBDM_CTRL},
{Event::ToggleJitter, KBDK_J, MOD3},
{Event::ToggleFrameStats, KBDK_L, MOD3},
diff --git a/src/emucore/Console.cxx b/src/emucore/Console.cxx
index b8d6231a6..9cb5c5087 100644
--- a/src/emucore/Console.cxx
+++ b/src/emucore/Console.cxx
@@ -73,6 +73,45 @@
#include "Console.hxx"
+namespace {
+ // Emulation speed is a positive float that multiplies the framerate. However, the UI controls
+ // adjust speed in terms of a speedup factor (1/10, 1/9 .. 1/2, 1, 2, 3, .., 10). The following
+ // mapping and formatting functions implement this conversion. The speedup factor is represented
+ // by an integer value between -900 and 900 (0 means no speedup).
+
+ constexpr int MAX_SPEED = 900;
+ constexpr int MIN_SPEED = -900;
+ constexpr int SPEED_STEP = 10;
+
+ int mapSpeed(float speed)
+ {
+ speed = std::abs(speed);
+
+ return BSPF::clamp(
+ static_cast(round(100 * (speed >= 1 ? speed - 1 : -1 / speed + 1))),
+ MIN_SPEED, MAX_SPEED
+ );
+ }
+
+ float unmapSpeed(int speed)
+ {
+ float f_speed = static_cast(speed) / 100;
+
+ return speed < 0 ? -1 / (f_speed - 1) : 1 + f_speed;
+ }
+
+ string formatSpeed(int speed) {
+ stringstream ss;
+
+ ss
+ << std::setw(3) << std::fixed << std::setprecision(0)
+ << (unmapSpeed(speed) * 100);
+
+ return ss.str();
+ }
+}
+
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Console::Console(OSystem& osystem, unique_ptr& cart,
const Properties& props, AudioSettings& audioSettings)
@@ -503,6 +542,31 @@ void Console::toggleTurbo()
myOSystem.frameBuffer().showMessage(ss.str());
}
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void Console::changeSpeed(int direction)
+{
+ int speed = mapSpeed(myOSystem.settings().getFloat("speed"));
+ bool turbo = myOSystem.settings().getBool("turbo");
+
+ speed = BSPF::clamp(speed + direction * SPEED_STEP, MIN_SPEED, MAX_SPEED);
+ myOSystem.settings().setValue("speed", unmapSpeed(speed));
+
+ // update rate
+ initializeAudio();
+
+ if(turbo)
+ {
+ myOSystem.settings().setValue("turbo", false);
+ // update VSync
+ initializeVideo();
+ }
+
+ ostringstream val;
+
+ val << formatSpeed(speed) << "%";
+ myOSystem.frameBuffer().showMessage("Emulation speed", val.str(), speed, MIN_SPEED, MAX_SPEED);
+}
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void Console::togglePhosphor()
{
@@ -890,9 +954,8 @@ void Console::changeAutoFireRate(int direction)
if(rate)
val << rate << " Hz";
else
- {
val << "Off";
- }
+
myOSystem.frameBuffer().showMessage("Autofire rate", val.str(), rate, 0, isNTSC ? 30 : 25);
}
diff --git a/src/emucore/Console.hxx b/src/emucore/Console.hxx
index 86595da9f..366e606a0 100644
--- a/src/emucore/Console.hxx
+++ b/src/emucore/Console.hxx
@@ -213,6 +213,12 @@ class Console : public Serializable, public ConsoleIO
*/
void toggleTurbo();
+ /**
+ Change emulation speed
+
+ @param direction +1 indicates increase, -1 indicates decrease.
+ */
+ void changeSpeed(int direction = +1);
/**
Toggles phosphor effect.
diff --git a/src/emucore/Event.hxx b/src/emucore/Event.hxx
index b9a301e7f..52808d77a 100644
--- a/src/emucore/Event.hxx
+++ b/src/emucore/Event.hxx
@@ -127,6 +127,7 @@ class Event
PreviousSettingGroup, NextSettingGroup,
TogglePlayBackMode,
DecreaseAutoFire, IncreaseAutoFire,
+ DecreaseSpeed, IncreaseSpeed,
LastType
};
diff --git a/src/emucore/EventHandler.cxx b/src/emucore/EventHandler.cxx
index 24159b369..75a38b97c 100644
--- a/src/emucore/EventHandler.cxx
+++ b/src/emucore/EventHandler.cxx
@@ -1220,6 +1220,14 @@ void EventHandler::handleEvent(Event::Type event, Int32 value, bool repeated)
///////////////////////////////////////////////////////////////////////////
// Misc events
+ case Event::DecreaseSpeed:
+ if(pressed) myOSystem.console().changeSpeed(-1);
+ return;
+
+ case Event::IncreaseSpeed:
+ if(pressed) myOSystem.console().changeSpeed(+1);
+ return;
+
case Event::ToggleTurbo:
if (pressed && !repeated) myOSystem.console().toggleTurbo();
return;
@@ -2403,7 +2411,9 @@ EventHandler::EmulActionList EventHandler::ourEmulActionList = { {
{ Event::TogglePauseMode, "Toggle Pause mode", "" },
{ Event::StartPauseMode, "Start Pause mode", "" },
{ Event::Fry, "Fry cartridge", "" },
- { Event::ToggleTurbo, "Toggle Turbo mode", "" },
+ { Event::DecreaseSpeed, "Decrease emulation speed", "" },
+ { Event::IncreaseSpeed, "Increase emulation speed", "" },
+ { Event::ToggleTurbo, "Toggle 'Turbo' mode", "" },
{ Event::DebuggerMode, "Toggle Debugger mode", "" },
{ Event::ConsoleSelect, "Select", "" },
@@ -2634,7 +2644,7 @@ EventHandler::MenuActionList EventHandler::ourMenuActionList = { {
const Event::EventSet EventHandler::MiscEvents = {
Event::Quit, Event::ReloadConsole, Event::Fry, Event::StartPauseMode,
Event::TogglePauseMode, Event::OptionsMenuMode, Event::CmdMenuMode, Event::ExitMode,
- Event::ToggleTurbo,
+ Event::ToggleTurbo, Event::DecreaseSpeed, Event::IncreaseSpeed,
Event::TakeSnapshot, Event::ToggleContSnapshots, Event::ToggleContSnapshotsFrame,
// Event::MouseAxisXMove, Event::MouseAxisYMove,
// Event::MouseButtonLeftValue, Event::MouseButtonRightValue,
diff --git a/src/emucore/EventHandler.hxx b/src/emucore/EventHandler.hxx
index 055d56d64..93e167282 100644
--- a/src/emucore/EventHandler.hxx
+++ b/src/emucore/EventHandler.hxx
@@ -558,7 +558,7 @@ class EventHandler
#else
REFRESH_SIZE = 0,
#endif
- EMUL_ACTIONLIST_SIZE = 162 + PNG_SIZE + COMBO_SIZE + REFRESH_SIZE,
+ EMUL_ACTIONLIST_SIZE = 164 + PNG_SIZE + COMBO_SIZE + REFRESH_SIZE,
MENU_ACTIONLIST_SIZE = 18
;