diff --git a/docs/graphics/options_developer.png b/docs/graphics/options_developer.png
index bed6c7229..b8ad043ad 100644
Binary files a/docs/graphics/options_developer.png and b/docs/graphics/options_developer.png differ
diff --git a/docs/graphics/options_developer_dbgcolors.png b/docs/graphics/options_developer_dbgcolors.png
index c86ff7a3b..e4873b905 100644
Binary files a/docs/graphics/options_developer_dbgcolors.png and b/docs/graphics/options_developer_dbgcolors.png differ
diff --git a/docs/graphics/options_developer_debugger.png b/docs/graphics/options_developer_debugger.png
index 01110a573..4be6c2d55 100644
Binary files a/docs/graphics/options_developer_debugger.png and b/docs/graphics/options_developer_debugger.png differ
diff --git a/docs/graphics/options_developer_emulation.png b/docs/graphics/options_developer_emulation.png
index 9ca4eef67..483583dc1 100644
Binary files a/docs/graphics/options_developer_emulation.png and b/docs/graphics/options_developer_emulation.png differ
diff --git a/docs/graphics/options_developer_states.png b/docs/graphics/options_developer_states.png
new file mode 100644
index 000000000..3304e8c0c
Binary files /dev/null and b/docs/graphics/options_developer_states.png differ
diff --git a/docs/index.html b/docs/index.html
index e553353b7..8bba4f505 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -2421,15 +2421,6 @@
Set "Display.PPBlend" property, used for phosphor effect (0-100).
Default is whatever is specified for tv.phosblend. |
-
-
- -thumb.trapfatal <1|0> |
- The default of true allows the Thumb ARM emulation to
- throw an exception and enter the debugger on fatal errors. When disabled, such
- fatal errors are simply logged, and emulation continues. Do not use this
- unless you know exactly what you're doing, as it changes the behaviour as compared
- to real hardware. |
-
The following are available in two sets, one for players (prefixed by "plr.") and one
@@ -2440,64 +2431,67 @@
Argument |
Description |
-
-
-
+
-dev.settings <1|0> |
Select developer (1) or player (0) set. |
-
-
-
+
-<plr.|dev.>stats <1|0> |
Overlay console info on the TIA image during emulation. |
-
-
-
+
-<plr.|dev.>console <2600|7800> |
Select console for B/W and Pause key handling and RAM initialization. |
-
-
-
+
-<plr.|dev.>bankrandom <1|0> |
On reset, randomize the startup bank (only for selected bankswitch types). |
-
-
-
+
-<plr.|dev.>ramrandom <1|0> |
On reset, either randomize all RAM content, or initialize with zero (console = 2600)/startup values (console = 7800) instead. |
-
-
-
+
-<plr.|dev.>cpurandom <S,A,X,Y,P> |
On reset, randomize the content of the specified CPU registers. |
-
-
-
- -<plr.|dev.>debugcolors <1|0> |
- Enable/disable the fixed debug colors. |
-
-
-
- -<plr.|dev.>colorloss <1|0> |
- Enable/disable the PAL color-loss effect. |
-
-
-
- -<plr.|dev.>tv.jitter <1|0> |
- Enable TV jitter/roll effect, when there are too many or too few scanlines
- per frame. |
-
-
-
- -<plr.|dev.>tv.jitter_recovery <1 - 20> |
- When TV jitter/roll effect is enabled, determines how long to delay recovery
- time (recovery spread over multiple frames). |
-
-
-
+
-<plr.|dev.>tiadriven <1|0> |
Set unused TIA pins to be randomly driven high or low on a read/peek.
If disabled, use the last databus value for those pins instead. |
+
+ -<plr.|dev.>thumb.trapfatal <1|0> |
+ The default of true allows the Thumb ARM emulation to
+ throw an exception and enter the debugger on fatal errors. When disabled, such
+ fatal errors are simply logged, and emulation continues. Do not use this
+ unless you know exactly what you're doing, as it changes the behaviour as compared
+ to real hardware. |
+
+ -<plr.|dev.>tv.jitter <1|0> |
+ Enable TV jitter/roll effect, when there are too many or too few scanlines
+ per frame. |
+
+ -<plr.|dev.>tv.jitter_recovery <1 - 20> |
+ When TV jitter/roll effect is enabled, determines how long to delay recovery
+ time (recovery spread over multiple frames). |
+
+ -<plr.|dev.>colorloss <1|0> |
+ Enable/disable the PAL color-loss effect. |
+
+ -<plr.|dev.>debugcolors <1|0> |
+ Enable/disable the fixed debug colors. |
+
+ -<plr.|dev.>rewind <1|0> |
+ Enables continuous rewind |
+
+ -<plr.|dev.>rewind.size <100 - 1000> |
+ Defines the rewind buffer size. |
+
+
+ -<plr.|dev.>rewind.uncompressed <100 - 1000> |
+ Defines the uncompressed rewind buffer size. Must be <= rewind buffer size. |
+
+
+ -<plr.|dev.>rewind.interval <0 - 5> |
+ Defines the interval between two save states. |
+
+
+ -<plr.|dev.>rewind.horizon <0 - 6> |
+ Defines the horizon of the rewind buffer. |
@@ -3023,11 +3017,28 @@
Random startup bank | Randomize the startup bank (only for selected bankswitch types) | -plr.bankrandom -dev.bankrandom |
Randomize zero-page ... | When loading a ROM, randomize all RAM content instead of initializing with all zeroes (for 'Console' = 'Atari 2600' only) | -plr.ramrandom -dev.ramrandom |
Randomize CPU | When loading a ROM, randomize the content of the specified CPU registers | -plr.cpurandom -dev.cpurandom |
+ Drive unused TIA pins ... | Unused TIA pins are read random instead of the last databus values | -plr.tiadriven -dev.tiadriven |
+ Fatal ARM emulation ... | Thumb ARM emulation throws an exception and enters the debugger on fatal errors. | -plr.thumb.trapfatal -dev.thumb.trapfatal |
+
+
+
+
+
+ Developer Settings dialog (Video):
+
+
+  |
+ |
+
+
+ Item | Brief description | For more information, see CommandLine |
+ Jitter/roll effect | Emulate screen roll with inconsistent scanline count | -plr.tv.jitter -dev.tv.jitter |
+ (Jitter/roll) Recovery | Determines recovery time for screen rolling | -plr.tv.jitter_recovery -dev.tv.jitter_recovery |
PAL color-loss | Use PAL color-loss effect | -plr.colorloss -dev.colorloss |
Debug colors | Use fixed debug colors | -plr.debugcolors -dev.debugcolors |
- Jitter/roll effect | Emulate screen roll with inconsistent scanline count | -plr.tv.jitter -dev.tv.jitter |
- (Jitter/roll) Recovery | Determines recovery time for screen rolling | -plr.tv.jitter_recovery -dev.tv.jitter_recovery |
- Drive unused TIA pins ... | Unused TIA pins are read random instead of the last databus values | -plr.tiadriven -dev.tiadriven |
+ Player 0 Missile 0 Player 1
+ Missile 1 Playfield Ball |
+ Set color for specific object in debug colors mode (PF0, PF1 and PF2 are have slightly different luminance, disabled in ROM launcher mode) | -tia.dbgcolors |
|
@@ -3036,39 +3047,56 @@
Developer Settings dialog (States) TODO
-
+  |
|
- Item | Brief description | For more information, see CommandLine |
- | | -.plr -.dev |
- | | -.plr -.dev |
- | | -.plr -.dev |
- | | -.plr -.dev |
- | | -.plr -.dev |
+
+ Item | Brief description | For more information, see CommandLine |
+
+ Continuous rewind |
+
+ When continuous rewind is enabled, Stella will automatically
+ create new save states in the interval described below.
+ Note: This buffer is identical with the one described in
+ Debugger/Global Buttons.
+ It is independent from the save states manually created
+ with F9.
+ |
+ -plr.rewind -dev.rewind |
+
+ Buffer size |
+
+ Defines the rewind buffer size. The larger the buffer, the less
+ save states have to be compressed to reach the horizon.
+ |
+ -plr.rewind.size -dev.rewind.size |
+
+ Uncompressed size |
+
+ Defines the uncompressed rewind buffer size. States within this
+ area will not be compressed and keep their initial interval. |
+ -plr.rewind.uncompressed -dev.rewind.uncompressed |
+
+ Interval |
+ Defines the interval between two save states when they are created. |
+ -plr.rewind.interval -dev.rewind.interval |
+
+ Horizon |
+
+ Defines the horizon of the rewind buffer. A large horizon allows
+ going back further in time. To reach the horizon, save states
+ will be compressed. This means that more and more intermediate
+ states will be removed and the interval between compressed states
+ becomes larger the further they are back in time.
+ |
+ -plr.rewind.horizon -dev.rewind.horizon |
+
|
- Developer Settings dialog (Debug Colors):
-
-
-  |
- |
-
-
- Item | Brief description | For more information, see CommandLine |
- Player 0 Missile 0 Player 1
- Missile 1 Playfield Ball |
- Set color for specific object in debug colors mode (PF0, PF1 and PF2 are have slightly different luminance, disabled in ROM launcher mode) | -tia.dbgcolors |
-
- |
-
-
-
-
-
Developer Settings dialog (Debugger)
diff --git a/src/emucore/Settings.cxx b/src/emucore/Settings.cxx
index 51a5a237f..c2dbd6e83 100644
--- a/src/emucore/Settings.cxx
+++ b/src/emucore/Settings.cxx
@@ -157,8 +157,13 @@ Settings::Settings(OSystem& osystem)
setInternal("plr.console", "2600"); // 7800
setInternal("plr.rewind", false);
setInternal("plr.rewind.size", 100);
+ setInternal("plr.rewind.uncompressed", 30);
setInternal("plr.rewind.interval", 4); // = 1 second
setInternal("plr.rewind.horizon", 5); // = ~10 minutes
+#ifdef DTHUMB_SUPPORT
+ // Thumb ARM emulation options
+ setInternal("plr.thumb.trapfatal", "false");
+#endif
// developer settings
setInternal("dev.settings", "false");
@@ -174,12 +179,13 @@ Settings::Settings(OSystem& osystem)
setInternal("dev.console", "2600"); // 7800
setInternal("dev.rewind", true);
setInternal("dev.rewind.size", 100);
+ setInternal("dev.rewind.uncompressed", 60);
setInternal("dev.rewind.interval", 2); // = 1 frame
setInternal("dev.rewind.horizon", 3); // = ~10 seconds
#ifdef DTHUMB_SUPPORT
// Thumb ARM emulation options
- setInternal("thumb.trapfatal", "true");
+ setInternal("dev.thumb.trapfatal", "true");
#endif
}
@@ -318,8 +324,15 @@ void Settings::validate()
i = getInt("dev.tv.jitter_recovery");
if(i < 1 || i > 20) setInternal("dev.tv.jitter_recovery", "2");
- i = getInt("dev.rewind.size");
- if (i < 100 ||i > 1000) setInternal("dev.rewind.size", 100);
+ int size = getInt("dev.rewind.size");
+ if(size < 100 || size > 1000)
+ {
+ setInternal("dev.rewind.size", 100);
+ size = 100;
+ }
+
+ i = getInt("dev.rewind.uncompressed");
+ if(i < 0 || i > size) setInternal("dev.rewind.uncompressed", size);
i = getInt("dev.rewind.interval");
if(i < 0 || i > 5) setInternal("dev.rewind.interval", 2);
@@ -330,8 +343,15 @@ void Settings::validate()
i = getInt("plr.tv.jitter_recovery");
if(i < 1 || i > 20) setInternal("plr.tv.jitter_recovery", "10");
- i = getInt("plr.rewind.size");
- if(i < 100 || i > 1000) setInternal("plr.rewind.size", 100);
+ size = getInt("plr.rewind.size");
+ if(size < 100 || size > 1000)
+ {
+ setInternal("plr.rewind.size", 100);
+ size = 100;
+ }
+
+ i = getInt("plr.rewind.uncompressed");
+ if(i < 0 || i > size) setInternal("plr.rewind.uncompressed", size);
i = getInt("plr.rewind.interval");
if(i < 0 || i > 5) setInternal("plr.rewind.interval", 4);
diff --git a/src/gui/DeveloperDialog.cxx b/src/gui/DeveloperDialog.cxx
index 231bfdc3c..1f2498465 100644
--- a/src/gui/DeveloperDialog.cxx
+++ b/src/gui/DeveloperDialog.cxx
@@ -47,6 +47,7 @@ DeveloperDialog::DeveloperDialog(OSystem& osystem, DialogContainer& parent,
myMaxWidth(max_w),
myMaxHeight(max_h)
{
+ const int VGAP = 4;
const int lineHeight = font.getLineHeight(),
fontWidth = font.getMaxCharWidth(),
buttonHeight = font.getLineHeight() + 4;
@@ -54,7 +55,7 @@ DeveloperDialog::DeveloperDialog(OSystem& osystem, DialogContainer& parent,
// Set real dimensions
_w = std::min(53 * fontWidth + 10, max_w);
- _h = std::min(15 * (lineHeight + 4) + 14, max_h);
+ _h = std::min(15 * (lineHeight + VGAP) + 14, max_h);
// The tab widget
xpos = 2; ypos = 4;
@@ -62,8 +63,8 @@ DeveloperDialog::DeveloperDialog(OSystem& osystem, DialogContainer& parent,
addTabWidget(myTab);
addEmulationTab(font);
+ addVideoTab(font);
addStatesTab(font);
- addDebugColorsTab(font);
addDebuggerTab(font);
addDefaultOKCancelButtons(font);
@@ -83,7 +84,7 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
int fontWidth = font.getMaxCharWidth(), fontHeight = font.getFontHeight();
WidgetArray wid;
VariantList items;
- int tabID = myTab->addTab("Emulation");
+ int tabID = myTab->addTab(" Emulation ");
// settings set
mySettingsGroup0 = new RadioButtonGroup();
@@ -92,7 +93,7 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
ypos += lineHeight + VGAP;
r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Developer settings", mySettingsGroup0, kDevSettings);
wid.push_back(r);
- ypos += lineHeight + VGAP * 2;
+ ypos += lineHeight + VGAP * 1;
myFrameStatsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "Frame statistics");
wid.push_back(myFrameStatsWidget);
@@ -105,22 +106,24 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
int lwidth = font.getStringWidth("Console ");
int pwidth = font.getStringWidth("Atari 2600");
- myConsoleWidget = new PopUpWidget(myTab, font, HBORDER + INDENT * 1, ypos, pwidth, lineHeight, items, "Console ", lwidth, kConsole);
+ myConsoleWidget = new PopUpWidget(myTab, font, HBORDER + INDENT * 1, ypos, pwidth, lineHeight, items,
+ "Console ", lwidth, kConsole);
wid.push_back(myConsoleWidget);
ypos += lineHeight + VGAP;
// Randomize items
- myLoadingROMLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT*1, ypos + 1, "When loading a ROM:", kTextAlignLeft);
+ myLoadingROMLabel = new StaticTextWidget(myTab, font, HBORDER + INDENT*1, ypos + 1, "When loading a ROM:");
wid.push_back(myLoadingROMLabel);
ypos += lineHeight + VGAP;
- myRandomBankWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1, "Random startup bank");
+ myRandomBankWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 2, ypos + 1,
+ "Random startup bank");
wid.push_back(myRandomBankWidget);
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", kRandRAMID);
wid.push_back(myRandomizeRAMWidget);
ypos += lineHeight + VGAP;
@@ -140,37 +143,119 @@ void DeveloperDialog::addEmulationTab(const GUI::Font& font)
}
ypos += lineHeight + VGAP;
- // debug colors
- myDebugColorsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "Debug colors");
- wid.push_back(myDebugColorsWidget);
+
+ // How to handle undriven TIA pins
+ myUndrivenPinsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1,
+ "Drive unused TIA pins randomly on a read/peek");
+ wid.push_back(myUndrivenPinsWidget);
+ ypos += lineHeight + VGAP;
+
+#ifdef DTHUMB_SUPPORT
+ // Thumb ARM emulation exception
+ myThumbExceptionWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1,
+ "Fatal ARM emulation error throws exception");
+ wid.push_back(myThumbExceptionWidget);
+#endif
+
+ // Add items for tab 0
+ addToFocusList(wid, myTab, tabID);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void DeveloperDialog::addVideoTab(const GUI::Font& font)
+{
+ const int HBORDER = 10;
+ const int INDENT = 16 + 4;
+ const int VBORDER = 8;
+ const int VGAP = 4;
+ int ypos = VBORDER;
+ int lineHeight = font.getLineHeight();
+ int fontWidth = font.getMaxCharWidth(), fontHeight = font.getFontHeight();
+ int lwidth = font.getStringWidth("Intensity ");
+ int pwidth = font.getMaxCharWidth() * 6;
+ WidgetArray wid;
+ VariantList items;
+ int tabID = myTab->addTab("Video");
+
+ wid.clear();
+ ypos = VBORDER;
+
+ // settings set
+ mySettingsGroup1 = new RadioButtonGroup();
+ RadioButtonWidget* r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Player settings", mySettingsGroup1, kPlrSettings);
+ wid.push_back(r);
+ ypos += lineHeight + VGAP;
+ r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Developer settings", mySettingsGroup1, kDevSettings);
+ wid.push_back(r);
+ ypos += lineHeight + VGAP * 1;
+
+ // TV jitter effect
+ myTVJitterWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "Jitter/roll effect", kTVJitter);
+ wid.push_back(myTVJitterWidget);
+ myTVJitterRecWidget = new SliderWidget(myTab, font,
+ myTVJitterWidget->getRight() + fontWidth * 3, ypos - 1,
+ 8 * fontWidth, lineHeight, "Recovery ",
+ font.getStringWidth("Recovery "), kTVJitterChanged);
+ myTVJitterRecWidget->setMinValue(1); myTVJitterRecWidget->setMaxValue(20);
+ wid.push_back(myTVJitterRecWidget);
+ myTVJitterRecLabelWidget = new StaticTextWidget(myTab, font,
+ myTVJitterRecWidget->getRight() + 4, myTVJitterRecWidget->getTop() + 2,
+ 5 * fontWidth, fontHeight, "", kTextAlignLeft);
+ myTVJitterRecLabelWidget->setFlags(WIDGET_CLEARBG);
+ wid.push_back(myTVJitterRecLabelWidget);
ypos += lineHeight + VGAP;
myColorLossWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "PAL color-loss");
wid.push_back(myColorLossWidget);
ypos += lineHeight + VGAP;
- // TV jitter effect
- myTVJitterWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "Jitter/roll effect", kTVJitter);
- wid.push_back(myTVJitterWidget);
- myTVJitterRecWidget = new SliderWidget(myTab, font,
- myTVJitterWidget->getRight() + fontWidth * 3, ypos - 1,
- 8 * fontWidth, lineHeight, "Recovery ",
- font.getStringWidth("Recovery "), kTVJitterChanged);
- myTVJitterRecWidget->setMinValue(1); myTVJitterRecWidget->setMaxValue(20);
- wid.push_back(myTVJitterRecWidget);
- myTVJitterRecLabelWidget = new StaticTextWidget(myTab, font,
- myTVJitterRecWidget->getRight() + 4, myTVJitterRecWidget->getTop() + 2,
- 5 * fontWidth, fontHeight, "", kTextAlignLeft);
- myTVJitterRecLabelWidget->setFlags(WIDGET_CLEARBG);
- wid.push_back(myTVJitterRecLabelWidget);
- ypos += lineHeight + VGAP;
+ // debug colors
+ myDebugColorsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1, "Debug colors (*)");
+ wid.push_back(myDebugColorsWidget);
+ ypos += lineHeight + VGAP + 2;
- // How to handle undriven TIA pins
- myUndrivenPinsWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT * 1, ypos + 1,
- "Drive unused TIA pins randomly on a read/peek");
- wid.push_back(myUndrivenPinsWidget);
+ //StaticTextWidget* s = new StaticTextWidget(myTab, font, HBORDER, ypos, "Debug Colors ");
+ //ypos += lineHeight + VGAP;
- // Add items for tab 0
+ items.clear();
+ VarList::push_back(items, "Red", "r");
+ VarList::push_back(items, "Orange", "o");
+ VarList::push_back(items, "Yellow", "y");
+ VarList::push_back(items, "Green", "g");
+ VarList::push_back(items, "Purple", "p");
+ VarList::push_back(items, "Blue", "b");
+
+ static constexpr int dbg_cmds[DEBUG_COLORS] = {
+ kP0ColourChangedCmd, kM0ColourChangedCmd, kP1ColourChangedCmd,
+ kM1ColourChangedCmd, kPFColourChangedCmd, kBLColourChangedCmd
+ };
+
+ auto createDebugColourWidgets = [&](int idx, const string& desc)
+ {
+ int x = HBORDER + INDENT * 1;
+ myDbgColour[idx] = new PopUpWidget(myTab, font, x, ypos - 1,
+ pwidth, lineHeight, items, desc, lwidth, dbg_cmds[idx]);
+ wid.push_back(myDbgColour[idx]);
+ x += myDbgColour[idx]->getWidth() + 10;
+ myDbgColourSwatch[idx] = new ColorWidget(myTab, font, x, ypos - 1,
+ uInt32(2 * lineHeight), lineHeight);
+ ypos += lineHeight + VGAP * 1;
+ };
+
+ createDebugColourWidgets(0, "Player 0 ");
+ createDebugColourWidgets(1, "Missile 0 ");
+ createDebugColourWidgets(2, "Player 1 ");
+ createDebugColourWidgets(3, "Missile 1 ");
+ createDebugColourWidgets(4, "Playfield ");
+ createDebugColourWidgets(5, "Ball ");
+
+ // Add message concerning usage
+ const GUI::Font& infofont = instance().frameBuffer().infoFont();
+ ypos = myTab->getHeight() - 5 - fontHeight - infofont.getFontHeight() - 10;
+ //new StaticTextWidget(myTab, infofont, 10, ypos, "(*) Colors must be different for each object");
+ new StaticTextWidget(myTab, infofont, HBORDER, ypos, "(*) colors identical for player and developer settings");
+
+ // Add items for tab 2
addToFocusList(wid, myTab, tabID);
}
@@ -188,13 +273,13 @@ void DeveloperDialog::addStatesTab(const GUI::Font& font)
int tabID = myTab->addTab("States");
// settings set
- mySettingsGroup1 = new RadioButtonGroup();
- RadioButtonWidget* r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Player settings", mySettingsGroup1, kPlrSettings);
+ mySettingsGroup2 = new RadioButtonGroup();
+ RadioButtonWidget* r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Player settings", mySettingsGroup2, kPlrSettings);
wid.push_back(r);
ypos += lineHeight + VGAP;
- r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Developer settings", mySettingsGroup1, kDevSettings);
+ r = new RadioButtonWidget(myTab, font, HBORDER, ypos + 1, "Developer settings", mySettingsGroup2, kDevSettings);
wid.push_back(r);
- ypos += lineHeight + VGAP * 2;
+ ypos += lineHeight + VGAP * 1;
myContinuousRewindWidget = new CheckboxWidget(myTab, font, HBORDER + INDENT, ypos + 1, "Continuous rewind", kRewind);
wid.push_back(myContinuousRewindWidget);
@@ -202,29 +287,42 @@ void DeveloperDialog::addStatesTab(const GUI::Font& font)
int sWidth = font.getMaxCharWidth() * 8;
myStateSizeWidget = new SliderWidget(myTab, font, HBORDER + INDENT * 2, ypos - 1, sWidth, lineHeight,
- "Buffer size (*) ", 0, kSizeChanged);
+ "Buffer size (*) ", 0, kSizeChanged);
myStateSizeWidget->setMinValue(100);
myStateSizeWidget->setMaxValue(1000);
- myStateSizeWidget->setStepValue(100);
+ myStateSizeWidget->setStepValue(20);
wid.push_back(myStateSizeWidget);
- myStateSizeLabelWidget = new StaticTextWidget(myTab, font, myStateSizeWidget->getRight() + 4, myStateSizeWidget->getTop() + 2, "100 ");
-
+ myStateSizeLabelWidget = new StaticTextWidget(myTab, font, myStateSizeWidget->getRight() + 4,
+ myStateSizeWidget->getTop() + 2, "100 ");
ypos += lineHeight + VGAP;
+
+ myUncompressedWidget = new SliderWidget(myTab, font, HBORDER + INDENT * 2, ypos - 1, sWidth, lineHeight,
+ "Uncompressed size (*) ", 0, kUncompressedChanged);
+ myUncompressedWidget->setMinValue(0);
+ myUncompressedWidget->setMaxValue(1000);
+ myUncompressedWidget->setStepValue(20);
+ wid.push_back(myUncompressedWidget);
+ myUncompressedLabelWidget = new StaticTextWidget(myTab, font, myUncompressedWidget->getRight() + 4,
+ myUncompressedWidget->getTop() + 2, "50 ");
+ ypos += lineHeight + VGAP;
+
myStateIntervalWidget = new SliderWidget(myTab, font, HBORDER + INDENT * 2, ypos - 1, sWidth, lineHeight,
- "Interval ", 0, kIntervalChanged);
+ "Interval ", 0, kIntervalChanged);
myStateIntervalWidget->setMinValue(0);
myStateIntervalWidget->setMaxValue(NUM_INTERVALS - 1);
wid.push_back(myStateIntervalWidget);
- myStateIntervalLabelWidget = new StaticTextWidget(myTab, font, myStateIntervalWidget->getRight() + 4, myStateIntervalWidget->getTop() + 2, "50 scanlines");
-
+ myStateIntervalLabelWidget = new StaticTextWidget(myTab, font, myStateIntervalWidget->getRight() + 4,
+ myStateIntervalWidget->getTop() + 2, "50 scanlines");
ypos += lineHeight + VGAP;
+
myStateHorizonWidget = new SliderWidget(myTab, font, HBORDER + INDENT * 2, ypos - 1, sWidth, lineHeight,
- "Horizon ", 0, kHorizonChanged);
+ "Horizon ", 0, kHorizonChanged);
myStateHorizonWidget->setMinValue(0);
myStateHorizonWidget->setMaxValue(NUM_HORIZONS - 1);
wid.push_back(myStateHorizonWidget);
- myStateHorizonLabelWidget = new StaticTextWidget(myTab, font, myStateHorizonWidget->getRight() + 4, myStateHorizonWidget->getTop() + 2, "~60 minutes");
+ myStateHorizonLabelWidget = new StaticTextWidget(myTab, font, myStateHorizonWidget->getRight() + 4,
+ myStateHorizonWidget->getTop() + 2, "~60 minutes");
// Add message concerning usage
const GUI::Font& infofont = instance().frameBuffer().infoFont();
@@ -234,67 +332,6 @@ void DeveloperDialog::addStatesTab(const GUI::Font& font)
addToFocusList(wid, myTab, tabID);
}
-
-// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-void DeveloperDialog::addDebugColorsTab(const GUI::Font& font)
-{
- const int HBORDER = 10;
- const int INDENT = 16 + 4;
- const int VBORDER = 8;
- const int VGAP = 4;
- int ypos = VBORDER;
- int lineHeight = font.getLineHeight();
- int fontWidth = font.getMaxCharWidth(), fontHeight = font.getFontHeight();
- int lwidth = font.getStringWidth("Intensity ");
- int pwidth = font.getMaxCharWidth() * 6;
- WidgetArray wid;
- VariantList items;
- int tabID = myTab->addTab("Debug Colors");
-
- wid.clear();
- ypos = VBORDER;
-
- items.clear();
- VarList::push_back(items, "Red", "r");
- VarList::push_back(items, "Orange", "o");
- VarList::push_back(items, "Yellow", "y");
- VarList::push_back(items, "Green", "g");
- VarList::push_back(items, "Blue", "b");
- VarList::push_back(items, "Purple", "p");
-
- static constexpr int dbg_cmds[6] = {
- kP0ColourChangedCmd, kM0ColourChangedCmd, kP1ColourChangedCmd,
- kM1ColourChangedCmd, kPFColourChangedCmd, kBLColourChangedCmd
- };
-
- auto createDebugColourWidgets = [&](int idx, const string& desc)
- {
- int x = HBORDER;
- myDbgColour[idx] = new PopUpWidget(myTab, font, x, ypos,
- pwidth, lineHeight, items, desc, lwidth, dbg_cmds[idx]);
- wid.push_back(myDbgColour[idx]);
- x += myDbgColour[idx]->getWidth() + 10;
- myDbgColourSwatch[idx] = new ColorWidget(myTab, font, x, ypos,
- uInt32(2 * lineHeight), lineHeight);
- ypos += lineHeight + VGAP * 1;
- };
-
- createDebugColourWidgets(0, "Player 0 ");
- createDebugColourWidgets(1, "Missile 0 ");
- createDebugColourWidgets(2, "Player 1 ");
- createDebugColourWidgets(3, "Missile 1 ");
- createDebugColourWidgets(4, "Playfield ");
- createDebugColourWidgets(5, "Ball ");
-
- // Add message concerning usage
- const GUI::Font& infofont = instance().frameBuffer().infoFont();
- ypos = myTab->getHeight() - 5 - fontHeight - infofont.getFontHeight() - 10;
- new StaticTextWidget(myTab, infofont, 10, ypos, "(*) Colors must be different for each object");
-
- // Add items for tab 2
- addToFocusList(wid, myTab, tabID);
-}
-
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DeveloperDialog::addDebuggerTab(const GUI::Font& font)
{
@@ -429,6 +466,11 @@ void DeveloperDialog::loadSettings(SettingsSet set)
myRandomBank[set] = instance().settings().getBool(prefix + "bankrandom");
myRandomizeRAM[set] = instance().settings().getBool(prefix + "ramrandom");
myRandomizeCPU[set] = instance().settings().getString(prefix + "cpurandom");
+ // Undriven TIA pins
+ myUndrivenPins[set] = instance().settings().getBool(prefix + "tiadriven");
+ // Thumb ARM emulation exception
+ myThumbException[set] = instance().settings().getBool(prefix + "thumb.trapfatal");
+
// Debug colors
myDebugColors[set] = instance().settings().getBool(prefix + "debugcolors");
// PAL color-loss effect
@@ -436,12 +478,11 @@ void DeveloperDialog::loadSettings(SettingsSet set)
// Jitter
myTVJitter[set] = instance().settings().getBool(prefix + "tv.jitter");
myTVJitterRec[set] = instance().settings().getInt(prefix + "tv.jitter_recovery");
- // Undriven TIA pins
- myUndrivenPins[set] = instance().settings().getBool(prefix + "tiadriven");
// States
myContinuousRewind[set] = instance().settings().getBool(prefix + "rewind");
myStateSize[set] = instance().settings().getInt(prefix + "rewind.size");
+ myUncompressed[set] = instance().settings().getInt(prefix + "rewind.uncompressed");
myStateInterval[set] = instance().settings().getInt(prefix + "rewind.interval");
myStateHorizon[set] = instance().settings().getInt(prefix + "rewind.horizon");
}
@@ -457,6 +498,11 @@ void DeveloperDialog::saveSettings(SettingsSet set)
instance().settings().setValue(prefix + "bankrandom", myRandomBank[set]);
instance().settings().setValue(prefix + "ramrandom", myRandomizeRAM[set]);
instance().settings().setValue(prefix + "cpurandom", myRandomizeCPU[set]);
+ // Undriven TIA pins
+ instance().settings().setValue(prefix + "tiadriven", myUndrivenPins[set]);
+ // Thumb ARM emulation exception
+ instance().settings().setValue(prefix + "thumb.trapfatal", myThumbException[set]);
+
// Debug colors
instance().settings().setValue(prefix + "debugcolors", myDebugColors[set]);
// PAL color loss
@@ -464,12 +510,11 @@ void DeveloperDialog::saveSettings(SettingsSet set)
// Jitter
instance().settings().setValue(prefix + "tv.jitter", myTVJitter[set]);
instance().settings().setValue(prefix + "tv.jitter_recovery", myTVJitterRec[set]);
- // Undriven TIA pins
- instance().settings().setValue(prefix + "tiadriven", myUndrivenPins[set]);
// States
instance().settings().setValue(prefix + "rewind", myContinuousRewind[set]);
instance().settings().setValue(prefix + "rewind.size", myStateSize[set]);
+ instance().settings().setValue(prefix + "rewind.uncompressed", myUncompressed[set]);
instance().settings().setValue(prefix + "rewind.interval", myStateInterval[set]);
instance().settings().setValue(prefix + "rewind.horizon", myStateHorizon[set]);
}
@@ -488,6 +533,11 @@ void DeveloperDialog::getWidgetStates(SettingsSet set)
if(myRandomizeCPUWidget[i]->getState())
cpurandom += cpuregs[i];
myRandomizeCPU[set] = cpurandom;
+ // Undriven TIA pins
+ myUndrivenPins[set] = myUndrivenPinsWidget->getState();
+ // Thumb ARM emulation exception
+ myThumbException[set] = myThumbExceptionWidget->getState();
+
// Debug colors
myDebugColors[set] = myDebugColorsWidget->getState();
// PAL color-loss effect
@@ -495,12 +545,11 @@ void DeveloperDialog::getWidgetStates(SettingsSet set)
// Jitter
myTVJitter[set] = myTVJitterWidget->getState();
myTVJitterRec[set] = myTVJitterRecWidget->getValue();
- // Undriven TIA pins
- myUndrivenPins[set] = myUndrivenPinsWidget->getState();
// States
myContinuousRewind[set] = myContinuousRewindWidget->getState();
myStateSize[set] = myStateSizeWidget->getValue();
+ myUncompressed[set] = myUncompressedWidget->getValue();
myStateInterval[set] = myStateIntervalWidget->getValue();
myStateHorizon[set] = myStateHorizonWidget->getValue();
}
@@ -518,6 +567,13 @@ void DeveloperDialog::setWidgetStates(SettingsSet set)
const char* const cpuregs[] = { "S", "A", "X", "Y", "P" };
for(int i = 0; i < 5; ++i)
myRandomizeCPUWidget[i]->setState(BSPF::containsIgnoreCase(cpurandom, cpuregs[i]));
+ // Undriven TIA pins
+ myUndrivenPinsWidget->setState(myUndrivenPins[set]);
+ // Thumb ARM emulation exception
+ myThumbExceptionWidget->setState(myThumbException[set]);
+
+ handleConsole();
+
// Debug colors
myDebugColorsWidget->setState(myDebugColors[set]);
// PAL color-loss effect
@@ -525,21 +581,20 @@ void DeveloperDialog::setWidgetStates(SettingsSet set)
// Jitter
myTVJitterWidget->setState(myTVJitter[set]);
myTVJitterRecWidget->setValue(myTVJitterRec[set]);
- // Undriven TIA pins
- myUndrivenPinsWidget->setState(myUndrivenPins[set]);
- handleConsole();
handleTVJitterChange(myTVJitterWidget->getState());
handleEnableDebugColors();
// States
myContinuousRewindWidget->setState(myContinuousRewind[set]);
myStateSizeWidget->setValue(myStateSize[set]);
+ myUncompressedWidget->setValue(myUncompressed[set]);
myStateIntervalWidget->setValue(myStateInterval[set]);
myStateHorizonWidget->setValue(myStateHorizon[set]);
handleRewind();
handleSize();
+ handleUncompressed();
handleInterval();
handleHorizon();
}
@@ -551,6 +606,7 @@ void DeveloperDialog::loadConfig()
mySettings = devSettings;
mySettingsGroup0->setSelected(devSettings ? 1 : 0);
mySettingsGroup1->setSelected(devSettings ? 1 : 0);
+ mySettingsGroup2->setSelected(devSettings ? 1 : 0);
// load both setting sets...
loadSettings(SettingsSet::player);
@@ -612,7 +668,7 @@ void DeveloperDialog::saveConfig()
// Debug colours
string dbgcolors;
- for(int i = 0; i < 6; ++i)
+ for(int i = 0; i < DEBUG_COLORS; ++i)
dbgcolors += myDbgColour[i]->getSelectedTag().toString();
if(instance().hasConsole() &&
instance().console().tia().setFixedColorPalette(dbgcolors))
@@ -627,17 +683,18 @@ void DeveloperDialog::saveConfig()
// define interval growth factor
uInt32 size = myStateSizeWidget->getValue();
+ uInt32 uncompressed = myUncompressedWidget->getValue();
uInt64 horizon = HORIZON_CYCLES[myStateHorizonWidget->getValue()];
double factor, minFactor = 1, maxFactor = 2;
while(true)
{
double interval = INTERVAL_CYCLES[myStateIntervalWidget->getValue()];
- double cycleSum = 0.0;
+ double cycleSum = interval * uncompressed;
// calculate next factor
factor = (minFactor + maxFactor) / 2;
// sum up interval cycles
- for(uInt32 i = 0; i < size; ++i)
+ for(uInt32 i = uncompressed; i < size; ++i)
{
cycleSum += interval;
interval *= factor;
@@ -686,32 +743,37 @@ void DeveloperDialog::setDefaults()
myRandomBank[set] = devSettings ? true : false;
myRandomizeRAM[set] = devSettings ? true : false;
myRandomizeCPU[set] = devSettings ? "SAXYP" : "";
- // Debug colors
- myDebugColors[set] = false;
- // PAL color-loss effect
- myColorLoss[set] = devSettings ? true : false;
- // Jitter
- myTVJitter[set] = true;
- myTVJitterRec[set] = devSettings ? 2 : 10;
// Undriven TIA pins
myUndrivenPins[set] = devSettings ? true : false;
+ // Thumb ARM emulation exception
+ myThumbException[set] = devSettings ? true : false;
setWidgetStates(set);
break;
- case 1: // States
+ case 1: // Video
+ // Jitter
+ myTVJitter[set] = true;
+ myTVJitterRec[set] = devSettings ? 2 : 10;
+ // PAL color-loss effect
+ myColorLoss[set] = devSettings ? true : false;
+ // Debug colors
+ myDebugColors[set] = false;
+ handleDebugColours("roygpb");
+
+ setWidgetStates(set);
+ break;
+
+ case 2: // States
myContinuousRewind[set] = devSettings ? true : false;
myStateSize[set] = 100;
+ myUncompressed[set] = devSettings ? 60 : 30;
myStateInterval[set] = devSettings ? 2 : 4;
myStateHorizon[set] = devSettings ? 3 : 5;
setWidgetStates(set);
break;
- case 2: // Debug colours
- handleDebugColours("roygpb");
- break;
-
case 3: // Debugger options
{
#ifdef DEBUGGER_SUPPORT
@@ -770,6 +832,10 @@ void DeveloperDialog::handleCommand(CommandSender* sender, int cmd, int data, in
handleSize();
break;
+ case kUncompressedChanged:
+ handleUncompressed();
+ break;
+
case kIntervalChanged:
handleInterval();
break;
@@ -843,6 +909,7 @@ void DeveloperDialog::handleSettings(bool devSettings)
mySettings = devSettings; // block redundant events first!
mySettingsGroup0->setSelected(devSettings ? 1 : 0);
mySettingsGroup1->setSelected(devSettings ? 1 : 0);
+ mySettingsGroup2->setSelected(devSettings ? 1 : 0);
getWidgetStates(devSettings ? SettingsSet::player : SettingsSet::developer);
setWidgetStates(devSettings ? SettingsSet::developer : SettingsSet::player);
}
@@ -884,6 +951,9 @@ void DeveloperDialog::handleRewind()
myStateSizeWidget->setEnabled(enable);
myStateSizeLabelWidget->setEnabled(enable);
+ myUncompressedWidget->setEnabled(enable);
+ myUncompressedLabelWidget->setEnabled(enable);
+
myStateIntervalWidget->setEnabled(enable);
myStateIntervalLabelWidget->setEnabled(enable);
@@ -896,6 +966,7 @@ void DeveloperDialog::handleSize()
{
bool found = false;
uInt64 size = myStateSizeWidget->getValue();
+ uInt64 uncompressed = myUncompressedWidget->getValue();
uInt64 interval = myStateIntervalWidget->getValue();
uInt64 horizon = myStateHorizonWidget->getValue();
Int32 i;
@@ -916,17 +987,38 @@ void DeveloperDialog::handleSize()
interval--;
} while(!found);
+ if(size < uncompressed)
+ {
+ myUncompressedWidget->setValue(size);
+ myUncompressedLabelWidget->setValue(myStateSizeWidget->getValue());
+ }
+
myStateHorizonWidget->setValue(i);
myStateHorizonLabelWidget->setLabel(HORIZONS[i]);
myStateIntervalWidget->setValue(interval);
myStateIntervalLabelWidget->setLabel(INTERVALS[interval]);
}
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void DeveloperDialog::handleUncompressed()
+{
+ uInt64 size = myStateSizeWidget->getValue();
+ uInt64 uncompressed = myUncompressedWidget->getValue();
+
+ myUncompressedLabelWidget->setValue(myUncompressedWidget->getValue());
+ if(uncompressed > size)
+ {
+ myStateSizeWidget->setValue(uncompressed);
+ myStateSizeLabelWidget->setValue(myUncompressedWidget->getValue());
+ }
+}
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DeveloperDialog::handleInterval()
{
bool found = false;
uInt64 size = myStateSizeWidget->getValue();
+ uInt64 uncompressed = myUncompressedWidget->getValue();
uInt64 interval = myStateIntervalWidget->getValue();
uInt64 horizon = myStateHorizonWidget->getValue();
Int32 i;
@@ -951,6 +1043,12 @@ void DeveloperDialog::handleInterval()
myStateHorizonLabelWidget->setLabel(HORIZONS[i]);
myStateSizeWidget->setValue(size);
myStateSizeLabelWidget->setValue(myStateSizeWidget->getValue());
+
+ if(size < uncompressed)
+ {
+ myUncompressedWidget->setValue(size);
+ myUncompressedLabelWidget->setValue(myStateSizeWidget->getValue());
+ }
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -958,6 +1056,7 @@ void DeveloperDialog::handleHorizon()
{
bool found = false;
uInt64 size = myStateSizeWidget->getValue();
+ uInt64 uncompressed = myUncompressedWidget->getValue();
uInt64 interval = myStateIntervalWidget->getValue();
uInt64 horizon = myStateHorizonWidget->getValue();
Int32 i;
@@ -981,13 +1080,15 @@ void DeveloperDialog::handleHorizon()
myStateIntervalWidget->setValue(i);
myStateIntervalLabelWidget->setLabel(INTERVALS[i]);
myStateSizeWidget->setValue(size);
+ if(size < uncompressed)
+ myUncompressedWidget->setValue(size);
myStateSizeLabelWidget->setValue(myStateSizeWidget->getValue());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DeveloperDialog::handleDebugColours(int idx, int color)
{
- if(idx < 0 || idx > 5)
+ if(idx < 0 || idx >= DEBUG_COLORS)
return;
if(!instance().hasConsole())
@@ -997,31 +1098,68 @@ void DeveloperDialog::handleDebugColours(int idx, int color)
return;
}
- static constexpr int dbg_color[2][6] = {
- { TIA::FixedColor::NTSC_RED,
- TIA::FixedColor::NTSC_ORANGE,
- TIA::FixedColor::NTSC_YELLOW,
- TIA::FixedColor::NTSC_GREEN,
- TIA::FixedColor::NTSC_BLUE,
- TIA::FixedColor::NTSC_PURPLE
+ static constexpr int dbg_color[2][DEBUG_COLORS] = {
+ {
+ TIA::FixedColor::NTSC_RED,
+ TIA::FixedColor::NTSC_ORANGE,
+ TIA::FixedColor::NTSC_YELLOW,
+ TIA::FixedColor::NTSC_GREEN,
+ TIA::FixedColor::NTSC_PURPLE,
+ TIA::FixedColor::NTSC_BLUE
},
- { TIA::FixedColor::PAL_RED,
- TIA::FixedColor::PAL_ORANGE,
- TIA::FixedColor::PAL_YELLOW,
- TIA::FixedColor::PAL_GREEN,
- TIA::FixedColor::PAL_BLUE,
- TIA::FixedColor::PAL_PURPLE
+ {
+ TIA::FixedColor::PAL_RED,
+ TIA::FixedColor::PAL_ORANGE,
+ TIA::FixedColor::PAL_YELLOW,
+ TIA::FixedColor::PAL_GREEN,
+ TIA::FixedColor::PAL_PURPLE,
+ TIA::FixedColor::PAL_BLUE
}
};
+
int mode = instance().console().tia().frameLayout() == FrameLayout::ntsc ? 0 : 1;
myDbgColourSwatch[idx]->setColor(dbg_color[mode][color]);
myDbgColour[idx]->setSelectedIndex(color);
+
+ // make sure the selected debug colors are all different
+ bool usedCol[DEBUG_COLORS];
+
+ // identify used colors
+ for(int i = 0; i < DEBUG_COLORS; ++i)
+ {
+ usedCol[i] = false;
+ for(int j = 0; j < DEBUG_COLORS; ++j)
+ {
+ if(myDbgColourSwatch[j]->getColor() == dbg_color[mode][i])
+ {
+ usedCol[i] = true;
+ break;
+ }
+ }
+ }
+ // check if currently changed color was used somewhere else
+ for(int i = 0; i < DEBUG_COLORS; ++i)
+ {
+ if (i != idx && myDbgColourSwatch[i]->getColor() == dbg_color[mode][color])
+ {
+ // if already used, change the other color to an unused one
+ for(int j = 0; j < DEBUG_COLORS; ++j)
+ {
+ if(!usedCol[j])
+ {
+ myDbgColourSwatch[i]->setColor(dbg_color[mode][j]);
+ myDbgColour[i]->setSelectedIndex(j);
+ break;
+ }
+ }
+ }
+ }
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void DeveloperDialog::handleDebugColours(const string& colors)
{
- for(int i = 0; i < 6; ++i)
+ for(int i = 0; i < DEBUG_COLORS; ++i)
{
switch(colors[i])
{
@@ -1029,8 +1167,8 @@ void DeveloperDialog::handleDebugColours(const string& colors)
case 'o': handleDebugColours(i, 1); break;
case 'y': handleDebugColours(i, 2); break;
case 'g': handleDebugColours(i, 3); break;
- case 'b': handleDebugColours(i, 4); break;
- case 'p': handleDebugColours(i, 5); break;
+ case 'p': handleDebugColours(i, 4); break;
+ case 'b': handleDebugColours(i, 5); break;
default: break;
}
}
diff --git a/src/gui/DeveloperDialog.hxx b/src/gui/DeveloperDialog.hxx
index e816e35d8..c347dc9aa 100644
--- a/src/gui/DeveloperDialog.hxx
+++ b/src/gui/DeveloperDialog.hxx
@@ -55,28 +55,29 @@ class DeveloperDialog : public Dialog
private:
enum
{
- kPlrSettings = 'DVpl',
- kDevSettings = 'DVdv',
- kConsole = 'DVco',
- kRandRAMID = 'DVrm',
- kRandCPUID = 'DVcp',
- kTVJitter = 'DVjt',
- kTVJitterChanged = 'DVjr',
- kPPinCmd = 'DVpn',
- kRewind = 'DSrw',
- kSizeChanged = 'DSsz',
- kIntervalChanged = 'DSin',
- kHorizonChanged = 'DShz',
- kP0ColourChangedCmd = 'GOp0',
- kM0ColourChangedCmd = 'GOm0',
- kP1ColourChangedCmd = 'GOp1',
- kM1ColourChangedCmd = 'GOm1',
- kPFColourChangedCmd = 'GOpf',
- kBLColourChangedCmd = 'GObl',
+ kPlrSettings = 'DVpl',
+ kDevSettings = 'DVdv',
+ kConsole = 'DVco',
+ kRandRAMID = 'DVrm',
+ kRandCPUID = 'DVcp',
+ kTVJitter = 'DVjt',
+ kTVJitterChanged = 'DVjr',
+ kPPinCmd = 'DVpn',
+ kRewind = 'DSrw',
+ kSizeChanged = 'DSsz',
+ kUncompressedChanged = 'DSuc',
+ kIntervalChanged = 'DSin',
+ kHorizonChanged = 'DShz',
+ kP0ColourChangedCmd = 'GOp0',
+ kM0ColourChangedCmd = 'GOm0',
+ kP1ColourChangedCmd = 'GOp1',
+ kM1ColourChangedCmd = 'GOm1',
+ kPFColourChangedCmd = 'GOpf',
+ kBLColourChangedCmd = 'GObl',
#ifdef DEBUGGER_SUPPORT
- kDWidthChanged = 'UIdw',
- kDHeightChanged = 'UIdh',
- kDFontSizeChanged = 'UIfs',
+ kDWidthChanged = 'UIdw',
+ kDHeightChanged = 'UIdh',
+ kDFontSizeChanged = 'UIfs',
#endif
};
enum SettingsSet
@@ -97,6 +98,8 @@ class DeveloperDialog : public Dialog
const uInt64 HORIZON_CYCLES[NUM_HORIZONS] = { 76 * 262, 76 * 262 * 10, 76 * 262 * 60, 76 * 262 * 60 * 10,
76 * 262 * 60 * 60, 76 * 262 * 60 * 60 * 10, (uInt64)76 * 262 * 60 * 60 * 60 };
+ static const int DEBUG_COLORS = 6;
+
TabWidget* myTab;
// Emulator widgets
RadioButtonGroup* mySettingsGroup0;
@@ -107,26 +110,31 @@ class DeveloperDialog : public Dialog
CheckboxWidget* myRandomizeRAMWidget;
StaticTextWidget* myRandomizeCPULabel;
CheckboxWidget* myRandomizeCPUWidget[5];
- CheckboxWidget* myColorLossWidget;
+ CheckboxWidget* myUndrivenPinsWidget;
+ CheckboxWidget* myThumbExceptionWidget;
+
+ // Video widgets
+ RadioButtonGroup* mySettingsGroup1;
CheckboxWidget* myTVJitterWidget;
SliderWidget* myTVJitterRecWidget;
StaticTextWidget* myTVJitterRecLabelWidget;
+ CheckboxWidget* myColorLossWidget;
CheckboxWidget* myDebugColorsWidget;
- CheckboxWidget* myUndrivenPinsWidget;
+ PopUpWidget* myDbgColour[DEBUG_COLORS];
+ ColorWidget* myDbgColourSwatch[DEBUG_COLORS];
+
// States widgets
- RadioButtonGroup* mySettingsGroup1;
+ RadioButtonGroup* mySettingsGroup2;
CheckboxWidget* myContinuousRewindWidget;
SliderWidget* myStateSizeWidget;
StaticTextWidget* myStateSizeLabelWidget;
+ SliderWidget* myUncompressedWidget;
+ StaticTextWidget* myUncompressedLabelWidget;
SliderWidget* myStateIntervalWidget;
StaticTextWidget* myStateIntervalLabelWidget;
SliderWidget* myStateHorizonWidget;
StaticTextWidget* myStateHorizonLabelWidget;
- // Debug colours selection
- PopUpWidget* myDbgColour[6];
- ColorWidget* myDbgColourSwatch[6];
-
#ifdef DEBUGGER_SUPPORT
// Debugger UI widgets
SliderWidget* myDebuggerWidthSlider;
@@ -151,16 +159,18 @@ class DeveloperDialog : public Dialog
int myTVJitterRec[2];
bool myDebugColors[2];
bool myUndrivenPins[2];
+ bool myThumbException[2];
// States sets
bool myContinuousRewind[2];
int myStateSize[2];
+ int myUncompressed[2];
int myStateInterval[2];
int myStateHorizon[2];
private:
void addEmulationTab(const GUI::Font& font);
void addStatesTab(const GUI::Font& font);
- void addDebugColorsTab(const GUI::Font& font);
+ void addVideoTab(const GUI::Font& font);
void addDebuggerTab(const GUI::Font& font);
// Add Defaults, OK and Cancel buttons
void addDefaultOKCancelButtons(const GUI::Font& font);
@@ -180,6 +190,7 @@ class DeveloperDialog : public Dialog
void handleRewind();
void handleSize();
+ void handleUncompressed();
void handleInterval();
void handleHorizon();
void handleFontSize();