Commit 7973140c authored by thrust26's avatar thrust26
Browse files

refactored and split CartCDFWidget.cxx (see CartCDFInfoWidget.cxx)

parent a794bb98
//============================================================================
//
// 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-2019 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 "CartCDFInfoWidget.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeCDFInfoWidget::CartridgeCDFInfoWidget(
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),
myCart(cart)
{
uInt16 size = 8 * 4096;
ostringstream info;
info << describeCDFVersion(cart.myCDFSubtype) << " cartridge\n"
<< "32K ROM, seven 4K banks are accessible to 2600\n"
<< "8K CDF RAM\n"
<< "CDF registers accessible @ $FFF0 - $FFF3\n"
<< "Banks accessible at hotspots $FFF5 to $FFFB\n"
<< "Startup bank = " << cart.startBank() << "\n";
#if 0
// Eventually, we should query this from the debugger/disassembler
for(uInt32 i = 0, offset = 0xFFC, spot = 0xFF5; i < 7; ++i, offset += 0x1000)
{
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
start -= start % 0x1000;
info << "Bank " << i << " @ $" << HEX4 << (start + 0x80) << " - "
<< "$" << (start + 0xFFF) << " (hotspot = $" << (spot+i) << ")\n";
}
#endif
addBaseInformation(size, "AtariAge", info.str());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string CartridgeCDFInfoWidget::describeCDFVersion(CartridgeCDF::CDFSubtype subtype)
{
switch(subtype)
{
case CartridgeCDF::CDFSubtype::CDF0:
return "CDF (v0)";
case CartridgeCDF::CDFSubtype::CDF1:
return "CDF (v1)";
case CartridgeCDF::CDFSubtype::CDFJ:
return "CDFJ";
default:
throw runtime_error("unreachable");
}
}
\ No newline at end of file
//============================================================================
//
// 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-2019 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 CARTRIDGECDF_INFO_WIDGET_HXX
#define CARTRIDGECDF_INFO_WIDGET_HXX
#include "CartCDF.hxx"
#include "CartDebugWidget.hxx"
class CartridgeCDFInfoWidget : public CartDebugWidget
{
public:
CartridgeCDFInfoWidget(GuiObject* boss, const GUI::Font& lfont,
const GUI::Font& nfont,
int x, int y, int w, int h,
CartridgeCDF& cart);
virtual ~CartridgeCDFInfoWidget() = default;
private:
CartridgeCDF& myCart;
private:
static string describeCDFVersion(CartridgeCDF::CDFSubtype subtype);
// Following constructors and assignment operators not supported
CartridgeCDFInfoWidget() = delete;
CartridgeCDFInfoWidget(const CartridgeCDFInfoWidget&) = delete;
CartridgeCDFInfoWidget(CartridgeCDFInfoWidget&&) = delete;
CartridgeCDFInfoWidget& operator=(const CartridgeCDFInfoWidget&) = delete;
CartridgeCDFInfoWidget& operator=(CartridgeCDFInfoWidget&&) = delete;
};
#endif
......@@ -19,29 +19,6 @@
#include "PopUpWidget.hxx"
#include "CartCDFWidget.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string CartridgeCDFWidget::describeCDFVersion(CartridgeCDF::CDFSubtype subtype) {
switch (subtype) {
case CartridgeCDF::CDFSubtype::CDF0:
return "CDF (v0)";
case CartridgeCDF::CDFSubtype::CDF1:
return "CDF (v1)";
case CartridgeCDF::CDFSubtype::CDFJ:
return "CDFJ";
default:
throw runtime_error("unreachable");
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CartridgeCDFWidget::isCDFJ() const
{
return myCart.myCDFSubtype == CartridgeCDF::CDFSubtype::CDFJ;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CartridgeCDFWidget::CartridgeCDFWidget(
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
......@@ -49,30 +26,12 @@ CartridgeCDFWidget::CartridgeCDFWidget(
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
myCart(cart)
{
uInt16 size = 8 * 4096;
ostringstream info;
info << describeCDFVersion(cart.myCDFSubtype) << " cartridge\n"
<< "32K ROM, seven 4K banks are accessible to 2600\n"
<< "8K CDF RAM\n"
<< "CDF registers accessible @ $FFF0 - $FFF3\n"
<< "Banks accessible at hotspots $FFF5 to $FFFB\n"
<< "Startup bank = " << cart.startBank() << "\n";
#if 0
// Eventually, we should query this from the debugger/disassembler
for(uInt32 i = 0, offset = 0xFFC, spot = 0xFF5; i < 7; ++i, offset += 0x1000)
{
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
start -= start % 0x1000;
info << "Bank " << i << " @ $" << HEX4 << (start + 0x80) << " - "
<< "$" << (start + 0xFFF) << " (hotspot = $" << (spot+i) << ")\n";
}
#endif
const int VBORDER = 8;
const int HBORDER = 2;
const int INDENT = 20;
const int VGAP = 4;
int xpos = 10,
ypos = addBaseInformation(size, "AtariAge", info.str()) +
myLineHeight;
int xpos = HBORDER, ypos = VBORDER;
VariantList items;
VarList::push_back(items, "0 ($FFF5)");
......@@ -82,35 +41,46 @@ CartridgeCDFWidget::CartridgeCDFWidget(
VarList::push_back(items, "4 ($FFF9)");
VarList::push_back(items, "5 ($FFFA)");
VarList::push_back(items, "6 ($FFFB)");
myBank =
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("0 ($FFFx) "),
myLineHeight, items, "Set bank ",
_font.getStringWidth("Set bank "), kBankChanged);
myBank = new PopUpWidget(boss, _font, xpos, ypos, _font.getStringWidth("0 ($FFFx) "),
myLineHeight, items,
"Set bank ", _font.getStringWidth("Set bank "), kBankChanged);
myBank->setTarget(this);
addFocusWidget(myBank);
//addFocusWidget(myBank);
// Fast Fetch flag
myFastFetch = new CheckboxWidget(boss, _font, myBank->getRight() + 24, ypos + 1,
"Fast Fetcher enabled");
myFastFetch->setTarget(this);
myFastFetch->setEditable(false);
int lwidth = _font.getStringWidth("Datastream Increments"); // get width of the widest label
int lwidth;
// Datastream Pointers
#define DS_X 30
#define DS_X (HBORDER + _font.getStringWidth("xx "))
xpos = DS_X;
ypos += myLineHeight + 4;
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
myFontHeight, "Datastream Pointers", TextAlign::Left);
xpos += lwidth;
ypos += myLineHeight + VGAP * 4;
new StaticTextWidget(boss, _font, xpos, ypos, "Datastream Pointers");
myDatastreamPointers = new DataGridWidget(boss, _nfont, DS_X, ypos+myLineHeight-2, 4, 8, 6, 32, Common::Base::F_16_3_2);
myDatastreamPointers = new DataGridWidget(boss, _nfont, DS_X,
ypos+myLineHeight, 4, 8, 6, 32,
Common::Base::F_16_3_2);
myDatastreamPointers->setTarget(this);
myDatastreamPointers->setEditable(false);
myCommandStreamPointer = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4, ypos+myLineHeight-2 + 8*myLineHeight, 1, 1, 6, 32, Common::Base::F_16_3_2);
myCommandStreamPointer = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4,
ypos+myLineHeight + 8*myLineHeight, 1, 1, 6, 32,
Common::Base::F_16_3_2);
myCommandStreamPointer->setTarget(this);
myCommandStreamPointer->setEditable(false);
if (isCDFJ())
myJumpStreamPointers = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 2 / 4, ypos+myLineHeight-2 + 9*myLineHeight, 2, 1, 6, 32, Common::Base::F_16_3_2);
myJumpStreamPointers = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 2 / 4,
ypos+myLineHeight + 9*myLineHeight, 2, 1, 6, 32,
Common::Base::F_16_3_2);
else
myJumpStreamPointers = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4, ypos+myLineHeight-2 + 9*myLineHeight, 1, 1, 6, 32, Common::Base::F_16_3_2);
myJumpStreamPointers = new DataGridWidget(boss, _nfont, DS_X + myDatastreamPointers->getWidth() * 3 / 4,
ypos+myLineHeight + 9*myLineHeight, 1, 1, 6, 32,
Common::Base::F_16_3_2);
myJumpStreamPointers->setTarget(this);
myJumpStreamPointers->setEditable(false);
......@@ -119,97 +89,105 @@ CartridgeCDFWidget::CartridgeCDFWidget(
{
myDatastreamLabels[row] =
new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "),
ypos+myLineHeight-2 + row*myLineHeight + 2,
myFontWidth*2, myFontHeight, "", TextAlign::Left);
myDatastreamLabels[row]->setLabel(Common::Base::toString(row * 4, Common::Base::F_16_2));
ypos+myLineHeight + row*myLineHeight + 2, " ");
myDatastreamLabels[row]->setLabel(Common::Base::toString(row * 4,
Common::Base::F_16_2));
}
lwidth = _font.getStringWidth("Jump Data (21+22)");
lwidth = _font.getStringWidth("Jump Data (21|22)");
myDatastreamLabels[8] =
new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "),
ypos+myLineHeight-2 + 8*myLineHeight + 2,
lwidth, myFontHeight, "Write Data (20)", TextAlign::Left);
ypos+myLineHeight + 8*myLineHeight + 2,
lwidth, myFontHeight, "Write Data (20)");
myDatastreamLabels[9] =
new StaticTextWidget(_boss, _font, DS_X - _font.getStringWidth("xx "),
ypos+myLineHeight-2 + 9*myLineHeight + 2,
ypos+myLineHeight + 9*myLineHeight + 2,
lwidth, myFontHeight,
isCDFJ() ? "Jmp Data (21+22)" : "Jump Data (21)",
TextAlign::Left);
isCDFJ() ? "Jump Data (21|22)" : "Jump Data (21)");
// Datastream Increments
xpos = DS_X + myDatastreamPointers->getWidth() + 20;
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
myFontHeight, "Datastream Increments", TextAlign::Left);
xpos = DS_X + myDatastreamPointers->getWidth() + 16;
new StaticTextWidget(boss, _font, xpos, ypos, "Datastream Increments");
myDatastreamIncrements = new DataGridWidget(boss, _nfont, xpos, ypos+myLineHeight-2, 4, 8, 5, 32, Common::Base::F_16_2_2);
myDatastreamIncrements = new DataGridWidget(boss, _nfont, xpos,
ypos+myLineHeight, 4, 8, 5, 32,
Common::Base::F_16_2_2);
myDatastreamIncrements->setTarget(this);
myDatastreamIncrements->setEditable(false);
myCommandStreamIncrement = new DataGridWidget(boss, _nfont, xpos, ypos+myLineHeight-2 + 8*myLineHeight, 1, 1, 5, 32, Common::Base::F_16_2_2);
myCommandStreamIncrement = new DataGridWidget(boss, _nfont, xpos,
ypos+myLineHeight + 8*myLineHeight, 1, 1, 5, 32,
Common::Base::F_16_2_2);
myCommandStreamIncrement->setTarget(this);
myCommandStreamIncrement->setEditable(false);
myJumpStreamIncrements = new DataGridWidget(boss, _nfont, xpos, ypos+myLineHeight-2 + 9*myLineHeight, isCDFJ() ? 2 : 1, 1, 5, 32, Common::Base::F_16_2_2);
myJumpStreamIncrements = new DataGridWidget(boss, _nfont, xpos,
ypos+myLineHeight + 9*myLineHeight, isCDFJ() ? 2 : 1, 1, 5, 32,
Common::Base::F_16_2_2);
myJumpStreamIncrements->setTarget(this);
myJumpStreamIncrements->setEditable(false);
xpos = HBORDER; ypos += myLineHeight * 11 + VGAP * 4;
lwidth = _font.getStringWidth("Waveform Sizes ");
// Music counters
xpos = 10; ypos += myLineHeight*12 + 4;
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
myFontHeight, "Music Counters", TextAlign::Left);
new StaticTextWidget(_boss, _font, xpos, ypos, "Music States:");
xpos += INDENT;
ypos += myLineHeight + VGAP;
new StaticTextWidget(boss, _font, xpos, ypos, "Counters");
xpos += lwidth;
myMusicCounters = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 8, 32, Common::Base::F_16_8);
myMusicCounters = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 8, 32,
Common::Base::F_16_8);
myMusicCounters->setTarget(this);
myMusicCounters->setEditable(false);
// Music frequencies
xpos = 10; ypos += myLineHeight + 4;
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
myFontHeight, "Music Frequencies", TextAlign::Left);
xpos = HBORDER + INDENT; ypos += myLineHeight + VGAP;
new StaticTextWidget(boss, _font, xpos, ypos, "Frequencies");
xpos += lwidth;
myMusicFrequencies = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 8, 32, Common::Base::F_16_8);
myMusicFrequencies = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 8, 32,
Common::Base::F_16_8);
myMusicFrequencies->setTarget(this);
myMusicFrequencies->setEditable(false);
// Music waveforms
xpos = 10; ypos += myLineHeight + 4;
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
myFontHeight, "Music Waveforms", TextAlign::Left);
xpos = HBORDER + INDENT; ypos += myLineHeight + VGAP;
new StaticTextWidget(boss, _font, xpos, ypos, "Waveforms");
xpos += lwidth;
myMusicWaveforms = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 4, 16, Common::Base::F_16_2);
myMusicWaveforms = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 8, 16,
Common::Base::F_16_2);
myMusicWaveforms->setTarget(this);
myMusicWaveforms->setEditable(false);
int xpossp = xpos + myMusicWaveforms->getWidth() + 20;
int lwidth2 = _font.getStringWidth("Sample Pointer ");
new StaticTextWidget(boss, _font, xpossp, ypos, lwidth2,
myFontHeight, "Sample Pointer ", TextAlign::Left);
mySamplePointer = new DataGridWidget(boss, _nfont, xpossp + lwidth2, ypos-2, 1, 1, 8, 32, Common::Base::F_16_8);
mySamplePointer->setTarget(this);
mySamplePointer->setEditable(false);
// Music waveform sizes
xpos = 10; ypos += myLineHeight + 4;
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
myFontHeight, "Music Waveform Sizes", TextAlign::Left);
xpos = HBORDER + INDENT; ypos += myLineHeight + VGAP;
new StaticTextWidget(boss, _font, xpos, ypos, "Waveform Sizes");
xpos += lwidth;
myMusicWaveformSizes = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 4, 16, Common::Base::F_16_2);
myMusicWaveformSizes = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 8, 16,
Common::Base::F_16_2);
myMusicWaveformSizes->setTarget(this);
myMusicWaveformSizes->setEditable(false);
// Fast Fetch and Digital Audio flags
xpos = 10; ypos += myLineHeight + 4;
myFastFetch = new CheckboxWidget(boss, _font, xpos, ypos, "Fast Fetcher enabled");
myFastFetch->setTarget(this);
myFastFetch->setEditable(false);
// Digital Audio flag
xpos = HBORDER; ypos += myLineHeight + VGAP;
myDigitalSample = new CheckboxWidget(boss, _font, xpossp, ypos, "Digital Sample mode");
myDigitalSample = new CheckboxWidget(boss, _font, xpos, ypos, "Digital Sample mode");
myDigitalSample->setTarget(this);
myDigitalSample->setEditable(false);
xpos = HBORDER + INDENT; ypos += myLineHeight + VGAP;
int lwidth2 = _font.getStringWidth("Sample Pointer ");
new StaticTextWidget(boss, _font, xpos, ypos, "Sample Pointer");
mySamplePointer = new DataGridWidget(boss, _nfont, xpos + lwidth2, ypos - 2, 1, 1, 8, 32,
Common::Base::F_16_8);
mySamplePointer->setTarget(this);
mySamplePointer->setEditable(false);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
......@@ -474,3 +452,28 @@ uInt8 CartridgeCDFWidget::internalRamGetValue(int addr)
{
return myCart.myCDFRAM[addr];
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
string CartridgeCDFWidget::describeCDFVersion(CartridgeCDF::CDFSubtype subtype)
{
switch(subtype)
{
case CartridgeCDF::CDFSubtype::CDF0:
return "CDF (v0)";
case CartridgeCDF::CDFSubtype::CDF1:
return "CDF (v1)";
case CartridgeCDF::CDFSubtype::CDFJ:
return "CDFJ";
default:
throw runtime_error("unreachable");
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CartridgeCDFWidget::isCDFJ() const
{
return myCart.myCDFSubtype == CartridgeCDF::CDFSubtype::CDFJ;
}
......@@ -45,24 +45,22 @@ int CartDebugWidget::addBaseInformation(int bytes, const string& manufacturer,
EditTextWidget* w = nullptr;
ostringstream buf;
int x = 10, y = 10;
int x = 2, y = 8;
// Add ROM size, manufacturer and bankswitch info
new StaticTextWidget(_boss, _font, x, y, lwidth,
myFontHeight, "ROM Size ", TextAlign::Left);
new StaticTextWidget(_boss, _font, x, y + 1, "ROM Size ");
buf << bytes << " bytes";
if(bytes >= 1024)
buf << " / " << (bytes/1024) << "KB";
w = new EditTextWidget(_boss, _nfont, x+lwidth, y,
fwidth, myLineHeight, buf.str());
w = new EditTextWidget(_boss, _nfont, x+lwidth, y - 1,
fwidth, myLineHeight, buf.str());
w->setEditable(false);
y += myLineHeight + 4;
new StaticTextWidget(_boss, _font, x, y, lwidth,
myFontHeight, "Manufacturer ", TextAlign::Left);
w = new EditTextWidget(_boss, _nfont, x+lwidth, y,
fwidth, myLineHeight, manufacturer);
new StaticTextWidget(_boss, _font, x, y + 1, "Manufacturer ");
w = new EditTextWidget(_boss, _nfont, x+lwidth, y - 1,
fwidth, myLineHeight, manufacturer);
w->setEditable(false);
y += myLineHeight + 4;
......@@ -72,10 +70,9 @@ int CartDebugWidget::addBaseInformation(int bytes, const string& manufacturer,
if(lines < 3) lines = 3;
if(lines > maxlines) lines = maxlines;
new StaticTextWidget(_boss, _font, x, y, lwidth,
myFontHeight, "Description ", TextAlign::Left);
myDesc = new StringListWidget(_boss, _nfont, x+lwidth, y,
fwidth, lines * myLineHeight, false);
new StaticTextWidget(_boss, _font, x, y + 1, "Description ");
myDesc = new StringListWidget(_boss, _nfont, x+lwidth, y - 1,
fwidth, lines * myLineHeight, false);
myDesc->setEditable(false);
myDesc->setList(sl);
......@@ -93,5 +90,5 @@ void CartDebugWidget::invalidate()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void CartDebugWidget::loadConfig()
{
myDesc->setSelected(0);
//myDesc->setSelected(0);
}
......@@ -44,18 +44,17 @@ CartRamWidget::CartRamWidget(
EditTextWidget* etw = nullptr;
ostringstream buf;
int xpos = 2, ypos = 5;
int xpos = 2, ypos = 8;
// Add RAM size
new StaticTextWidget(_boss, _font, xpos, ypos, lwidth,
myFontHeight, "RAM Size ", TextAlign::Left);
new StaticTextWidget(_boss, _font, xpos, ypos + 1, "RAM Size ");
uInt32 ramsize = cartDebug.internalRamSize();
buf << ramsize << " bytes";
if(ramsize >= 1024)
buf << " / " << (ramsize/1024) << "KB";
etw = new EditTextWidget(boss, nfont, xpos+lwidth, ypos,
etw = new EditTextWidget(boss, nfont, xpos+lwidth, ypos - 1,
fwidth, myLineHeight, buf.str());
etw->setEditable(false);
ypos += myLineHeight + 4;
......@@ -69,9 +68,8 @@ CartRamWidget::CartRamWidget(
if(lines < 3) lines = 3;
if(lines > maxlines) lines = maxlines;
new StaticTextWidget(_boss, _font, xpos, ypos, lwidth,
myFontHeight, "Description ", TextAlign::Left);
myDesc = new StringListWidget(boss, nfont, xpos+lwidth, ypos,
new StaticTextWidget(_boss, _font, xpos, ypos + 1, "Description ");
myDesc = new StringListWidget(boss, nfont, xpos+lwidth, ypos - 1,
fwidth, lines * myLineHeight, false);
myDesc->setEditable(false);
myDesc->setList(sl);
......
......@@ -661,8 +661,10 @@ void DataGridWidget::drawWidget(bool hilite)
// Cross out the grid?
if(_crossGrid)
for(row = 1; row < 4; ++row)
s.hLine(_x, _y + (row * lineheight/4), _x + linewidth, kColor);
{
s.line(_x + 1, _y + 1, _x + _w - 2, _y + _h - 1, kColor);
s.line(_x + _w - 2, _y + 1, _x + 1, _y + _h - 1, kColor);
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
......
......@@ -632,14 +632,26 @@ void DebuggerDialog::addRomArea()
addTabWidget(myRomTab);
// The main disassembly tab
tabID = myRomTab->addTab(" Disassembly ");
tabID = myRomTab->addTab(" Disassembly ", TabWidget::AUTO_WIDTH);
myRom = new RomWidget(myRomTab, *myLFont, *myNFont, 2, 2, tabWidth - 1,
tabHeight - myRomTab->getTabHeight() - 2);
myRomTab->setParentWidget(tabID, myRom);
addToFocusList(myRom->getFocusList(), myRomTab, tabID);
// The 'cart-specific' information tab
tabID = myRomTab->addTab(instance().console().cartridge().name());
// The 'cart-specific' information tab (optional)
tabID = myRomTab->addTab(" " + instance().console().cartridge().name() + " ", TabWidget::AUTO_WIDTH);
myCartInfo = instance().console().cartridge().infoWidget(
myRomTab, *myLFont, *myNFont, 2, 2, tabWidth - 1,
tabHeight - myRomTab->getTabHeight() - 2);
if(myCartInfo != nullptr)
{
myRomTab->setParentWidget(tabID, myCartInfo);
addToFocusList(myCartInfo->getFocusList(), myRomTab, tabID);
tabID = myRomTab->addTab(" States ", TabWidget::AUTO_WIDTH);
}
// The 'cart-specific' state tab
myCartDebug = instance().console().cartridge().debugWidget(
myRomTab, *myLFont, *myNFont, 2, 2, tabWidth - 1,
tabHeight - myRomTab->getTabHeight() - 2);
......@@ -651,7 +663,7 @@ void DebuggerDialog::addRomArea()
// The cartridge RAM tab
if (myCartDebug->internalRamSize() > 0)
{
tabID = myRomTab->addTab(" Cartridge RAM ");
tabID = myRomTab->addTab(" Cartridge RAM ", TabWidget::AUTO_WIDTH);
myCartRam =
new CartRamWidget(myRomTab, *myLFont, *myNFont, 2, 2, tabWidth - 1,
tabHeight - myRomTab->getTabHeight() - 2, *myCartDebug);
......
......@@ -124,6 +124,7 @@ class DebuggerDialog : public Dialog
CpuWidget* myCpu;
RamWidget* myRam;
RomWidget* myRom;
CartDebugWidget* myCartInfo;
CartDebugWidget* myCartDebug;
CartRamWidget* myCartRam;
EditTextWidget* myMessageBox;
......
......@@ -199,6 +199,16 @@ class Cartridge : public Device
*/
virtual uInt32 thumbCallback(uInt8 function, uInt32 value1, uInt32 value2) { return 0; }
/**
Get optional debugger widget responsible for displaying info about the cart.
This can be used when the debugWidget runs out of space.
*/
virtual CartDebugWidget* infoWidget(GuiObject* boss, const GUI::Font& lfont,
const GUI::Font& nfont, int x, int y, int w, int h)
{
return nullptr;
}
/**