mirror of https://github.com/stella-emu/stella.git
Add ELF state widget.
This commit is contained in:
parent
f76d70f68e
commit
2cf85c8ab2
|
@ -0,0 +1,106 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// 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-2024 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 "CartELFStateWidget.hxx"
|
||||||
|
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
#include "CartELF.hxx"
|
||||||
|
#include "DataGridWidget.hxx"
|
||||||
|
#include "ToggleBitWidget.hxx"
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
string registerName(uInt8 reg) {
|
||||||
|
switch (reg) {
|
||||||
|
case 11:
|
||||||
|
return "FP (R11) = ";
|
||||||
|
|
||||||
|
case 12:
|
||||||
|
return "IP (R12) = ";
|
||||||
|
|
||||||
|
case 13:
|
||||||
|
return "SP (R13) = ";
|
||||||
|
|
||||||
|
case 14:
|
||||||
|
return "LR (R14) = ";
|
||||||
|
|
||||||
|
case 15:
|
||||||
|
return "PC (R15) = ";
|
||||||
|
|
||||||
|
default: {
|
||||||
|
ostringstream s;
|
||||||
|
s << "R" << static_cast<int>(reg) << " = ";
|
||||||
|
|
||||||
|
return s.str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
CartridgeELFStateWidget::CartridgeELFStateWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
const GUI::Font& nfont,
|
||||||
|
int x, int y, int w, int h,
|
||||||
|
CartridgeELF& cart)
|
||||||
|
: CartDebugWidget(boss, lfont, nfont, x, y, w, h), myCart(cart), myFlagValues(4)
|
||||||
|
{
|
||||||
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
void CartridgeELFStateWidget::initialize()
|
||||||
|
{
|
||||||
|
constexpr int x0 = 2;
|
||||||
|
const int lineHeight = _font.getLineHeight();
|
||||||
|
int y = lineHeight / 2;
|
||||||
|
|
||||||
|
new StaticTextWidget(_boss, _font, x0, y, "ARM registers:");
|
||||||
|
const int indent = _font.getMaxCharWidth() * 15;
|
||||||
|
|
||||||
|
myArmRegisters = new DataGridWidget(_boss, _font, x0 + indent, y, 4, 4, 8, 8, Common::Base::Fmt::_16_8);
|
||||||
|
y += myArmRegisters->getHeight() + lineHeight / 2;
|
||||||
|
|
||||||
|
myArmRegisters->setEditable(false);
|
||||||
|
for (uInt8 i = 0; i < 16; i++) myArmRegisters->setToolTip(i % 4, i / 4, registerName(i));
|
||||||
|
|
||||||
|
new StaticTextWidget(_boss, _font, x0, y, "ARM flags:");
|
||||||
|
myFlags = new ToggleBitWidget(_boss, _font, x0 + indent, y + lineHeight, 4, 1, 1);
|
||||||
|
myFlags->setEditable(false);
|
||||||
|
|
||||||
|
new StaticTextWidget(_boss, _font, x0 + indent + 3, y, "N");
|
||||||
|
new StaticTextWidget(_boss, _font, x0 + indent + 3 + myFlags->colWidth(), y, "Z");
|
||||||
|
new StaticTextWidget(_boss, _font, x0 + indent + 3 + 2 * myFlags->colWidth(), y, "C");
|
||||||
|
new StaticTextWidget(_boss, _font, x0 + indent + 3 + 3 * myFlags->colWidth(), y, "V");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CartridgeELFStateWidget::loadConfig()
|
||||||
|
{
|
||||||
|
for (uInt8 i = 0; i < 16; i++)
|
||||||
|
myArmRegisters->setValue(i, myCart.myCortexEmu.getRegister(i));
|
||||||
|
|
||||||
|
BoolArray flags(4);
|
||||||
|
flags[0] = myCart.myCortexEmu.getN();
|
||||||
|
flags[1] = myCart.myCortexEmu.getZ();
|
||||||
|
flags[2] = myCart.myCortexEmu.getC();
|
||||||
|
flags[3] = myCart.myCortexEmu.getV();
|
||||||
|
|
||||||
|
BoolArray flagsChanged(4);
|
||||||
|
for (uInt8 i = 0; i < 4; i++) flagsChanged[i] = flags[i] != myFlagValues[i];
|
||||||
|
myFlagValues = flags;
|
||||||
|
|
||||||
|
myFlags->setState(flags, flagsChanged);
|
||||||
|
}
|
|
@ -0,0 +1,49 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// 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-2024 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 CART_ELF_INFO_WIDGET_HXX
|
||||||
|
#define CART_ELF_INFO_WIDGET_HXX
|
||||||
|
|
||||||
|
#include "CartDebugWidget.hxx"
|
||||||
|
|
||||||
|
class CartridgeELF;
|
||||||
|
class DataGridWidget;
|
||||||
|
class ToggleBitWidget;
|
||||||
|
|
||||||
|
class CartridgeELFStateWidget : public CartDebugWidget {
|
||||||
|
public:
|
||||||
|
CartridgeELFStateWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
const GUI::Font& nfont,
|
||||||
|
int x, int y, int w, int h,
|
||||||
|
CartridgeELF& cart);
|
||||||
|
|
||||||
|
~CartridgeELFStateWidget() override = default;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initialize();
|
||||||
|
|
||||||
|
void loadConfig() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CartridgeELF& myCart;
|
||||||
|
BoolArray myFlagValues;
|
||||||
|
|
||||||
|
DataGridWidget* myArmRegisters{nullptr};
|
||||||
|
ToggleBitWidget* myFlags{nullptr};
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CART_ELF_INFO_WIDGET_HXX
|
|
@ -49,6 +49,7 @@ MODULE_OBJS := \
|
||||||
src/debugger/gui/CartFEWidget.o \
|
src/debugger/gui/CartFEWidget.o \
|
||||||
src/debugger/gui/CartGLWidget.o \
|
src/debugger/gui/CartGLWidget.o \
|
||||||
src/debugger/gui/CartELFWidget.o \
|
src/debugger/gui/CartELFWidget.o \
|
||||||
|
src/debugger/gui/CartELFStateWidget.o \
|
||||||
src/debugger/gui/CartJANEWidget.o \
|
src/debugger/gui/CartJANEWidget.o \
|
||||||
src/debugger/gui/CartMDMWidget.o \
|
src/debugger/gui/CartMDMWidget.o \
|
||||||
src/debugger/gui/CartRamWidget.o \
|
src/debugger/gui/CartRamWidget.o \
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
#include "CartELFWidget.hxx"
|
#include "CartELFWidget.hxx"
|
||||||
|
#include "CartELFStateWidget.hxx"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "CartELF.hxx"
|
#include "CartELF.hxx"
|
||||||
|
@ -379,10 +380,18 @@ uInt8 CartridgeELF::overdrivePoke(uInt16 address, uInt8 value)
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CartDebugWidget* CartridgeELF::debugWidget(
|
CartDebugWidget* CartridgeELF::debugWidget(
|
||||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, int x, int y, int w, int h
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, int x, int y, int w, int h
|
||||||
|
) {
|
||||||
|
return new CartridgeELFStateWidget(boss, lfont, nfont, x, y, w, h, *this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
CartDebugWidget* CartridgeELF::infoWidget(
|
||||||
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, int x, int y, int w, int h
|
||||||
) {
|
) {
|
||||||
return new CartridgeELFWidget(boss, lfont, nfont, x, y, w, h, *this);
|
return new CartridgeELFWidget(boss, lfont, nfont, x, y, w, h, *this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
string CartridgeELF::getDebugLog() const
|
string CartridgeELF::getDebugLog() const
|
||||||
{
|
{
|
||||||
ostringstream s;
|
ostringstream s;
|
||||||
|
@ -390,7 +399,10 @@ string CartridgeELF::getDebugLog() const
|
||||||
s
|
s
|
||||||
<< "ARM entrypoint: 0x"
|
<< "ARM entrypoint: 0x"
|
||||||
<< std::hex << std::setw(8) << std::setfill('0') << myArmEntrypoint
|
<< std::hex << std::setw(8) << std::setfill('0') << myArmEntrypoint
|
||||||
<< std::dec << '\n';
|
<< '\n'
|
||||||
|
<< "vsclib stubs @ 0x" << std::setw(8) << ADDR_STUB_BASE
|
||||||
|
<< " size 0x" << std::setw(8) << STUB_SIZE << "\n"
|
||||||
|
<< std::dec;
|
||||||
|
|
||||||
dumpLinkage(myElfParser, *myLinker, s);
|
dumpLinkage(myElfParser, *myLinker, s);
|
||||||
|
|
||||||
|
|
|
@ -30,11 +30,13 @@ class ElfLinker;
|
||||||
|
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
class CartridgeELFWidget;
|
class CartridgeELFWidget;
|
||||||
|
class CartridgeELFStateWidget;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
class CartridgeELF: public Cartridge {
|
class CartridgeELF: public Cartridge {
|
||||||
#ifdef DEBUGGER_SUPPORT
|
#ifdef DEBUGGER_SUPPORT
|
||||||
friend CartridgeELFWidget;
|
friend CartridgeELFWidget;
|
||||||
|
friend CartridgeELFStateWidget;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -84,6 +86,10 @@ class CartridgeELF: public Cartridge {
|
||||||
CartDebugWidget* debugWidget(
|
CartDebugWidget* debugWidget(
|
||||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, int x, int y, int w, int h
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, int x, int y, int w, int h
|
||||||
) override;
|
) override;
|
||||||
|
|
||||||
|
CartDebugWidget* infoWidget(
|
||||||
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, int x, int y, int w, int h
|
||||||
|
) override;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -773,11 +773,36 @@ CortexM0& CortexM0::setRegister(uInt8 regno, uInt32 value)
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt32 CortexM0::getRegister(uInt32 regno)
|
uInt32 CortexM0::getRegister(uInt32 regno) const
|
||||||
{
|
{
|
||||||
return read_register(regno);
|
return read_register(regno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool CortexM0::getN() const
|
||||||
|
{
|
||||||
|
return znFlags & 0x80000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool CortexM0::getZ() const
|
||||||
|
{
|
||||||
|
return znFlags == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool CortexM0::getC() const
|
||||||
|
{
|
||||||
|
return cFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool CortexM0::getV() const
|
||||||
|
{
|
||||||
|
return vFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt8 CortexM0::decodeInstructionWord(uInt16 instructionWord)
|
uInt8 CortexM0::decodeInstructionWord(uInt16 instructionWord)
|
||||||
{
|
{
|
||||||
|
|
|
@ -127,7 +127,12 @@ class CortexM0: public Serializable
|
||||||
CortexM0& reset();
|
CortexM0& reset();
|
||||||
CortexM0& setPc(uInt32 pc);
|
CortexM0& setPc(uInt32 pc);
|
||||||
CortexM0& setRegister(uInt8 regno, uInt32 value);
|
CortexM0& setRegister(uInt8 regno, uInt32 value);
|
||||||
uInt32 getRegister(uInt32 regno);
|
uInt32 getRegister(uInt32 regno) const;
|
||||||
|
|
||||||
|
bool getN() const;
|
||||||
|
bool getZ() const;
|
||||||
|
bool getC() const;
|
||||||
|
bool getV() const;
|
||||||
|
|
||||||
static uInt8 decodeInstructionWord(uInt16 instructionWord);
|
static uInt8 decodeInstructionWord(uInt16 instructionWord);
|
||||||
|
|
||||||
|
|
|
@ -548,6 +548,7 @@
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\debugger\gui\CartELFWidget.cxx" />
|
<ClCompile Include="..\..\debugger\gui\CartELFWidget.cxx" />
|
||||||
|
<ClCompile Include="..\..\debugger\gui\CartELFStateWidget.cxx" />
|
||||||
<ClCompile Include="..\..\debugger\gui\CartEnhancedWidget.cxx">
|
<ClCompile Include="..\..\debugger\gui\CartEnhancedWidget.cxx">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -1521,6 +1522,7 @@
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\debugger\gui\CartELFWidget.hxx" />
|
<ClInclude Include="..\..\debugger\gui\CartELFWidget.hxx" />
|
||||||
|
<ClInclude Include="..\..\debugger\gui\CartELFStateWidget.hxx" />
|
||||||
<ClInclude Include="..\..\debugger\gui\CartEnhancedWidget.hxx">
|
<ClInclude Include="..\..\debugger\gui\CartEnhancedWidget.hxx">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug-NoDebugger|x64'">true</ExcludedFromBuild>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
|
@ -1266,6 +1266,9 @@
|
||||||
<ClCompile Include="..\..\debugger\gui\CartELFWidget.cxx">
|
<ClCompile Include="..\..\debugger\gui\CartELFWidget.cxx">
|
||||||
<Filter>Source Files\debugger\gui</Filter>
|
<Filter>Source Files\debugger\gui</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\..\debugger\gui\CartELFStateWidget.cxx">
|
||||||
|
<Filter>Source Files\debugger\gui</Filter>
|
||||||
|
</ClCompile>
|
||||||
<ClCompile Include="..\..\emucore\CortexM0.cxx">
|
<ClCompile Include="..\..\emucore\CortexM0.cxx">
|
||||||
<Filter>Source Files\emucore</Filter>
|
<Filter>Source Files\emucore</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
@ -2564,6 +2567,9 @@
|
||||||
<ClInclude Include="..\..\debugger\gui\CartELFWidget.hxx">
|
<ClInclude Include="..\..\debugger\gui\CartELFWidget.hxx">
|
||||||
<Filter>Header Files\debugger\gui</Filter>
|
<Filter>Header Files\debugger\gui</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\..\debugger\gui\CartELFStateWidget.hxx">
|
||||||
|
<Filter>Header Files\debugger\gui</Filter>
|
||||||
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\emucore\elf\BusTransactionQueue.hxx">
|
<ClInclude Include="..\..\emucore\elf\BusTransactionQueue.hxx">
|
||||||
<Filter>Header Files\emucore\elf</Filter>
|
<Filter>Header Files\emucore\elf</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
|
Loading…
Reference in New Issue