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 +