mirror of https://github.com/stella-emu/stella.git
refactored CartMDM and CartSB widget classes
This commit is contained in:
parent
a67ea71dca
commit
2ae4631748
|
@ -17,45 +17,39 @@
|
|||
|
||||
#include "CartMDM.hxx"
|
||||
#include "PopUpWidget.hxx"
|
||||
#include "Widget.hxx"
|
||||
#include "CartMDMWidget.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
CartridgeMDMWidget::CartridgeMDMWidget(
|
||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||
int x, int y, int w, int h, CartridgeMDM& cart)
|
||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
||||
myCart(cart)
|
||||
: CartridgeEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart),
|
||||
myCartMDM(cart)
|
||||
{
|
||||
initialize();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string CartridgeMDMWidget::description()
|
||||
{
|
||||
ostringstream info;
|
||||
size_t size;
|
||||
|
||||
myCart.getImage(size);
|
||||
info << "Menu Driven Megacart, containing up to 128 4K banks\n"
|
||||
<< "Startup bank = " << cart.startBank() << "\n"
|
||||
<< "\nBanks are selected by reading from $800 - $BFF, where the lower "
|
||||
"byte determines the 4K bank to use.";
|
||||
info << "Menu Driven Megacart, " << myCart.romBankCount() << " 4K banks\n"
|
||||
<< "Banks are selected by reading from $800 - $" << Common::Base::HEX1 << 0xBFF
|
||||
<< ", where the lower byte determines the 4K bank to use.\n";
|
||||
info << CartridgeEnhancedWidget::description();
|
||||
|
||||
int xpos = 2,
|
||||
ypos = addBaseInformation(size, "Edwin Blink", info.str(), 15) + myLineHeight;
|
||||
return info.str();
|
||||
}
|
||||
|
||||
VariantList items;
|
||||
for(uInt32 i = 0x800; i < (0x800U + myCart.romBankCount()); ++i)
|
||||
{
|
||||
info.str("");
|
||||
info << std::dec << (i & 0xFF) << " ($" << Common::Base::HEX4 << i << ")";
|
||||
VarList::push_back(items, info.str());
|
||||
}
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeMDMWidget::bankSelect(int& ypos)
|
||||
{
|
||||
CartridgeEnhancedWidget::bankSelect(ypos);
|
||||
int xpos = myBankWidgets[0]->getRight() + 20;
|
||||
ypos = myBankWidgets[0]->getTop();
|
||||
|
||||
myBank =
|
||||
new PopUpWidget(boss, _font, xpos, ypos, _font.getStringWidth("xxx ($0FFF)"),
|
||||
myLineHeight, items, "Set bank ",
|
||||
0, kBankChanged);
|
||||
myBank->setTarget(this);
|
||||
addFocusWidget(myBank);
|
||||
|
||||
xpos += myBank->getWidth() + 30;
|
||||
myBankDisabled = new CheckboxWidget(boss, _font, xpos, ypos + 1,
|
||||
myBankDisabled = new CheckboxWidget(_boss, _font, xpos, ypos + 1,
|
||||
"Bankswitching is locked/disabled",
|
||||
kBankDisabled);
|
||||
myBankDisabled->setTarget(this);
|
||||
|
@ -65,39 +59,21 @@ CartridgeMDMWidget::CartridgeMDMWidget(
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeMDMWidget::loadConfig()
|
||||
{
|
||||
myBank->setSelectedIndex(myCart.getBank());
|
||||
myBank->setEnabled(!myCart.myBankingDisabled);
|
||||
myBankDisabled->setState(myCart.myBankingDisabled);
|
||||
myBankWidgets[0]->setEnabled(!myCartMDM.myBankingDisabled);
|
||||
myBankDisabled->setState(myCartMDM.myBankingDisabled);
|
||||
|
||||
CartDebugWidget::loadConfig();
|
||||
CartridgeEnhancedWidget::loadConfig();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeMDMWidget::handleCommand(CommandSender* sender,
|
||||
int cmd, int data, int id)
|
||||
{
|
||||
if(cmd == kBankChanged)
|
||||
if(cmd == kBankDisabled)
|
||||
{
|
||||
myCart.unlockBank();
|
||||
myCart.bank(myBank->getSelected());
|
||||
myCart.lockBank();
|
||||
invalidate();
|
||||
}
|
||||
else if(cmd == kBankDisabled)
|
||||
{
|
||||
myCart.myBankingDisabled = myBankDisabled->getState();
|
||||
myBank->setEnabled(!myCart.myBankingDisabled);
|
||||
myCartMDM.myBankingDisabled = myBankDisabled->getState();
|
||||
myBankWidgets[0]->setEnabled(!myCartMDM.myBankingDisabled);
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string CartridgeMDMWidget::bankState()
|
||||
{
|
||||
ostringstream& buf = buffer();
|
||||
|
||||
buf << "Bank = " << std::dec << myCart.getBank()
|
||||
<< ", hotspot = " << "$" << Common::Base::HEX4
|
||||
<< (myCart.getBank()+0x800);
|
||||
|
||||
return buf.str();
|
||||
else
|
||||
CartridgeEnhancedWidget::handleCommand(sender, cmd, data, id);
|
||||
}
|
||||
|
|
|
@ -20,11 +20,10 @@
|
|||
|
||||
class CartridgeMDM;
|
||||
class CheckboxWidget;
|
||||
class PopUpWidget;
|
||||
|
||||
#include "CartDebugWidget.hxx"
|
||||
#include "CartEnhancedWidget.hxx"
|
||||
|
||||
class CartridgeMDMWidget : public CartDebugWidget
|
||||
class CartridgeMDMWidget : public CartridgeEnhancedWidget
|
||||
{
|
||||
public:
|
||||
CartridgeMDMWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||
|
@ -34,18 +33,24 @@ class CartridgeMDMWidget : public CartDebugWidget
|
|||
virtual ~CartridgeMDMWidget() = default;
|
||||
|
||||
private:
|
||||
CartridgeMDM& myCart;
|
||||
PopUpWidget* myBank{nullptr};
|
||||
string manufacturer() override { return "Edwin Blink"; }
|
||||
|
||||
string description() override;
|
||||
|
||||
void bankSelect(int& ypos) override;
|
||||
|
||||
CartridgeMDM& myCartMDM;
|
||||
CheckboxWidget* myBankDisabled{nullptr};
|
||||
|
||||
enum { kBankChanged = 'bkCH', kBankDisabled = 'bkDI' };
|
||||
enum {
|
||||
kBankDisabled = 'bkDI'
|
||||
};
|
||||
|
||||
private:
|
||||
void loadConfig() override;
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
|
||||
string bankState() override;
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
CartridgeMDMWidget() = delete;
|
||||
CartridgeMDMWidget(const CartridgeMDMWidget&) = delete;
|
||||
|
|
|
@ -16,86 +16,27 @@
|
|||
//============================================================================
|
||||
|
||||
#include "CartSB.hxx"
|
||||
#include "PopUpWidget.hxx"
|
||||
#include "CartSBWidget.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
CartridgeSBWidget::CartridgeSBWidget(
|
||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||
int x, int y, int w, int h, CartridgeSB& cart)
|
||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
||||
myCart(cart)
|
||||
: CartridgeEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||
{
|
||||
VariantList items;
|
||||
ostringstream info, bank;
|
||||
size_t size;
|
||||
|
||||
myCart.getImage(size);
|
||||
info << "SB SUPERbanking, 32 or 64 4K banks\n"
|
||||
<< "Hotspots are from $800 to $"
|
||||
<< Common::Base::HEX2 << (0x800 + myCart.romBankCount() - 1) << ", including\n"
|
||||
<< "mirrors ($900, $A00, $B00, ...)\n"
|
||||
<< "Startup bank = " << std::dec << cart.startBank() << "\n";
|
||||
|
||||
// Eventually, we should query this from the debugger/disassembler
|
||||
for(uInt32 i = 0, offset = 0xFFC, spot = 0x800; i < myCart.romBankCount();
|
||||
++i, offset += 0x1000, ++spot)
|
||||
{
|
||||
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
|
||||
start -= start % 0x1000;
|
||||
info << "Bank " << std::dec << i << " @ $" << Common::Base::HEX4 << start << " - "
|
||||
<< "$" << (start + 0xFFF) << " (hotspot = $" << spot << ")\n";
|
||||
|
||||
bank << std::dec << std::setw(2) << std::setfill(' ') << i << " ($"
|
||||
<< Common::Base::HEX2 << spot << ")";
|
||||
VarList::push_back(items, bank.str());
|
||||
bank.str("");
|
||||
}
|
||||
|
||||
int xpos = 2,
|
||||
ypos = addBaseInformation(size, "Fred X. Quimby", info.str()) + myLineHeight;
|
||||
|
||||
myBank =
|
||||
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("XX ($800)"),
|
||||
myLineHeight, items, "Set bank ",
|
||||
0, kBankChanged);
|
||||
myBank->setTarget(this);
|
||||
addFocusWidget(myBank);
|
||||
initialize();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeSBWidget::loadConfig()
|
||||
string CartridgeSBWidget::description()
|
||||
{
|
||||
Debugger& dbg = instance().debugger();
|
||||
CartDebug& cart = dbg.cartDebug();
|
||||
const CartState& state = static_cast<const CartState&>(cart.getState());
|
||||
const CartState& oldstate = static_cast<const CartState&>(cart.getOldState());
|
||||
ostringstream info;
|
||||
|
||||
myBank->setSelectedIndex(myCart.getBank(), state.bank != oldstate.bank);
|
||||
info << "SB SUPERbanking, " << myCart.romBankCount() << " 4K banks\n"
|
||||
<< "Hotspots are from $800 to $"
|
||||
<< Common::Base::HEX2 << (0x800 + myCart.romBankCount() - 1) << ", including\n"
|
||||
<< "mirrors ($900, $" << 0xA00 << ", $" << 0xB00 << ", ...)\n";
|
||||
info << CartridgeEnhancedWidget::description();
|
||||
|
||||
CartDebugWidget::loadConfig();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeSBWidget::handleCommand(CommandSender* sender,
|
||||
int cmd, int data, int id)
|
||||
{
|
||||
if(cmd == kBankChanged)
|
||||
{
|
||||
myCart.unlockBank();
|
||||
myCart.bank(myBank->getSelected());
|
||||
myCart.lockBank();
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string CartridgeSBWidget::bankState()
|
||||
{
|
||||
ostringstream& buf = buffer();
|
||||
|
||||
buf << "Bank = " << std::dec << myCart.getBank()
|
||||
<< ", hotspot = $" << Common::Base::HEX2 << (myCart.getBank() + 0x800);
|
||||
|
||||
return buf.str();
|
||||
return info.str();
|
||||
}
|
||||
|
|
|
@ -19,11 +19,10 @@
|
|||
#define CARTRIDGESB_WIDGET_HXX
|
||||
|
||||
class CartridgeSB;
|
||||
class PopUpWidget;
|
||||
|
||||
#include "CartDebugWidget.hxx"
|
||||
#include "CartEnhancedWidget.hxx"
|
||||
|
||||
class CartridgeSBWidget : public CartDebugWidget
|
||||
class CartridgeSBWidget : public CartridgeEnhancedWidget
|
||||
{
|
||||
public:
|
||||
CartridgeSBWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||
|
@ -33,17 +32,11 @@ class CartridgeSBWidget : public CartDebugWidget
|
|||
virtual ~CartridgeSBWidget() = default;
|
||||
|
||||
private:
|
||||
CartridgeSB& myCart;
|
||||
PopUpWidget* myBank{nullptr};
|
||||
string manufacturer() override { return "Fred X. Quimby"; }
|
||||
|
||||
enum { kBankChanged = 'bkCH' };
|
||||
string description() override;
|
||||
|
||||
private:
|
||||
void loadConfig() override;
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
|
||||
string bankState() override;
|
||||
|
||||
// Following constructors and assignment operators not supported
|
||||
CartridgeSBWidget() = delete;
|
||||
CartridgeSBWidget(const CartridgeSBWidget&) = delete;
|
||||
|
|
|
@ -100,6 +100,8 @@ class CartridgeMDM : public CartridgeEnhanced
|
|||
*/
|
||||
string name() const override { return "CartridgeMDM"; }
|
||||
|
||||
uInt16 hotspot() const override { return 0x0800; }
|
||||
|
||||
#ifdef DEBUGGER_SUPPORT
|
||||
/**
|
||||
Get debugger widget responsible for accessing the inner workings
|
||||
|
|
|
@ -98,7 +98,7 @@ class CartridgeSB : public CartridgeEnhanced
|
|||
private:
|
||||
bool checkSwitchBank(uInt16 address, uInt8 value = 0) override;
|
||||
|
||||
uInt16 hotspot() const override { return 0x0840; }
|
||||
uInt16 hotspot() const override { return 0x0800; }
|
||||
|
||||
uInt16 getStartBank() const override { return romBankCount() - 1; }
|
||||
|
||||
|
|
Loading…
Reference in New Issue