From 3728fb40b1bc320c5bab0cbce33935f4e66f12f3 Mon Sep 17 00:00:00 2001 From: thrust26 Date: Tue, 26 May 2020 15:30:32 +0200 Subject: [PATCH] fixed #645 --- src/debugger/gui/Cart3EPlusWidget.cxx | 90 ++++++++++++++------------- src/debugger/gui/Cart3EPlusWidget.hxx | 9 +-- 2 files changed, 51 insertions(+), 48 deletions(-) diff --git a/src/debugger/gui/Cart3EPlusWidget.cxx b/src/debugger/gui/Cart3EPlusWidget.cxx index 8e7cdf063..a0d97ad2b 100644 --- a/src/debugger/gui/Cart3EPlusWidget.cxx +++ b/src/debugger/gui/Cart3EPlusWidget.cxx @@ -39,7 +39,7 @@ string Cartridge3EPlusWidget::description() uInt16 numRomBanks = myCart.romBankCount(); uInt16 numRamBanks = myCart.ramBankCount(); - info << "3E+ cartridge - (4..64K ROM + RAM)\n" + info << "3E+ cartridge - (4" << ELLIPSIS << "64K ROM + RAM)\n" << " " << numRomBanks << " 1K ROM banks + " << numRamBanks << " 512b RAM banks\n" << " mapped into four segments\n" "ROM bank & segment selected by writing to $3F\n" @@ -61,6 +61,7 @@ void Cartridge3EPlusWidget::bankSelect(int& ypos) { size_t size; const uInt8* image = myCart.getImage(size); + const int VGAP = myFontHeight / 4; VariantList banktype; VarList::push_back(banktype, "ROM", "ROM"); @@ -68,6 +69,8 @@ void Cartridge3EPlusWidget::bankSelect(int& ypos) myBankWidgets = make_unique(bankSegs()); + ypos -= VGAP * 2; + for(uInt32 seg = 0; seg < bankSegs(); ++seg) { int xpos = 2, xpos_s, ypos_s = ypos + 1, width; @@ -77,20 +80,25 @@ void Cartridge3EPlusWidget::bankSelect(int& ypos) label << "Set segment " << seg << " as "; new StaticTextWidget(_boss, _font, xpos, ypos, label.str()); - ypos += myLineHeight + 8; + ypos += myLineHeight + VGAP * 2; xpos += _font.getMaxCharWidth() * 2; - CartridgeEnhancedWidget::bankList(myCart.romBankCount(), seg, items, width); + CartridgeEnhancedWidget::bankList(std::max(myCart.romBankCount(), myCart.ramBankCount()), + seg, items, width); myBankWidgets[seg] = new PopUpWidget(_boss, _font, xpos, ypos - 2, width, - myLineHeight, items, "Bank "); + myLineHeight, items, "Bank ", 0, kBankChanged); + myBankWidgets[seg]->setID(seg); + myBankWidgets[seg]->setTarget(this); addFocusWidget(myBankWidgets[seg]); xpos += myBankWidgets[seg]->getWidth(); myBankType[seg] = new PopUpWidget(_boss, _font, xpos, ypos - 2, 3 * _font.getMaxCharWidth(), - myLineHeight, banktype, " of "); + myLineHeight, banktype, " of ", 0, kRomRamChanged); + myBankType[seg]->setID(seg); + myBankType[seg]->setTarget(this); addFocusWidget(myBankType[seg]); xpos = myBankType[seg]->getRight() + _font.getMaxCharWidth(); @@ -98,7 +106,8 @@ void Cartridge3EPlusWidget::bankSelect(int& ypos) // add "Commit" button (why required?) myBankCommit[seg] = new ButtonWidget(_boss, _font, xpos, ypos - 4, _font.getStringWidth(" Commit "), myButtonHeight, - "Commit", bankEnum[seg]); + "Commit", kChangeBank); + myBankCommit[seg]->setID(seg); myBankCommit[seg]->setTarget(this); addFocusWidget(myBankCommit[seg]); @@ -117,7 +126,7 @@ void Cartridge3EPlusWidget::bankSelect(int& ypos) myBankState[2 * seg] = new EditTextWidget(_boss, _font, xoffset, ypos_s, _w - xoffset - 10, myLineHeight, ""); myBankState[2 * seg]->setEditable(false, true); - ypos_s += myLineHeight + 4; + ypos_s += myLineHeight + VGAP; label.str(""); label << "$" << Common::Base::HEX4 << addr2 << "-$" << Common::Base::HEX4 << (addr2 + 0x1FF); @@ -127,7 +136,7 @@ void Cartridge3EPlusWidget::bankSelect(int& ypos) _w - xoffset - 10, myLineHeight, ""); myBankState[2 * seg + 1]->setEditable(false, true); - ypos += 2 * myLineHeight; + ypos += myLineHeight + VGAP * 4; } } @@ -142,42 +151,44 @@ void Cartridge3EPlusWidget::loadConfig() void Cartridge3EPlusWidget::handleCommand(CommandSender* sender, int cmd, int data, int id) { - uInt16 segment = 0; + const uInt16 segment = id; + switch(cmd) { - case kBank0Changed: - segment = 0; + case kBankChanged: + case kRomRamChanged: + { + const bool isROM = myBankType[segment]->getSelectedTag() == "ROM"; + int bank = myBankWidgets[segment]->getSelected(); + + myBankCommit[segment]->setEnabled((isROM && bank < myCart.romBankCount()) + || (!isROM && bank < myCart.ramBankCount())); break; - case kBank1Changed: - segment = 1; - break; - case kBank2Changed: - segment = 2; - break; - case kBank3Changed: - segment = 3; + } + case kChangeBank: + { + // Ignore bank if either number or type hasn't been selected + if(myBankWidgets[segment]->getSelected() < 0 || + myBankType[segment]->getSelected() < 0) + return; + + uInt8 bank = myBankWidgets[segment]->getSelected(); + + myCart.unlockBank(); + + if(myBankType[segment]->getSelectedTag() == "ROM") + myCart.bank(bank, segment); + else + myCart.bank(bank + myCart.romBankCount(), segment); + + myCart.lockBank(); + invalidate(); + updateUIState(); break; + } default: break; } - - // Ignore bank if either number or type hasn't been selected - if(myBankWidgets[segment]->getSelected() < 0 || - myBankType[segment]->getSelected() < 0) - return; - - uInt8 bank = myBankWidgets[segment]->getSelected(); - - myCart.unlockBank(); - - if(myBankType[segment]->getSelectedTag() == "ROM") - myCart.bank(bank, segment); - else - myCart.bank(bank + myCart.romBankCount(), segment); - - myCart.lockBank(); - invalidate(); - updateUIState(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -234,8 +245,3 @@ string Cartridge3EPlusWidget::internalRamDescription() return desc.str(); } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const std::array Cartridge3EPlusWidget::bankEnum = { - kBank0Changed, kBank1Changed, kBank2Changed, kBank3Changed -}; diff --git a/src/debugger/gui/Cart3EPlusWidget.hxx b/src/debugger/gui/Cart3EPlusWidget.hxx index 7cde61042..44473e0cf 100644 --- a/src/debugger/gui/Cart3EPlusWidget.hxx +++ b/src/debugger/gui/Cart3EPlusWidget.hxx @@ -56,13 +56,10 @@ class Cartridge3EPlusWidget : public CartridgeEnhancedWidget std::array myBankCommit{nullptr}; std::array myBankState{nullptr}; - enum BankID { - kBank0Changed = 'b0CH', - kBank1Changed = 'b1CH', - kBank2Changed = 'b2CH', - kBank3Changed = 'b3CH' + enum { + kRomRamChanged = 'rrCh', + kChangeBank = 'chBk', }; - static const std::array bankEnum; private: // Following constructors and assignment operators not supported