diff --git a/docs/index.html b/docs/index.html
index 932adb4c0..c7061af15 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -3544,7 +3544,7 @@
-dev.thumb.incycles <1|0> |
When enabled, ARM emulation cycles are added to system cycles. This
- allows detecting timer overruns.
+ allows detecting timer overruns, but will also distort IRQ driven audio.
Note: The ARM emulation cycles are only a coarse approximation.
|
diff --git a/src/debugger/gui/CartARMWidget.cxx b/src/debugger/gui/CartARMWidget.cxx
new file mode 100644
index 000000000..25e62c2a3
--- /dev/null
+++ b/src/debugger/gui/CartARMWidget.cxx
@@ -0,0 +1,199 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#include "OSystem.hxx"
+#include "EditTextWidget.hxx"
+#include "CartARMWidget.hxx"
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CartridgeARMWidget::CartridgeARMWidget(
+ GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
+ int x, int y, int w, int h, CartridgeARM& cart)
+ : CartDebugWidget(boss, lfont, nfont, x, y, w, h),
+ myCart{cart}
+{
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARMWidget::addCycleWidgets(int xpos, int ypos)
+{
+ const int INDENT = 20;
+ const int VGAP = 4;
+
+ new StaticTextWidget(_boss, _font, xpos, ypos + 1, "ARM emulation cycles:");
+ xpos += INDENT; ypos += myLineHeight + VGAP;
+ myIncCycles = new CheckboxWidget(_boss, _font, xpos, ypos + 1, "Increase 6507 cycles", kIncCyclesChanged);
+ myIncCycles->setToolTip("Increase 6507 cycles with approximated ARM cycles.");
+ myIncCycles->setTarget(this);
+ addFocusWidget(myIncCycles);
+
+ myCycleFactor = new SliderWidget(_boss, _font, myIncCycles->getRight() + _fontWidth * 2, ypos - 1,
+ _fontWidth * 10, _lineHeight, "Factor ", _fontWidth * 7,
+ kFactorChanged, _fontWidth * 4, "%");
+ myCycleFactor->setMinValue(100); myCycleFactor->setMaxValue(200);
+ myCycleFactor->setTickmarkIntervals(4);
+ myCycleFactor->setToolTip("Multiply approximated ARM cycles by factor.");
+ myCycleFactor->setTarget(this);
+ addFocusWidget(myCycleFactor);
+
+ ypos += myLineHeight + VGAP;
+ StaticTextWidget* s = new StaticTextWidget(_boss, _font, xpos, ypos + 1, "Mem. cycles ");
+
+ myPrevThumbMemCycles = new EditTextWidget(_boss, _font, s->getRight(), ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myPrevThumbMemCycles->setEditable(false);
+ myPrevThumbMemCycles->setToolTip("Number of memory cycles of last but one ARM run.");
+
+ myThumbMemCycles = new EditTextWidget(_boss, _font, myPrevThumbMemCycles->getRight() + _fontWidth / 2, ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myThumbMemCycles->setEditable(false);
+ myThumbMemCycles->setToolTip("Number of memory cycles of last ARM run.");
+
+ s = new StaticTextWidget(_boss, _font, myThumbMemCycles->getRight() + _fontWidth * 2, ypos + 1, "Fetches ");
+ myPrevThumbFetches = new EditTextWidget(_boss, _font, s->getRight(), ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myPrevThumbFetches->setEditable(false);
+ myPrevThumbFetches->setToolTip("Number of fetches/instructions of last but one ARM run.");
+
+ myThumbFetches = new EditTextWidget(_boss, _font, myPrevThumbFetches->getRight() + _fontWidth / 2, ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myThumbFetches->setEditable(false);
+ myThumbFetches->setToolTip("Number of fetches/instructions of last ARM run.");
+
+ ypos += myLineHeight + VGAP;
+ s = new StaticTextWidget(_boss, _font, xpos, ypos + 1, "Reads ");
+
+ myPrevThumbReads = new EditTextWidget(_boss, _font, myPrevThumbMemCycles->getLeft(), ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myPrevThumbReads->setEditable(false);
+ myPrevThumbReads->setToolTip("Number of reads of last but one ARM run.");
+
+ myThumbReads = new EditTextWidget(_boss, _font, myThumbMemCycles->getLeft(), ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myThumbReads->setEditable(false);
+ myThumbReads->setToolTip("Number of reads of last ARM run.");
+
+ s = new StaticTextWidget(_boss, _font, myThumbReads->getRight() + _fontWidth * 2, ypos + 1, "Writes ");
+
+ myPrevThumbWrites = new EditTextWidget(_boss, _font, myPrevThumbFetches->getLeft(), ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myPrevThumbWrites->setEditable(false);
+ myPrevThumbWrites->setToolTip("Number of writes of last but one ARM run.");
+
+ myThumbWrites = new EditTextWidget(_boss, _font, myThumbFetches->getLeft(), ypos - 1,
+ EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
+ myThumbWrites->setEditable(false);
+ myThumbWrites->setToolTip("Number of writes of last ARM run.");
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARMWidget::saveOldState()
+{
+ myOldState.armStats.clear();
+ myOldState.armPrevStats.clear();
+
+ myOldState.armStats.push_back(myCart.stats().fetches
+ + myCart.stats().reads + myCart.stats().writes);
+ myOldState.armStats.push_back(myCart.stats().fetches);
+ myOldState.armStats.push_back(myCart.stats().reads);
+ myOldState.armStats.push_back(myCart.stats().writes);
+
+ myOldState.armPrevStats.push_back(myCart.prevStats().fetches
+ + myCart.prevStats().reads + myCart.prevStats().writes);
+ myOldState.armPrevStats.push_back(myCart.prevStats().fetches);
+ myOldState.armPrevStats.push_back(myCart.prevStats().reads);
+ myOldState.armPrevStats.push_back(myCart.prevStats().writes);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARMWidget::loadConfig()
+{
+ // ARM cycles
+ myIncCycles->setState(instance().settings().getBool("dev.thumb.inccycles"));
+ myCycleFactor->setValue(std::round(instance().settings().getFloat("dev.thumb.cyclefactor") * 100.F));
+ handleArmCycles();
+
+ bool isChanged;
+
+ isChanged = myCart.prevStats().fetches + myCart.prevStats().reads + myCart.prevStats().writes
+ != myOldState.armPrevStats[0];
+ myPrevThumbMemCycles->setText(Common::Base::toString(myCart.prevStats().fetches
+ + myCart.prevStats().reads + myCart.prevStats().writes,
+ Common::Base::Fmt::_10_6), isChanged);
+ isChanged = myCart.prevStats().fetches != myOldState.armPrevStats[1];
+ myPrevThumbFetches->setText(Common::Base::toString(myCart.prevStats().fetches,
+ Common::Base::Fmt::_10_6), isChanged);
+ isChanged = myCart.prevStats().reads != myOldState.armPrevStats[2];
+ myPrevThumbReads->setText(Common::Base::toString(myCart.prevStats().reads,
+ Common::Base::Fmt::_10_6), isChanged);
+ isChanged = myCart.prevStats().writes != myOldState.armPrevStats[3];
+ myPrevThumbWrites->setText(Common::Base::toString(myCart.prevStats().writes,
+ Common::Base::Fmt::_10_6), isChanged);
+
+ isChanged = myCart.stats().fetches + myCart.stats().reads + myCart.stats().writes
+ != myOldState.armStats[0];
+ myThumbMemCycles->setText(Common::Base::toString(myCart.stats().fetches
+ + myCart.stats().reads + myCart.stats().writes,
+ Common::Base::Fmt::_10_6), isChanged);
+ isChanged = myCart.stats().fetches != myOldState.armStats[1];
+ myThumbFetches->setText(Common::Base::toString(myCart.stats().fetches,
+ Common::Base::Fmt::_10_6), isChanged);
+ isChanged = myCart.stats().reads != myOldState.armStats[2];
+ myThumbReads->setText(Common::Base::toString(myCart.stats().reads,
+ Common::Base::Fmt::_10_6), isChanged);
+ isChanged = myCart.stats().writes != myOldState.armStats[3];
+ myThumbWrites->setText(Common::Base::toString(myCart.stats().writes,
+ Common::Base::Fmt::_10_6), isChanged);
+
+ CartDebugWidget::loadConfig();
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARMWidget::handleCommand(CommandSender* sender,
+ int cmd, int data, int id)
+{
+ switch(cmd)
+ {
+ case kIncCyclesChanged:
+ case kFactorChanged:
+ handleArmCycles();
+ break;
+
+ default:
+ break;
+ }
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARMWidget::handleArmCycles()
+{
+ bool devSettings = instance().settings().getBool("dev.settings");
+ bool enable = myIncCycles->getState();
+ double factor = myCycleFactor->getValue() / 100.F;
+
+ if(devSettings)
+ {
+ instance().settings().setValue("dev.thumb.inccycles", enable);
+ instance().settings().setValue("dev.thumb.cyclefactor", factor);
+ }
+
+ myIncCycles->setEnabled(devSettings);
+ enable &= devSettings;
+ myCart.incCycles(enable);
+ myCycleFactor->setEnabled(enable);
+ myCart.cycleFactor(factor);
+}
diff --git a/src/debugger/gui/CartARMWidget.hxx b/src/debugger/gui/CartARMWidget.hxx
new file mode 100644
index 000000000..e816ebff6
--- /dev/null
+++ b/src/debugger/gui/CartARMWidget.hxx
@@ -0,0 +1,88 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#ifndef CARTRIDGE_ARM_WIDGET_HXX
+#define CARTRIDGE_ARM_WIDGET_HXX
+
+#include "CartARM.hxx"
+#include "CartDebugWidget.hxx"
+
+class CheckboxWidget;
+class SliderWidget;
+class EditTextWidget;
+
+/**
+ Abstract base class for ARM cart widgets.
+
+ @author Thomas Jentzsch
+*/
+class CartridgeARMWidget : public CartDebugWidget
+{
+ public:
+ CartridgeARMWidget(GuiObject* boss, const GUI::Font& lfont,
+ const GUI::Font& nfont,
+ int x, int y, int w, int h,
+ CartridgeARM& cart);
+ ~CartridgeARMWidget() override = default;
+
+ protected:
+ void addCycleWidgets(int xpos, int ypos);
+
+ void saveOldState() override;
+ void loadConfig() override;
+
+ void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
+
+ private:
+ void handleArmCycles();
+
+ private:
+ struct CartState {
+ uIntArray armStats;
+ uIntArray armPrevStats;
+ };
+
+ CartridgeARM& myCart;
+
+ CheckboxWidget* myIncCycles{nullptr};
+ SliderWidget* myCycleFactor{nullptr};
+ EditTextWidget* myPrevThumbMemCycles{nullptr};
+ EditTextWidget* myPrevThumbFetches{nullptr};
+ EditTextWidget* myPrevThumbReads{nullptr};
+ EditTextWidget* myPrevThumbWrites{nullptr};
+ EditTextWidget* myThumbMemCycles{nullptr};
+ EditTextWidget* myThumbFetches{nullptr};
+ EditTextWidget* myThumbReads{nullptr};
+ EditTextWidget* myThumbWrites{nullptr};
+
+ CartState myOldState;
+
+ enum {
+ kIncCyclesChanged = 'inCH',
+ kFactorChanged = 'fcCH'
+ };
+
+ private:
+ // Following constructors and assignment operators not supported
+ CartridgeARMWidget() = delete;
+ CartridgeARMWidget(const CartridgeARMWidget&) = delete;
+ CartridgeARMWidget(CartridgeARMWidget&&) = delete;
+ CartridgeARMWidget& operator=(const CartridgeARMWidget&) = delete;
+ CartridgeARMWidget& operator=(CartridgeARMWidget&&) = delete;
+};
+
+#endif
diff --git a/src/debugger/gui/CartBUSWidget.cxx b/src/debugger/gui/CartBUSWidget.cxx
index c9b6eb3f3..1cdaa623f 100644
--- a/src/debugger/gui/CartBUSWidget.cxx
+++ b/src/debugger/gui/CartBUSWidget.cxx
@@ -25,7 +25,7 @@
CartridgeBUSWidget::CartridgeBUSWidget(
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
int x, int y, int w, int h, CartridgeBUS& cart)
- : CartDebugWidget(boss, lfont, nfont, x, y, w, h),
+ : CartridgeARMWidget(boss, lfont, nfont, x, y, w, h, cart),
myCart{cart}
{
uInt16 size = 8 * 4096;
@@ -186,54 +186,7 @@ CartridgeBUSWidget::CartridgeBUSWidget(
myDigitalSample->setEditable(false);
xpos = 10; ypos += myLineHeight + 4 * 2;
- new StaticTextWidget(boss, _font, xpos, ypos + 1, "Last ARM run stats:");
- xpos = 10 + _font.getMaxCharWidth() * 2; ypos += myLineHeight + 4;
- StaticTextWidget* s = new StaticTextWidget(boss, _font, xpos, ypos + 1, "Mem. cycles ");
- myPrevThumbMemCycles = new EditTextWidget(boss, _font, s->getRight(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbMemCycles->setEditable(false);
- myPrevThumbMemCycles->setToolTip("Number of memory cycles of last but one ARM run.");
-
- myThumbMemCycles = new EditTextWidget(boss, _font, myPrevThumbMemCycles->getRight() + _fontWidth / 2, ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbMemCycles->setEditable(false);
- myThumbMemCycles->setToolTip("Number of memory cycles of last ARM run.");
-
- s = new StaticTextWidget(boss, _font, myThumbMemCycles->getRight() + _fontWidth * 2, ypos + 1, "Fetches ");
- myPrevThumbFetches = new EditTextWidget(boss, _font, s->getRight(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbFetches->setEditable(false);
- myPrevThumbFetches->setToolTip("Number of fetches/instructions of last but one ARM run.");
-
- myThumbFetches = new EditTextWidget(boss, _font, myPrevThumbFetches->getRight() + _fontWidth / 2, ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbFetches->setEditable(false);
- myThumbFetches->setToolTip("Number of fetches/instructions of last ARM run.");
-
- ypos += myLineHeight + 4;
- s = new StaticTextWidget(boss, _font, xpos, ypos + 1, "Reads ");
-
- myPrevThumbReads = new EditTextWidget(boss, _font, myPrevThumbMemCycles->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbReads->setEditable(false);
- myPrevThumbReads->setToolTip("Number of reads of last but one ARM run.");
-
- myThumbReads = new EditTextWidget(boss, _font, myThumbMemCycles->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbReads->setEditable(false);
- myThumbReads->setToolTip("Number of reads of last ARM run.");
-
- s = new StaticTextWidget(boss, _font, myThumbReads->getRight() + _fontWidth * 2, ypos + 1, "Writes ");
-
- myPrevThumbWrites = new EditTextWidget(boss, _font, myPrevThumbFetches->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbWrites->setEditable(false);
- myPrevThumbWrites->setToolTip("Number of writes of last but one ARM run.");
-
- myThumbWrites = new EditTextWidget(boss, _font, myThumbFetches->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbWrites->setEditable(false);
- myThumbWrites->setToolTip("Number of writes of last ARM run.");
+ addCycleWidgets(xpos, ypos);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -250,8 +203,6 @@ void CartridgeBUSWidget::saveOldState()
myOldState.mwavesizes.clear();
myOldState.internalram.clear();
myOldState.samplepointer.clear();
- myOldState.armStats.clear();
- myOldState.armPrevStats.clear();
for(uInt32 i = 0; i < 18; ++i)
{
@@ -293,17 +244,7 @@ void CartridgeBUSWidget::saveOldState()
myOldState.samplepointer.push_back(myCart.getSample());
- myOldState.armStats.push_back(myCart.stats().fetches
- + myCart.stats().reads + myCart.stats().writes);
- myOldState.armStats.push_back(myCart.stats().fetches);
- myOldState.armStats.push_back(myCart.stats().reads);
- myOldState.armStats.push_back(myCart.stats().writes);
-
- myOldState.armPrevStats.push_back(myCart.prevStats().fetches
- + myCart.prevStats().reads + myCart.prevStats().writes);
- myOldState.armPrevStats.push_back(myCart.prevStats().fetches);
- myOldState.armPrevStats.push_back(myCart.prevStats().reads);
- myOldState.armPrevStats.push_back(myCart.prevStats().writes);
+ CartridgeARMWidget::saveOldState();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -430,39 +371,7 @@ void CartridgeBUSWidget::loadConfig()
mySamplePointer->setCrossed(true);
}
- bool isChanged;
-
- isChanged = myCart.prevStats().fetches + myCart.prevStats().reads + myCart.prevStats().writes
- != myOldState.armPrevStats[0];
- myPrevThumbMemCycles->setText(Common::Base::toString(myCart.prevStats().fetches
- + myCart.prevStats().reads + myCart.prevStats().writes,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().fetches != myOldState.armPrevStats[1];
- myPrevThumbFetches->setText(Common::Base::toString(myCart.prevStats().fetches,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().reads != myOldState.armPrevStats[2];
- myPrevThumbReads->setText(Common::Base::toString(myCart.prevStats().reads,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().writes != myOldState.armPrevStats[3];
- myPrevThumbWrites->setText(Common::Base::toString(myCart.prevStats().writes,
- Common::Base::Fmt::_10_6), isChanged);
-
- isChanged = myCart.stats().fetches + myCart.stats().reads + myCart.stats().writes
- != myOldState.armStats[0];
- myThumbMemCycles->setText(Common::Base::toString(myCart.stats().fetches
- + myCart.stats().reads + myCart.stats().writes,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().fetches != myOldState.armStats[1];
- myThumbFetches->setText(Common::Base::toString(myCart.stats().fetches,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().reads != myOldState.armStats[2];
- myThumbReads->setText(Common::Base::toString(myCart.stats().reads,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().writes != myOldState.armStats[3];
- myThumbWrites->setText(Common::Base::toString(myCart.stats().writes,
- Common::Base::Fmt::_10_6), isChanged);
-
- CartDebugWidget::loadConfig();
+ CartridgeARMWidget::loadConfig();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -476,6 +385,8 @@ void CartridgeBUSWidget::handleCommand(CommandSender* sender,
myCart.lockBank();
invalidate();
}
+ else
+ CartridgeARMWidget::handleCommand(sender, cmd, data, id);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/debugger/gui/CartBUSWidget.hxx b/src/debugger/gui/CartBUSWidget.hxx
index 493c6488c..7596371f6 100644
--- a/src/debugger/gui/CartBUSWidget.hxx
+++ b/src/debugger/gui/CartBUSWidget.hxx
@@ -24,9 +24,9 @@ class CheckboxWidget;
class DataGridWidget;
class EditTextWidget;
-#include "CartDebugWidget.hxx"
+#include "CartARMWidget.hxx"
-class CartridgeBUSWidget : public CartDebugWidget
+class CartridgeBUSWidget : public CartridgeARMWidget
{
public:
CartridgeBUSWidget(GuiObject* boss, const GUI::Font& lfont,
@@ -47,8 +47,6 @@ class CartridgeBUSWidget : public CartDebugWidget
IntArray mwaves;
IntArray mwavesizes;
IntArray samplepointer;
- uIntArray armStats;
- uIntArray armPrevStats;
uInt32 random{0};
ByteArray internalram;
};
@@ -68,14 +66,6 @@ class CartridgeBUSWidget : public CartDebugWidget
DataGridWidget* mySamplePointer{nullptr};
CheckboxWidget* myBusOverdrive{nullptr};
CheckboxWidget* myDigitalSample{nullptr};
- EditTextWidget* myPrevThumbMemCycles{nullptr};
- EditTextWidget* myPrevThumbFetches{nullptr};
- EditTextWidget* myPrevThumbReads{nullptr};
- EditTextWidget* myPrevThumbWrites{nullptr};
- EditTextWidget* myThumbMemCycles{nullptr};
- EditTextWidget* myThumbFetches{nullptr};
- EditTextWidget* myThumbReads{nullptr};
- EditTextWidget* myThumbWrites{nullptr};
std::array myDatastreamLabels{nullptr};
CartState myOldState;
diff --git a/src/debugger/gui/CartCDFWidget.cxx b/src/debugger/gui/CartCDFWidget.cxx
index a26923d92..4fbb527d1 100644
--- a/src/debugger/gui/CartCDFWidget.cxx
+++ b/src/debugger/gui/CartCDFWidget.cxx
@@ -15,6 +15,7 @@
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//============================================================================
+#include "OSystem.hxx"
#include "DataGridWidget.hxx"
#include "PopUpWidget.hxx"
#include "EditTextWidget.hxx"
@@ -24,7 +25,7 @@
CartridgeCDFWidget::CartridgeCDFWidget(
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
int x, int y, int w, int h, CartridgeCDF& cart)
- : CartDebugWidget(boss, lfont, nfont, x, y, w, h),
+ : CartridgeARMWidget(boss, lfont, nfont, x, y, w, h, cart),
myCart{cart}
{
const int VBORDER = 8;
@@ -56,7 +57,7 @@ CartridgeCDFWidget::CartridgeCDFWidget(
myLineHeight, items,
"Set bank ", 0, kBankChanged);
myBank->setTarget(this);
- //addFocusWidget(myBank);
+ addFocusWidget(myBank);
// Fast Fetch flag
myFastFetch = new CheckboxWidget(boss, _font, myBank->getRight() + 24, ypos + 1,
@@ -69,7 +70,7 @@ CartridgeCDFWidget::CartridgeCDFWidget(
// Datastream Pointers
#define DS_X (HBORDER + _font.getStringWidth("xx "))
xpos = DS_X;
- ypos += myLineHeight + VGAP * 3;
+ ypos += myLineHeight + VGAP * 2;
new StaticTextWidget(boss, _font, xpos, ypos, "Datastream Pointers");
myDatastreamPointers = new DataGridWidget(boss, _nfont, DS_X,
@@ -136,7 +137,7 @@ CartridgeCDFWidget::CartridgeCDFWidget(
Common::Base::Fmt::_16_2_2);
myJumpStreamIncrements->setTarget(this);
myJumpStreamIncrements->setEditable(false);
- xpos = HBORDER; ypos += myLineHeight * 11 + VGAP * 3;
+ xpos = HBORDER; ypos += myLineHeight * 11 + VGAP * 2;
lwidth = _font.getStringWidth("Waveform Sizes ");
@@ -201,55 +202,7 @@ CartridgeCDFWidget::CartridgeCDFWidget(
mySamplePointer->setEditable(false);
xpos = HBORDER; ypos += myLineHeight + VGAP * 2;
- new StaticTextWidget(boss, _font, xpos, ypos + 1, "Last ARM run stats:");
- xpos = HBORDER + INDENT; ypos += myLineHeight + VGAP;
- StaticTextWidget* s = new StaticTextWidget(boss, _font, xpos, ypos + 1, "Mem. cycles ");
-
- myPrevThumbMemCycles = new EditTextWidget(boss, _font, s->getRight(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbMemCycles->setEditable(false);
- myPrevThumbMemCycles->setToolTip("Number of memory cycles of last but one ARM run.");
-
- myThumbMemCycles = new EditTextWidget(boss, _font, myPrevThumbMemCycles->getRight() + _fontWidth / 2, ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbMemCycles->setEditable(false);
- myThumbMemCycles->setToolTip("Number of memory cycles of last ARM run.");
-
- s = new StaticTextWidget(boss, _font, myThumbMemCycles->getRight() + _fontWidth * 2, ypos + 1, "Fetches ");
- myPrevThumbFetches = new EditTextWidget(boss, _font, s->getRight(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbFetches->setEditable(false);
- myPrevThumbFetches->setToolTip("Number of fetches/instructions of last but one ARM run.");
-
- myThumbFetches = new EditTextWidget(boss, _font, myPrevThumbFetches->getRight() + _fontWidth / 2, ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbFetches->setEditable(false);
- myThumbFetches->setToolTip("Number of fetches/instructions of last ARM run.");
-
- ypos += myLineHeight + VGAP;
- s = new StaticTextWidget(boss, _font, xpos, ypos + 1, "Reads ");
-
- myPrevThumbReads = new EditTextWidget(boss, _font, myPrevThumbMemCycles->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbReads->setEditable(false);
- myPrevThumbReads->setToolTip("Number of reads of last but one ARM run.");
-
- myThumbReads = new EditTextWidget(boss, _font, myThumbMemCycles->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbReads->setEditable(false);
- myThumbReads->setToolTip("Number of reads of last ARM run.");
-
- s = new StaticTextWidget(boss, _font, myThumbReads->getRight() + _fontWidth * 2, ypos + 1, "Writes ");
-
- myPrevThumbWrites = new EditTextWidget(boss, _font, myPrevThumbFetches->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbWrites->setEditable(false);
- myPrevThumbWrites->setToolTip("Number of writes of last but one ARM run.");
-
- myThumbWrites = new EditTextWidget(boss, _font, myThumbFetches->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbWrites->setEditable(false);
- myThumbWrites->setToolTip("Number of writes of last ARM run.");
+ addCycleWidgets(xpos, ypos);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -266,8 +219,6 @@ void CartridgeCDFWidget::saveOldState()
myOldState.mwavesizes.clear();
myOldState.internalram.clear();
myOldState.samplepointer.clear();
- myOldState.armStats.clear();
- myOldState.armPrevStats.clear();
for(uInt32 i = 0; i < static_cast((isCDFJ() || isCDFJplus()) ? 35 : 34); ++i)
{
@@ -300,17 +251,7 @@ void CartridgeCDFWidget::saveOldState()
myOldState.samplepointer.push_back(myCart.getSample());
- myOldState.armStats.push_back(myCart.stats().fetches
- + myCart.stats().reads + myCart.stats().writes);
- myOldState.armStats.push_back(myCart.stats().fetches);
- myOldState.armStats.push_back(myCart.stats().reads);
- myOldState.armStats.push_back(myCart.stats().writes);
-
- myOldState.armPrevStats.push_back(myCart.prevStats().fetches
- + myCart.prevStats().reads + myCart.prevStats().writes);
- myOldState.armPrevStats.push_back(myCart.prevStats().fetches);
- myOldState.armPrevStats.push_back(myCart.prevStats().reads);
- myOldState.armPrevStats.push_back(myCart.prevStats().writes);
+ CartridgeARMWidget::saveOldState();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -442,39 +383,8 @@ void CartridgeCDFWidget::loadConfig()
mySamplePointer->setCrossed(true);
}
- bool isChanged;
-
- isChanged = myCart.prevStats().fetches + myCart.prevStats().reads + myCart.prevStats().writes
- != myOldState.armPrevStats[0];
- myPrevThumbMemCycles->setText(Common::Base::toString(myCart.prevStats().fetches
- + myCart.prevStats().reads + myCart.prevStats().writes,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().fetches != myOldState.armPrevStats[1];
- myPrevThumbFetches->setText(Common::Base::toString(myCart.prevStats().fetches,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().reads != myOldState.armPrevStats[2];
- myPrevThumbReads->setText(Common::Base::toString(myCart.prevStats().reads,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().writes != myOldState.armPrevStats[3];
- myPrevThumbWrites->setText(Common::Base::toString(myCart.prevStats().writes,
- Common::Base::Fmt::_10_6), isChanged);
-
- isChanged = myCart.stats().fetches + myCart.stats().reads + myCart.stats().writes
- != myOldState.armStats[0];
- myThumbMemCycles->setText(Common::Base::toString(myCart.stats().fetches
- + myCart.stats().reads + myCart.stats().writes,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().fetches != myOldState.armStats[1];
- myThumbFetches->setText(Common::Base::toString(myCart.stats().fetches,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().reads != myOldState.armStats[2];
- myThumbReads->setText(Common::Base::toString(myCart.stats().reads,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().writes != myOldState.armStats[3];
- myThumbWrites->setText(Common::Base::toString(myCart.stats().writes,
- Common::Base::Fmt::_10_6), isChanged);
-
- CartDebugWidget::loadConfig();
+ // ARM cycles
+ CartridgeARMWidget::loadConfig();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -488,6 +398,8 @@ void CartridgeCDFWidget::handleCommand(CommandSender* sender,
myCart.lockBank();
invalidate();
}
+ else
+ CartridgeARMWidget::handleCommand(sender, cmd, data, id);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/debugger/gui/CartCDFWidget.hxx b/src/debugger/gui/CartCDFWidget.hxx
index 34f177bc6..8a37c7b13 100644
--- a/src/debugger/gui/CartCDFWidget.hxx
+++ b/src/debugger/gui/CartCDFWidget.hxx
@@ -23,11 +23,12 @@ class CheckboxWidget;
class DataGridWidget;
class StaticTextWidget;
class EditTextWidget;
+class SliderWidget;
#include "CartCDF.hxx"
-#include "CartDebugWidget.hxx"
+#include "CartARMWidget.hxx"
-class CartridgeCDFWidget : public CartDebugWidget
+class CartridgeCDFWidget : public CartridgeARMWidget
{
public:
CartridgeCDFWidget(GuiObject* boss, const GUI::Font& lfont,
@@ -48,8 +49,6 @@ class CartridgeCDFWidget : public CartDebugWidget
IntArray mwaves;
IntArray mwavesizes;
IntArray samplepointer;
- uIntArray armStats;
- uIntArray armPrevStats;
uInt32 random{0};
ByteArray internalram;
};
@@ -72,14 +71,6 @@ class CartridgeCDFWidget : public CartDebugWidget
CheckboxWidget* myFastFetch{nullptr};
CheckboxWidget* myDigitalSample{nullptr};
- EditTextWidget* myPrevThumbMemCycles{nullptr};
- EditTextWidget* myPrevThumbFetches{nullptr};
- EditTextWidget* myPrevThumbReads{nullptr};
- EditTextWidget* myPrevThumbWrites{nullptr};
- EditTextWidget* myThumbMemCycles{nullptr};
- EditTextWidget* myThumbFetches{nullptr};
- EditTextWidget* myThumbReads{nullptr};
- EditTextWidget* myThumbWrites{nullptr};
CartState myOldState;
@@ -92,8 +83,8 @@ class CartridgeCDFWidget : public CartDebugWidget
static string describeCDFVersion(CartridgeCDF::CDFSubtype subtype);
void saveOldState() override;
-
void loadConfig() override;
+
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
string bankState() override;
diff --git a/src/debugger/gui/CartDPCPlusWidget.cxx b/src/debugger/gui/CartDPCPlusWidget.cxx
index 71ad351fd..0c1a1bc6c 100644
--- a/src/debugger/gui/CartDPCPlusWidget.cxx
+++ b/src/debugger/gui/CartDPCPlusWidget.cxx
@@ -25,7 +25,7 @@
CartridgeDPCPlusWidget::CartridgeDPCPlusWidget(
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
int x, int y, int w, int h, CartridgeDPCPlus& cart)
- : CartDebugWidget(boss, lfont, nfont, x, y, w, h),
+ : CartridgeARMWidget(boss, lfont, nfont, x, y, w, h, cart),
myCart{cart}
{
size_t size = cart.mySize;
@@ -181,56 +181,7 @@ CartridgeDPCPlusWidget::CartridgeDPCPlusWidget(
myIMLDA->setEditable(false);
xpos = 2; ypos += myLineHeight + 4 * 1;
- new StaticTextWidget(boss, _font, xpos, ypos + 1, "Last ARM run stats:");
- xpos = 2 + _font.getMaxCharWidth() * 2; ypos += myLineHeight + 4;
- StaticTextWidget* s = new StaticTextWidget(boss, _font, xpos, ypos + 1, "Mem. cycles ");
-
- myPrevThumbMemCycles = new EditTextWidget(boss, _font, s->getRight(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbMemCycles->setEditable(false);
- myPrevThumbMemCycles->setToolTip("Number of memory cycles of last but one ARM run.");
-
- myThumbMemCycles = new EditTextWidget(boss, _font, myPrevThumbMemCycles->getRight() + _fontWidth / 2, ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbMemCycles->setEditable(false);
- myThumbMemCycles->setToolTip("Number of memory cycles of last ARM run.");
-
- s = new StaticTextWidget(boss, _font, myThumbMemCycles->getRight() + _fontWidth * 2, ypos + 1, "Fetches ");
-
- myPrevThumbFetches = new EditTextWidget(boss, _font, s->getRight(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbFetches->setEditable(false);
- myPrevThumbFetches->setToolTip("Number of fetches/instructions of last but one ARM run.");
-
- myThumbFetches = new EditTextWidget(boss, _font, myPrevThumbFetches->getRight() + _fontWidth / 2, ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbFetches->setEditable(false);
- myThumbFetches->setToolTip("Number of fetches/instructions of last ARM run.");
-
- ypos += myLineHeight + 4;
- s = new StaticTextWidget(boss, _font, xpos, ypos + 1, "Reads ");
-
- myPrevThumbReads = new EditTextWidget(boss, _font, myPrevThumbMemCycles->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbReads->setEditable(false);
- myPrevThumbReads->setToolTip("Number of reads of last but one ARM run.");
-
- myThumbReads = new EditTextWidget(boss, _font, myThumbMemCycles->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbReads->setEditable(false);
- myThumbReads->setToolTip("Number of reads of last ARM run.");
-
- s = new StaticTextWidget(boss, _font, myThumbReads->getRight() + _fontWidth * 2, ypos + 1, "Writes ");
-
- myPrevThumbWrites = new EditTextWidget(boss, _font, myPrevThumbFetches->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myPrevThumbWrites->setEditable(false);
- myPrevThumbWrites->setToolTip("Number of writes of last but one ARM run.");
-
- myThumbWrites = new EditTextWidget(boss, _font, myThumbFetches->getLeft(), ypos - 1,
- EditTextWidget::calcWidth(_font, 6), myLineHeight, "");
- myThumbWrites->setEditable(false);
- myThumbWrites->setToolTip("Number of writes of last ARM run.");
+ addCycleWidgets(xpos, ypos);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -246,8 +197,6 @@ void CartridgeDPCPlusWidget::saveOldState()
myOldState.mfreqs.clear();
myOldState.mwaves.clear();
myOldState.internalram.clear();
- myOldState.armStats.clear();
- myOldState.armPrevStats.clear();
for(uInt32 i = 0; i < 8; ++i)
{
@@ -272,17 +221,7 @@ void CartridgeDPCPlusWidget::saveOldState()
myOldState.bank = myCart.getBank();
- myOldState.armStats.push_back(myCart.stats().fetches
- + myCart.stats().reads + myCart.stats().writes);
- myOldState.armStats.push_back(myCart.stats().fetches);
- myOldState.armStats.push_back(myCart.stats().reads);
- myOldState.armStats.push_back(myCart.stats().writes);
-
- myOldState.armPrevStats.push_back(myCart.prevStats().fetches
- + myCart.prevStats().reads + myCart.prevStats().writes);
- myOldState.armPrevStats.push_back(myCart.prevStats().fetches);
- myOldState.armPrevStats.push_back(myCart.prevStats().reads);
- myOldState.armPrevStats.push_back(myCart.prevStats().writes);
+ CartridgeARMWidget::saveOldState();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -373,39 +312,7 @@ void CartridgeDPCPlusWidget::loadConfig()
myFastFetch->setState(myCart.myFastFetch);
myIMLDA->setState(myCart.myLDAimmediate);
- bool isChanged;
-
- isChanged = myCart.prevStats().fetches + myCart.prevStats().reads + myCart.prevStats().writes
- != myOldState.armPrevStats[0];
- myPrevThumbMemCycles->setText(Common::Base::toString(myCart.prevStats().fetches
- + myCart.prevStats().reads + myCart.prevStats().writes,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().fetches != myOldState.armPrevStats[1];
- myPrevThumbFetches->setText(Common::Base::toString(myCart.prevStats().fetches,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().reads != myOldState.armPrevStats[2];
- myPrevThumbReads->setText(Common::Base::toString(myCart.prevStats().reads,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.prevStats().writes != myOldState.armPrevStats[3];
- myPrevThumbWrites->setText(Common::Base::toString(myCart.prevStats().writes,
- Common::Base::Fmt::_10_6), isChanged);
-
- isChanged = myCart.stats().fetches + myCart.stats().reads + myCart.stats().writes
- != myOldState.armStats[0];
- myThumbMemCycles->setText(Common::Base::toString(myCart.stats().fetches
- + myCart.stats().reads + myCart.stats().writes,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().fetches != myOldState.armStats[1];
- myThumbFetches->setText(Common::Base::toString(myCart.stats().fetches,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().reads != myOldState.armStats[2];
- myThumbReads->setText(Common::Base::toString(myCart.stats().reads,
- Common::Base::Fmt::_10_6), isChanged);
- isChanged = myCart.stats().writes != myOldState.armStats[3];
- myThumbWrites->setText(Common::Base::toString(myCart.stats().writes,
- Common::Base::Fmt::_10_6), isChanged);
-
- CartDebugWidget::loadConfig();
+ CartridgeARMWidget::loadConfig();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@@ -419,6 +326,8 @@ void CartridgeDPCPlusWidget::handleCommand(CommandSender* sender,
myCart.lockBank();
invalidate();
}
+ else
+ CartridgeARMWidget::handleCommand(sender, cmd, data, id);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/src/debugger/gui/CartDPCPlusWidget.hxx b/src/debugger/gui/CartDPCPlusWidget.hxx
index 61d8e936d..c9780a0a8 100644
--- a/src/debugger/gui/CartDPCPlusWidget.hxx
+++ b/src/debugger/gui/CartDPCPlusWidget.hxx
@@ -24,9 +24,9 @@ class CheckboxWidget;
class DataGridWidget;
class EditTextWidget;
-#include "CartDebugWidget.hxx"
+#include "CartARMWidget.hxx"
-class CartridgeDPCPlusWidget : public CartDebugWidget
+class CartridgeDPCPlusWidget : public CartridgeARMWidget
{
public:
CartridgeDPCPlusWidget(GuiObject* boss, const GUI::Font& lfont,
@@ -46,8 +46,6 @@ class CartridgeDPCPlusWidget : public CartDebugWidget
IntArray mcounters;
IntArray mfreqs;
IntArray mwaves;
- uIntArray armStats;
- uIntArray armPrevStats;
uInt32 random{0};
ByteArray internalram;
uInt16 bank{0};
@@ -68,14 +66,6 @@ class CartridgeDPCPlusWidget : public CartDebugWidget
CheckboxWidget* myFastFetch{nullptr};
CheckboxWidget* myIMLDA{nullptr};
DataGridWidget* myRandom{nullptr};
- EditTextWidget* myPrevThumbMemCycles{nullptr};
- EditTextWidget* myPrevThumbFetches{nullptr};
- EditTextWidget* myPrevThumbReads{nullptr};
- EditTextWidget* myPrevThumbWrites{nullptr};
- EditTextWidget* myThumbMemCycles{nullptr};
- EditTextWidget* myThumbFetches{nullptr};
- EditTextWidget* myThumbReads{nullptr};
- EditTextWidget* myThumbWrites{nullptr};
CartState myOldState;
diff --git a/src/debugger/gui/PromptWidget.cxx b/src/debugger/gui/PromptWidget.cxx
index 3f34ce52e..745d78f6e 100644
--- a/src/debugger/gui/PromptWidget.cxx
+++ b/src/debugger/gui/PromptWidget.cxx
@@ -251,11 +251,15 @@ bool PromptWidget::handleKeyDown(StellaKey key, StellaMod mod)
case Event::MoveRightChar:
if(_currentPos < _promptEndPos)
_currentPos++;
+ else
+ handled = false;
break;
case Event::MoveLeftChar:
if(_currentPos > _promptStartPos)
_currentPos--;
+ else
+ handled = false;
break;
// scrolling events
diff --git a/src/debugger/gui/module.mk b/src/debugger/gui/module.mk
index 0a985e71b..04428e518 100644
--- a/src/debugger/gui/module.mk
+++ b/src/debugger/gui/module.mk
@@ -14,6 +14,7 @@ MODULE_OBJS := \
src/debugger/gui/Cart4A50Widget.o \
src/debugger/gui/Cart4KSCWidget.o \
src/debugger/gui/Cart4KWidget.o \
+ src/debugger/gui/CartARMWidget.o \
src/debugger/gui/CartARWidget.o \
src/debugger/gui/CartBFSCWidget.o \
src/debugger/gui/CartBFWidget.o \
diff --git a/src/emucore/CartARM.cxx b/src/emucore/CartARM.cxx
new file mode 100644
index 000000000..e657b724f
--- /dev/null
+++ b/src/emucore/CartARM.cxx
@@ -0,0 +1,92 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2021 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#include "System.hxx"
+#include "Settings.hxx"
+#include "CartARM.hxx"
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+CartridgeARM::CartridgeARM(const string& md5, const Settings& settings)
+ : Cartridge(settings, md5)
+{
+ myIncCycles = settings.getBool("dev.settings")
+ && settings.getBool("dev.thumb.inccycles");
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARM::updateCycles(int cycles)
+{
+ if(myIncCycles)
+ {
+ mySystem->incrementCycles(cycles); // * ~1.79 is the limit for ZEVIOUZ title screen (~88,000 cycles)
+ cerr << cycles << " ";
+ }
+ myStats = myThumbEmulator->stats();
+ myPrevStats = myThumbEmulator->prevStats();
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARM::incCycles(bool enable)
+{
+ myIncCycles = enable;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void CartridgeARM::cycleFactor(double factor)
+{
+ myThumbEmulator->cycleFactor(factor);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+bool CartridgeARM::save(Serializer& out) const
+{
+ try
+ {
+ out.putInt(myPrevStats.fetches);
+ out.putInt(myPrevStats.reads);
+ out.putInt(myPrevStats.writes);
+ out.putInt(myStats.fetches);
+ out.putInt(myStats.reads);
+ out.putInt(myStats.writes);
+ }
+ catch(...)
+ {
+ cerr << "ERROR: CartridgeARM::save" << endl;
+ return false;
+ }
+ return true;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+bool CartridgeARM::load(Serializer& in)
+{
+ try
+ {
+ myPrevStats.fetches = in.getInt();
+ myPrevStats.reads = in.getInt();
+ myPrevStats.writes = in.getInt();
+ myStats.fetches = in.getInt();
+ myStats.reads = in.getInt();
+ myStats.writes = in.getInt();
+ }
+ catch(...)
+ {
+ cerr << "ERROR: CartridgeARM::load" << endl;
+ return false;
+ }
+ return true;
+}
diff --git a/src/emucore/CartBUS.cxx b/src/emucore/CartBUS.cxx
index b236b0c14..d11016d41 100644
--- a/src/emucore/CartBUS.cxx
+++ b/src/emucore/CartBUS.cxx
@@ -23,7 +23,6 @@
#include "System.hxx"
#include "M6532.hxx"
#include "TIA.hxx"
-#include "Thumbulator.hxx"
#include "CartBUS.hxx"
#include "exception/FatalEmulationError.hxx"
@@ -43,7 +42,7 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeBUS::CartridgeBUS(const ByteBuffer& image, size_t size,
const string& md5, const Settings& settings)
- : Cartridge(settings, md5),
+ : CartridgeARM(md5, settings),
myImage{make_unique(32_KB)}
{
// Copy the ROM image into my buffer
@@ -76,8 +75,6 @@ CartridgeBUS::CartridgeBUS(const ByteBuffer& image, size_t size,
Thumbulator::ConfigureFor::BUS,
this);
- myIncCycles = devSettings ? settings.getBool("dev.thumb.inccycles") : false,
-
setInitialState();
}
@@ -174,8 +171,7 @@ inline void CartridgeBUS::callFunction(uInt8 value)
myARMCycles = mySystem->cycles();
myThumbEmulator->run(cycles);
- if(myIncCycles)
- mySystem->incrementCycles(cycles);
+ updateCycles(cycles);
}
catch(const runtime_error& e) {
if(!mySystem->autodetectMode())
@@ -593,6 +589,8 @@ bool CartridgeBUS::save(Serializer& out) const
// Indicates if in the middle of a fast jump
out.putByte(myFastJumpActive);
+
+ CartridgeARM::save(out);
}
catch(...)
{
@@ -634,6 +632,8 @@ bool CartridgeBUS::load(Serializer& in)
// Indicates if in the middle of a fast jump
myFastJumpActive = in.getByte();
+
+ CartridgeARM::load(in);
}
catch(...)
{
diff --git a/src/emucore/CartBUS.hxx b/src/emucore/CartBUS.hxx
index 3ce835d55..c4e86425b 100644
--- a/src/emucore/CartBUS.hxx
+++ b/src/emucore/CartBUS.hxx
@@ -19,14 +19,13 @@
#define CARTRIDGE_BUS_HXX
class System;
-class Thumbulator;
+
#ifdef DEBUGGER_SUPPORT
#include "CartBUSWidget.hxx"
#endif
#include "bspf.hxx"
-#include "Thumbulator.hxx"
-#include "Cart.hxx"
+#include "CartARM.hxx"
/**
Cartridge class used for BUS.
@@ -41,7 +40,7 @@ class Thumbulator;
@authors: Darrell Spice Jr, Chris Walton, Fred Quimby,
Stephen Anthony, Bradford W. Mott
*/
-class CartridgeBUS : public Cartridge
+class CartridgeBUS : public CartridgeARM
{
friend class CartridgeBUSWidget;
friend class CartridgeRamBUSWidget;
@@ -233,10 +232,6 @@ class CartridgeBUS : public Cartridge
uInt32 getWaveformSize(uInt8 index) const;
uInt32 getSample();
- // Get number of memory accesses of last and last but one ARM runs.
- const Thumbulator::Stats& stats() const { return myThumbEmulator->stats(); }
- const Thumbulator::Stats& prevStats() const { return myThumbEmulator->prevStats(); }
-
private:
// The 32K ROM image of the cartridge
ByteBuffer myImage;
@@ -256,9 +251,6 @@ class CartridgeBUS : public Cartridge
// $1800 - 2K C Variable & Stack
std::array myRAM;
- // Pointer to the Thumb ARM emulator object
- unique_ptr myThumbEmulator;
-
// Indicates the offset into the ROM image (aligns to current bank)
uInt16 myBankOffset{0};
@@ -299,9 +291,6 @@ class CartridgeBUS : public Cartridge
uInt8 myFastJumpActive{false};
- // ARM code increases 6507 cycles
- bool myIncCycles{false};
-
private:
// Following constructors and assignment operators not supported
CartridgeBUS() = delete;
diff --git a/src/emucore/CartCDF.cxx b/src/emucore/CartCDF.cxx
index 3a97368af..83f06c700 100644
--- a/src/emucore/CartCDF.cxx
+++ b/src/emucore/CartCDF.cxx
@@ -24,7 +24,6 @@
#endif
#include "System.hxx"
-#include "Thumbulator.hxx"
#include "CartCDF.hxx"
#include "TIA.hxx"
#include "exception/FatalEmulationError.hxx"
@@ -65,7 +64,7 @@ namespace {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeCDF::CartridgeCDF(const ByteBuffer& image, size_t size,
const string& md5, const Settings& settings)
- : Cartridge(settings, md5)
+ : CartridgeARM(md5, settings)
{
// Copy the ROM image into my buffer
mySize = std::min(size, 512_KB);
@@ -112,8 +111,6 @@ CartridgeCDF::CartridgeCDF(const ByteBuffer& image, size_t size,
thumulatorConfiguration(myCDFSubtype),
this);
- myIncCycles = devSettings ? settings.getBool("dev.thumb.inccycles") : false,
-
setInitialState();
}
@@ -202,8 +199,7 @@ inline void CartridgeCDF::callFunction(uInt8 value)
myARMCycles = mySystem->cycles();
myThumbEmulator->run(cycles);
- if(myIncCycles)
- mySystem->incrementCycles(cycles); // * ~1.79 is the limit for ZEVIOUZ title screen
+ updateCycles(cycles);
}
catch(const runtime_error& e) {
if(!mySystem->autodetectMode())
@@ -565,6 +561,8 @@ bool CartridgeCDF::save(Serializer& out) const
out.putLong(myAudioCycles);
out.putDouble(myFractionalClocks);
out.putLong(myARMCycles);
+
+ CartridgeARM::save(out);
}
catch(...)
{
@@ -605,6 +603,8 @@ bool CartridgeCDF::load(Serializer& in)
myAudioCycles = in.getLong();
myFractionalClocks = in.getDouble();
myARMCycles = in.getLong();
+
+ CartridgeARM::load(in);
}
catch(...)
{
diff --git a/src/emucore/CartCDF.hxx b/src/emucore/CartCDF.hxx
index 9d51d73d4..a9c9d6479 100644
--- a/src/emucore/CartCDF.hxx
+++ b/src/emucore/CartCDF.hxx
@@ -21,8 +21,7 @@
class System;
#include "bspf.hxx"
-#include "Thumbulator.hxx"
-#include "Cart.hxx"
+#include "CartARM.hxx"
/**
Cartridge class used for CDF/CDFJ/CDFJ+.
@@ -52,7 +51,7 @@ class System;
@authors: Darrell Spice Jr, Chris Walton, Fred Quimby, John Champeau
Thomas Jentzsch, Stephen Anthony, Bradford W. Mott
*/
-class CartridgeCDF : public Cartridge
+class CartridgeCDF : public CartridgeARM
{
friend class CartridgeCDFWidget;
friend class CartridgeCDFInfoWidget;
@@ -263,10 +262,6 @@ class CartridgeCDF : public Cartridge
uInt32 getSample();
void setupVersion();
- // Get number of memory accesses of last and last but one ARM runs.
- const Thumbulator::Stats& stats() const { return myThumbEmulator->stats(); }
- const Thumbulator::Stats& prevStats() const { return myThumbEmulator->prevStats(); }
-
private:
// The ROM image of the cartridge
ByteBuffer myImage{nullptr};
@@ -292,9 +287,6 @@ class CartridgeCDF : public Cartridge
// $0800 - Display Data, C Variables & Stack
std::array myRAM;
- // Pointer to the Thumb ARM emulator object
- unique_ptr myThumbEmulator;
-
// Indicates the offset into the ROM image (aligns to current bank)
uInt16 myBankOffset{0};
@@ -369,9 +361,6 @@ class CartridgeCDF : public Cartridge
// CDF subtype
CDFSubtype myCDFSubtype{CDFSubtype::CDF0};
- // ARM code increases 6507 cycles
- bool myIncCycles{false};
-
private:
// Following constructors and assignment operators not supported
CartridgeCDF() = delete;
diff --git a/src/emucore/CartDPCPlus.cxx b/src/emucore/CartDPCPlus.cxx
index 4f801cece..e96464107 100644
--- a/src/emucore/CartDPCPlus.cxx
+++ b/src/emucore/CartDPCPlus.cxx
@@ -20,7 +20,6 @@
#endif
#include "MD5.hxx"
#include "System.hxx"
-#include "Thumbulator.hxx"
#include "CartDPCPlus.hxx"
#include "TIA.hxx"
#include "exception/FatalEmulationError.hxx"
@@ -28,7 +27,7 @@
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeDPCPlus::CartridgeDPCPlus(const ByteBuffer& image, size_t size,
const string& md5, const Settings& settings)
- : Cartridge(settings, md5),
+ : CartridgeARM(md5, settings),
myImage{make_unique(32_KB)},
mySize{std::min(size, 32_KB)}
{
@@ -78,8 +77,6 @@ CartridgeDPCPlus::CartridgeDPCPlus(const ByteBuffer& image, size_t size,
myDriverMD5 == "8dd73b44fd11c488326ce507cbeb19d1" )
myFractionalLowMask = 0x0F0000;
- myIncCycles = devSettings ? settings.getBool("dev.thumb.inccycles") : false,
-
setInitialState();
}
@@ -207,8 +204,7 @@ inline void CartridgeDPCPlus::callFunction(uInt8 value)
myARMCycles = mySystem->cycles();
myThumbEmulator->run(cycles);
- if(myIncCycles)
- mySystem->incrementCycles(cycles);
+ updateCycles(cycles);
}
catch(const runtime_error& e) {
if(!mySystem->autodetectMode())
@@ -715,6 +711,8 @@ bool CartridgeDPCPlus::save(Serializer& out) const
// Clock info for Thumbulator
out.putLong(myARMCycles);
+
+ CartridgeARM::save(out);
}
catch(...)
{
@@ -776,6 +774,8 @@ bool CartridgeDPCPlus::load(Serializer& in)
// Clock info for Thumbulator
myARMCycles = in.getLong();
+
+ CartridgeARM::load(in);
}
catch(...)
{
diff --git a/src/emucore/CartDPCPlus.hxx b/src/emucore/CartDPCPlus.hxx
index caf86342c..1d4ca0dd8 100644
--- a/src/emucore/CartDPCPlus.hxx
+++ b/src/emucore/CartDPCPlus.hxx
@@ -20,13 +20,12 @@
class System;
-#include "Thumbulator.hxx"
#ifdef DEBUGGER_SUPPORT
#include "CartDPCPlusWidget.hxx"
#endif
#include "bspf.hxx"
-#include "Cart.hxx"
+#include "CartARM.hxx"
/**
Cartridge class used for DPC+, derived from Pitfall II. There are six 4K
@@ -42,7 +41,7 @@ class System;
@authors Darrell Spice Jr, Fred Quimby, Stephen Anthony, Bradford W. Mott
*/
-class CartridgeDPCPlus : public Cartridge
+class CartridgeDPCPlus : public CartridgeARM
{
friend class CartridgeDPCPlusWidget;
friend class CartridgeRamDPCPlusWidget;
@@ -223,10 +222,6 @@ class CartridgeDPCPlus : public Cartridge
*/
void callFunction(uInt8 value);
- // Get number of memory accesses of last and last but one ARM runs.
- const Thumbulator::Stats& stats() const { return myThumbEmulator->stats(); }
- const Thumbulator::Stats& prevStats() const { return myThumbEmulator->prevStats(); }
-
private:
// The ROM image and size
ByteBuffer myImage;
@@ -244,9 +239,6 @@ class CartridgeDPCPlus : public Cartridge
// 1K Frequency Data
std::array myDPCRAM;
- // Pointer to the Thumb ARM emulator object
- unique_ptr myThumbEmulator;
-
// Pointer to the 1K frequency table
uInt8* myFrequencyImage{nullptr};
@@ -312,9 +304,6 @@ class CartridgeDPCPlus : public Cartridge
// For current versions, this is 0x0F00FF; older versions need 0x0F0000
uInt32 myFractionalLowMask{0x0F00FF};
- // ARM code increases 6507 cycles
- bool myIncCycles{false};
-
private:
// Following constructors and assignment operators not supported
CartridgeDPCPlus() = delete;
diff --git a/src/emucore/Thumbulator.hxx b/src/emucore/Thumbulator.hxx
index e7a82923f..a57db3764 100644
--- a/src/emucore/Thumbulator.hxx
+++ b/src/emucore/Thumbulator.hxx
@@ -104,6 +104,10 @@ class Thumbulator
#endif
#ifndef NO_THUMB_STATS
static void cycleFactor(double factor) { arm_cycle_factor = factor; }
+ double cycleFactor() const { return arm_cycle_factor; }
+#else
+ static void cycleFactor(double) { }
+ double cycleFactor() const { return 1.0; }
#endif
/**
diff --git a/src/emucore/module.mk b/src/emucore/module.mk
index b061abfa9..906aa8dc3 100644
--- a/src/emucore/module.mk
+++ b/src/emucore/module.mk
@@ -5,6 +5,7 @@ MODULE_OBJS := \
src/emucore/Bankswitch.o \
src/emucore/Booster.o \
src/emucore/Cart.o \
+ src/emucore/CartARM.o \
src/emucore/CartCreator.o \
src/emucore/CartDetector.o \
src/emucore/CartEnhanced.o \
diff --git a/src/windows/Stella.vcxproj b/src/windows/Stella.vcxproj
index 42ead3e44..5f4cc718e 100644
--- a/src/windows/Stella.vcxproj
+++ b/src/windows/Stella.vcxproj
@@ -576,6 +576,7 @@
true
+
true
@@ -737,6 +738,7 @@
+
@@ -1629,6 +1631,7 @@
true
+
true
@@ -1801,6 +1804,7 @@
+
diff --git a/src/windows/Stella.vcxproj.filters b/src/windows/Stella.vcxproj.filters
index 857f49276..46033b99a 100644
--- a/src/windows/Stella.vcxproj.filters
+++ b/src/windows/Stella.vcxproj.filters
@@ -1110,6 +1110,12 @@
Source Files\repository
+
+ Source Files\emucore
+
+
+ Source Files\debugger
+
@@ -2282,6 +2288,12 @@
Header Files\emucore
+
+ Header Files\emucore
+
+
+ Header Files\debugger
+