mirror of https://github.com/stella-emu/stella.git
refactored CartFA(2), CartFC and CartFE widget classes
This commit is contained in:
parent
2e2471db68
commit
20c6998e71
|
@ -31,12 +31,14 @@ CartEnhancedWidget::CartEnhancedWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartEnhancedWidget::initialize()
|
int CartEnhancedWidget::initialize()
|
||||||
{
|
{
|
||||||
int ypos = addBaseInformation(size(), manufacturer(), description(), descriptionLines())
|
int ypos = addBaseInformation(size(), manufacturer(), description(), descriptionLines())
|
||||||
+ myLineHeight;
|
+ myLineHeight;
|
||||||
|
|
||||||
bankSelect(ypos);
|
bankSelect(ypos);
|
||||||
|
|
||||||
|
return ypos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -64,7 +66,7 @@ string CartEnhancedWidget::description()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
int CartEnhancedWidget::descriptionLines()
|
int CartEnhancedWidget::descriptionLines()
|
||||||
{
|
{
|
||||||
return 20; // should be enough for almost all types
|
return 18; // should be enough for almost all types
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -101,7 +103,12 @@ string CartEnhancedWidget::romDescription()
|
||||||
info << "Bank " << hash << std::dec << bank << " @ $"
|
info << "Bank " << hash << std::dec << bank << " @ $"
|
||||||
<< Common::Base::HEX4 << (start + myCart.myRomOffset) << " - $" << (start + 0xFFF);
|
<< Common::Base::HEX4 << (start + myCart.myRomOffset) << " - $" << (start + 0xFFF);
|
||||||
if(myCart.hotspot() != 0)
|
if(myCart.hotspot() != 0)
|
||||||
info << " " << hotspotStr(bank, 0, true);
|
{
|
||||||
|
string hs = hotspotStr(bank, 0, true);
|
||||||
|
if(hs.length() > 22)
|
||||||
|
info << "\n ";
|
||||||
|
info << " " << hs;
|
||||||
|
}
|
||||||
info << "\n";
|
info << "\n";
|
||||||
}
|
}
|
||||||
info << "Startup bank = #" << std::dec << myCart.startBank() << " or undetermined\n";
|
info << "Startup bank = #" << std::dec << myCart.startBank() << " or undetermined\n";
|
||||||
|
|
|
@ -37,7 +37,7 @@ class CartEnhancedWidget : public CartDebugWidget
|
||||||
virtual ~CartEnhancedWidget() = default;
|
virtual ~CartEnhancedWidget() = default;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void initialize();
|
int initialize();
|
||||||
|
|
||||||
virtual size_t size();
|
virtual size_t size();
|
||||||
|
|
||||||
|
|
|
@ -15,65 +15,25 @@
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "Debugger.hxx"
|
|
||||||
#include "CartDebug.hxx"
|
|
||||||
#include "CartFA2.hxx"
|
#include "CartFA2.hxx"
|
||||||
#include "PopUpWidget.hxx"
|
|
||||||
#include "CartFA2Widget.hxx"
|
#include "CartFA2Widget.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CartridgeFA2Widget::CartridgeFA2Widget(
|
CartridgeFA2Widget::CartridgeFA2Widget(
|
||||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||||
int x, int y, int w, int h, CartridgeFA2& cart)
|
int x, int y, int w, int h, CartridgeFA2& cart)
|
||||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
: CartEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||||
myCart(cart)
|
|
||||||
{
|
{
|
||||||
size_t size = cart.mySize;
|
|
||||||
|
|
||||||
ostringstream info;
|
|
||||||
info << "Modified FA RAM+, six or seven 4K banks\n"
|
|
||||||
<< "256 bytes RAM @ $F000 - $F1FF\n"
|
|
||||||
<< " $F100 - $F1FF (R), $F000 - $F0FF (W)\n"
|
|
||||||
<< "RAM can be loaded/saved to Harmony flash by accessing $FFF4\n"
|
|
||||||
<< "Startup bank = " << cart.startBank() << " or undetermined\n";
|
|
||||||
|
|
||||||
// Eventually, we should query this from the debugger/disassembler
|
|
||||||
for(uInt32 i = 0, offset = 0xFFC, spot = 0xFF5; i < cart.romBankCount();
|
|
||||||
++i, offset += 0x1000)
|
|
||||||
{
|
|
||||||
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
|
|
||||||
start -= start % 0x1000;
|
|
||||||
info << "Bank " << i << " @ $" << Common::Base::HEX4 << (start + 0x200) << " - "
|
|
||||||
<< "$" << (start + 0xFFF) << " (hotspot = $F" << (spot+i) << ")\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
int xpos = 2,
|
int xpos = 2,
|
||||||
ypos = addBaseInformation(size, "Chris D. Walton (Star Castle 2600)",
|
ypos = initialize();
|
||||||
info.str(), 15) + myLineHeight;
|
|
||||||
|
|
||||||
VariantList items;
|
ypos += 12;
|
||||||
VarList::push_back(items, "0 ($FFF5)");
|
|
||||||
VarList::push_back(items, "1 ($FFF6)");
|
|
||||||
VarList::push_back(items, "2 ($FFF7)");
|
|
||||||
VarList::push_back(items, "3 ($FFF8)");
|
|
||||||
VarList::push_back(items, "4 ($FFF9)");
|
|
||||||
VarList::push_back(items, "5 ($FFFA)");
|
|
||||||
if(cart.romBankCount() == 7)
|
|
||||||
VarList::push_back(items, "6 ($FFFB)");
|
|
||||||
|
|
||||||
myBank =
|
|
||||||
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("0 ($FFFx)"),
|
|
||||||
myLineHeight, items, "Set bank ",
|
|
||||||
0, kBankChanged);
|
|
||||||
myBank->setTarget(this);
|
|
||||||
addFocusWidget(myBank);
|
|
||||||
ypos += myLineHeight + 20;
|
|
||||||
|
|
||||||
const int bwidth = _font.getStringWidth("Erase") + 20;
|
const int bwidth = _font.getStringWidth("Erase") + 20;
|
||||||
|
|
||||||
StaticTextWidget* t = new StaticTextWidget(boss, _font, xpos, ypos,
|
StaticTextWidget* t = new StaticTextWidget(boss, _font, xpos, ypos,
|
||||||
_font.getStringWidth("Harmony Flash "),
|
_font.getStringWidth("Harmony flash memory "),
|
||||||
myFontHeight, "Harmony Flash ", TextAlign::Left);
|
myFontHeight, "Harmony flash memory ", TextAlign::Left);
|
||||||
|
|
||||||
xpos += t->getWidth() + 4;
|
xpos += t->getWidth() + 4;
|
||||||
myFlashErase =
|
myFlashErase =
|
||||||
|
@ -98,123 +58,39 @@ CartridgeFA2Widget::CartridgeFA2Widget(
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeFA2Widget::saveOldState()
|
string CartridgeFA2Widget::description()
|
||||||
{
|
{
|
||||||
myOldState.internalram.clear();
|
ostringstream info;
|
||||||
|
|
||||||
for(uInt32 i = 0; i < internalRamSize(); ++i)
|
info << "Modified FA RAM+, six or seven 4K banks\n";
|
||||||
myOldState.internalram.push_back(myCart.myRAM[i]);
|
info << "RAM+ can be loaded/saved to Harmony flash memory by accessing $"
|
||||||
|
<< Common::Base::HEX4 << 0xFFF4 << "\n";
|
||||||
|
info << CartEnhancedWidget::description();
|
||||||
|
|
||||||
myOldState.bank = myCart.getBank();
|
return info.str();
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFA2Widget::loadConfig()
|
|
||||||
{
|
|
||||||
myBank->setSelectedIndex(myCart.getBank(), myCart.getBank() != myOldState.bank);
|
|
||||||
|
|
||||||
CartDebugWidget::loadConfig();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeFA2Widget::handleCommand(CommandSender* sender,
|
void CartridgeFA2Widget::handleCommand(CommandSender* sender,
|
||||||
int cmd, int data, int id)
|
int cmd, int data, int id)
|
||||||
{
|
{
|
||||||
|
CartridgeFA2& cart = dynamic_cast<CartridgeFA2&>(myCart);
|
||||||
|
|
||||||
switch(cmd)
|
switch(cmd)
|
||||||
{
|
{
|
||||||
case kBankChanged:
|
|
||||||
myCart.unlockBank();
|
|
||||||
myCart.bank(myBank->getSelected());
|
|
||||||
myCart.lockBank();
|
|
||||||
invalidate();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case kFlashErase:
|
case kFlashErase:
|
||||||
myCart.flash(0);
|
cart.flash(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kFlashLoad:
|
case kFlashLoad:
|
||||||
myCart.flash(1);
|
cart.flash(1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kFlashSave:
|
case kFlashSave:
|
||||||
myCart.flash(2);
|
cart.flash(2);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
CartEnhancedWidget::handleCommand(sender, cmd, data, id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFA2Widget::bankState()
|
|
||||||
{
|
|
||||||
ostringstream& buf = buffer();
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 7> spot = {
|
|
||||||
"$FFF5", "$FFF6", "$FFF7", "$FFF8", "$FFF9", "$FFFA", "$FFFB"
|
|
||||||
};
|
|
||||||
buf << "Bank = " << std::dec << myCart.getBank()
|
|
||||||
<< ", hotspot = " << spot[myCart.getBank()];
|
|
||||||
|
|
||||||
return buf.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt32 CartridgeFA2Widget::internalRamSize()
|
|
||||||
{
|
|
||||||
return 256;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt32 CartridgeFA2Widget::internalRamRPort(int start)
|
|
||||||
{
|
|
||||||
return 0xF100 + start;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFA2Widget::internalRamDescription()
|
|
||||||
{
|
|
||||||
ostringstream desc;
|
|
||||||
desc << "$F000 - $F0FF used for Write Access\n"
|
|
||||||
<< "$F100 - $F1FF used for Read Access";
|
|
||||||
|
|
||||||
return desc.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
const ByteArray& CartridgeFA2Widget::internalRamOld(int start, int count)
|
|
||||||
{
|
|
||||||
myRamOld.clear();
|
|
||||||
for(int i = 0; i < count; i++)
|
|
||||||
myRamOld.push_back(myOldState.internalram[start + i]);
|
|
||||||
return myRamOld;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
const ByteArray& CartridgeFA2Widget::internalRamCurrent(int start, int count)
|
|
||||||
{
|
|
||||||
myRamCurrent.clear();
|
|
||||||
for(int i = 0; i < count; i++)
|
|
||||||
myRamCurrent.push_back(myCart.myRAM[start + i]);
|
|
||||||
return myRamCurrent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFA2Widget::internalRamSetValue(int addr, uInt8 value)
|
|
||||||
{
|
|
||||||
myCart.myRAM[addr] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt8 CartridgeFA2Widget::internalRamGetValue(int addr)
|
|
||||||
{
|
|
||||||
return myCart.myRAM[addr];
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFA2Widget::internalRamLabel(int addr)
|
|
||||||
{
|
|
||||||
CartDebug& dbg = instance().debugger().cartDebug();
|
|
||||||
return dbg.getLabel(addr + 0xF100, false);
|
|
||||||
}
|
|
||||||
|
|
|
@ -20,11 +20,10 @@
|
||||||
|
|
||||||
class CartridgeFA2;
|
class CartridgeFA2;
|
||||||
class ButtonWidget;
|
class ButtonWidget;
|
||||||
class PopUpWidget;
|
|
||||||
|
|
||||||
#include "CartDebugWidget.hxx"
|
#include "CartEnhancedWidget.hxx"
|
||||||
|
|
||||||
class CartridgeFA2Widget : public CartDebugWidget
|
class CartridgeFA2Widget : public CartEnhancedWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CartridgeFA2Widget(GuiObject* boss, const GUI::Font& lfont,
|
CartridgeFA2Widget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
@ -34,41 +33,22 @@ class CartridgeFA2Widget : public CartDebugWidget
|
||||||
virtual ~CartridgeFA2Widget() = default;
|
virtual ~CartridgeFA2Widget() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CartridgeFA2& myCart;
|
string manufacturer() override { return "Chris D. Walton (Star Castle 2600 Arcade)"; }
|
||||||
PopUpWidget* myBank{nullptr};
|
|
||||||
|
string description() override;
|
||||||
|
|
||||||
ButtonWidget *myFlashErase{nullptr}, *myFlashLoad{nullptr}, *myFlashSave{nullptr};
|
ButtonWidget *myFlashErase{nullptr}, *myFlashLoad{nullptr}, *myFlashSave{nullptr};
|
||||||
|
|
||||||
struct CartState {
|
|
||||||
ByteArray internalram;
|
|
||||||
uInt16 bank{0};
|
|
||||||
};
|
|
||||||
CartState myOldState;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kBankChanged = 'bkCH',
|
|
||||||
kFlashErase = 'flER',
|
kFlashErase = 'flER',
|
||||||
kFlashLoad = 'flLD',
|
kFlashLoad = 'flLD',
|
||||||
kFlashSave = 'flSV'
|
kFlashSave = 'flSV'
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void saveOldState() override;
|
|
||||||
void loadConfig() override;
|
|
||||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||||
|
|
||||||
string bankState() override;
|
private:
|
||||||
|
|
||||||
// start of functions for Cartridge RAM tab
|
|
||||||
uInt32 internalRamSize() override;
|
|
||||||
uInt32 internalRamRPort(int start) override;
|
|
||||||
string internalRamDescription() override;
|
|
||||||
const ByteArray& internalRamOld(int start, int count) override;
|
|
||||||
const ByteArray& internalRamCurrent(int start, int count) override;
|
|
||||||
void internalRamSetValue(int addr, uInt8 value) override;
|
|
||||||
uInt8 internalRamGetValue(int addr) override;
|
|
||||||
string internalRamLabel(int addr) override;
|
|
||||||
// end of functions for Cartridge RAM tab
|
|
||||||
|
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
CartridgeFA2Widget() = delete;
|
CartridgeFA2Widget() = delete;
|
||||||
CartridgeFA2Widget(const CartridgeFA2Widget&) = delete;
|
CartridgeFA2Widget(const CartridgeFA2Widget&) = delete;
|
||||||
|
|
|
@ -15,150 +15,25 @@
|
||||||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "Debugger.hxx"
|
|
||||||
#include "CartDebug.hxx"
|
|
||||||
#include "CartFA.hxx"
|
#include "CartFA.hxx"
|
||||||
#include "PopUpWidget.hxx"
|
|
||||||
#include "CartFAWidget.hxx"
|
#include "CartFAWidget.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CartridgeFAWidget::CartridgeFAWidget(
|
CartridgeFAWidget::CartridgeFAWidget(
|
||||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||||
int x, int y, int w, int h, CartridgeFA& cart)
|
int x, int y, int w, int h, CartridgeFA& cart)
|
||||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
: CartEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||||
myCart(cart)
|
|
||||||
{
|
{
|
||||||
uInt16 size = 3 * 4096;
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
string CartridgeFAWidget::description()
|
||||||
|
{
|
||||||
ostringstream info;
|
ostringstream info;
|
||||||
info << "CBS RAM+ FA cartridge, three 4K banks\n"
|
|
||||||
<< "256 bytes RAM @ $F000 - $F1FF\n"
|
|
||||||
<< " $F100 - $F1FF (R), $F000 - $F0FF (W)\n"
|
|
||||||
<< "Startup bank = " << cart.startBank() << " or undetermined\n";
|
|
||||||
|
|
||||||
// Eventually, we should query this from the debugger/disassembler
|
info << "CBS RAM+ FA cartridge, three 4K banks\n";
|
||||||
for(uInt32 i = 0, offset = 0xFFC, spot = 0xFF8; i < 3; ++i, offset += 0x1000)
|
info << CartEnhancedWidget::description();
|
||||||
{
|
|
||||||
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
|
|
||||||
start -= start % 0x1000;
|
|
||||||
info << "Bank " << i << " @ $" << Common::Base::HEX4 << (start + 0x200) << " - "
|
|
||||||
<< "$" << (start + 0xFFF) << " (hotspot = $F" << (spot+i) << ")\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
int xpos = 2,
|
return info.str();
|
||||||
ypos = addBaseInformation(size, "CBS", info.str()) + myLineHeight;
|
|
||||||
|
|
||||||
VariantList items;
|
|
||||||
VarList::push_back(items, "0 ($FFF8)");
|
|
||||||
VarList::push_back(items, "1 ($FFF9)");
|
|
||||||
VarList::push_back(items, "2 ($FFFA)");
|
|
||||||
myBank =
|
|
||||||
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("0 ($FFFx)"),
|
|
||||||
myLineHeight, items, "Set bank ",
|
|
||||||
0, kBankChanged);
|
|
||||||
myBank->setTarget(this);
|
|
||||||
addFocusWidget(myBank);
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFAWidget::saveOldState()
|
|
||||||
{
|
|
||||||
myOldState.internalram.clear();
|
|
||||||
|
|
||||||
for(uInt32 i = 0; i < internalRamSize(); ++i)
|
|
||||||
myOldState.internalram.push_back(myCart.myRAM[i]);
|
|
||||||
|
|
||||||
myOldState.bank = myCart.getBank();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFAWidget::loadConfig()
|
|
||||||
{
|
|
||||||
myBank->setSelectedIndex(myCart.getBank(), myCart.getBank() != myOldState.bank);
|
|
||||||
|
|
||||||
CartDebugWidget::loadConfig();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFAWidget::handleCommand(CommandSender* sender,
|
|
||||||
int cmd, int data, int id)
|
|
||||||
{
|
|
||||||
if(cmd == kBankChanged)
|
|
||||||
{
|
|
||||||
myCart.unlockBank();
|
|
||||||
myCart.bank(myBank->getSelected());
|
|
||||||
myCart.lockBank();
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFAWidget::bankState()
|
|
||||||
{
|
|
||||||
ostringstream& buf = buffer();
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 3> spot = { "$FFF8", "$FFF9", "$FFFA" };
|
|
||||||
buf << "Bank = " << std::dec << myCart.getBank()
|
|
||||||
<< ", hotspot = " << spot[myCart.getBank()];
|
|
||||||
|
|
||||||
return buf.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt32 CartridgeFAWidget::internalRamSize()
|
|
||||||
{
|
|
||||||
return 256;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt32 CartridgeFAWidget::internalRamRPort(int start)
|
|
||||||
{
|
|
||||||
return 0xF100 + start;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFAWidget::internalRamDescription()
|
|
||||||
{
|
|
||||||
ostringstream desc;
|
|
||||||
desc << "$F000 - $F0FF used for Write Access\n"
|
|
||||||
<< "$F100 - $F1FF used for Read Access";
|
|
||||||
|
|
||||||
return desc.str();
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
const ByteArray& CartridgeFAWidget::internalRamOld(int start, int count)
|
|
||||||
{
|
|
||||||
myRamOld.clear();
|
|
||||||
for(int i = 0; i < count; i++)
|
|
||||||
myRamOld.push_back(myOldState.internalram[start + i]);
|
|
||||||
return myRamOld;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
const ByteArray& CartridgeFAWidget::internalRamCurrent(int start, int count)
|
|
||||||
{
|
|
||||||
myRamCurrent.clear();
|
|
||||||
for(int i = 0; i < count; i++)
|
|
||||||
myRamCurrent.push_back(myCart.myRAM[start + i]);
|
|
||||||
return myRamCurrent;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFAWidget::internalRamSetValue(int addr, uInt8 value)
|
|
||||||
{
|
|
||||||
myCart.myRAM[addr] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
uInt8 CartridgeFAWidget::internalRamGetValue(int addr)
|
|
||||||
{
|
|
||||||
return myCart.myRAM[addr];
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFAWidget::internalRamLabel(int addr)
|
|
||||||
{
|
|
||||||
CartDebug& dbg = instance().debugger().cartDebug();
|
|
||||||
return dbg.getLabel(addr + 0xF100, false);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,10 @@
|
||||||
#define CARTRIDGEFA_WIDGET_HXX
|
#define CARTRIDGEFA_WIDGET_HXX
|
||||||
|
|
||||||
class CartridgeFA;
|
class CartridgeFA;
|
||||||
class PopUpWidget;
|
|
||||||
|
|
||||||
#include "CartDebugWidget.hxx"
|
#include "CartEnhancedWidget.hxx"
|
||||||
|
|
||||||
class CartridgeFAWidget : public CartDebugWidget
|
class CartridgeFAWidget : public CartEnhancedWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CartridgeFAWidget(GuiObject* boss, const GUI::Font& lfont,
|
CartridgeFAWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
@ -33,35 +32,11 @@ class CartridgeFAWidget : public CartDebugWidget
|
||||||
virtual ~CartridgeFAWidget() = default;
|
virtual ~CartridgeFAWidget() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CartridgeFA& myCart;
|
string manufacturer() override { return "CBS"; }
|
||||||
PopUpWidget* myBank{nullptr};
|
|
||||||
|
|
||||||
struct CartState {
|
string description() override;
|
||||||
ByteArray internalram;
|
|
||||||
uInt16 bank{0};
|
|
||||||
};
|
|
||||||
CartState myOldState;
|
|
||||||
|
|
||||||
enum { kBankChanged = 'bkCH' };
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void saveOldState() override;
|
|
||||||
void loadConfig() override;
|
|
||||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
|
||||||
|
|
||||||
string bankState() override;
|
|
||||||
|
|
||||||
// start of functions for Cartridge RAM tab
|
|
||||||
uInt32 internalRamSize() override;
|
|
||||||
uInt32 internalRamRPort(int start) override;
|
|
||||||
string internalRamDescription() override;
|
|
||||||
const ByteArray& internalRamOld(int start, int count) override;
|
|
||||||
const ByteArray& internalRamCurrent(int start, int count) override;
|
|
||||||
void internalRamSetValue(int addr, uInt8 value) override;
|
|
||||||
uInt8 internalRamGetValue(int addr) override;
|
|
||||||
string internalRamLabel(int addr) override;
|
|
||||||
// end of functions for Cartridge RAM tab
|
|
||||||
|
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
CartridgeFAWidget() = delete;
|
CartridgeFAWidget() = delete;
|
||||||
CartridgeFAWidget(const CartridgeFAWidget&) = delete;
|
CartridgeFAWidget(const CartridgeFAWidget&) = delete;
|
||||||
|
|
|
@ -16,80 +16,44 @@
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "CartFC.hxx"
|
#include "CartFC.hxx"
|
||||||
#include "PopUpWidget.hxx"
|
|
||||||
#include "CartFCWidget.hxx"
|
#include "CartFCWidget.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CartridgeFCWidget::CartridgeFCWidget(
|
CartridgeFCWidget::CartridgeFCWidget(
|
||||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||||
int x, int y, int w, int h, CartridgeFC& cart)
|
int x, int y, int w, int h, CartridgeFC& cart)
|
||||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
: CartEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||||
myCart(cart)
|
|
||||||
{
|
{
|
||||||
uInt16 size = cart.romBankCount() * 4096;
|
initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
string CartridgeFCWidget::description()
|
||||||
|
{
|
||||||
ostringstream info;
|
ostringstream info;
|
||||||
info << "FC cartridge, up to eight 4K banks\n"
|
uInt16 hotspot = myCart.hotspot() | ADDR_BASE;
|
||||||
<< "Startup bank = " << cart.startBank() << " or undetermined\n";
|
|
||||||
|
|
||||||
// Eventually, we should query this from the debugger/disassembler
|
info << "FC cartridge, up to eight 4K banks\n";
|
||||||
info << "Bank selected by hotspots\n"
|
info << "Bank selected by hotspots\n"
|
||||||
<< " $FFF8 (defines low 2 bits)\n"
|
<< " $" << Common::Base::HEX4 << hotspot << " (defines low 2 bits)\n"
|
||||||
<< " $FFF9 (defines high bits)\n"
|
<< " $" << Common::Base::HEX4 << (hotspot + 1) << " (defines high bits)\n"
|
||||||
<< " $FFFC (triggers bank switch)";
|
<< " $" << Common::Base::HEX4 << (hotspot + 4) << " (triggers bank switch)\n";
|
||||||
|
|
||||||
int xpos = 2,
|
info << CartEnhancedWidget::description();
|
||||||
ypos = addBaseInformation(size, "Amiga Corp.", info.str()) + myLineHeight;
|
|
||||||
|
|
||||||
VariantList items;
|
return info.str();
|
||||||
for (uInt16 i = 0; i < cart.romBankCount(); ++i)
|
|
||||||
VarList::push_back(items, Variant(i).toString() +
|
|
||||||
" ($FFF8 = " + Variant(i & 0b11).toString() +
|
|
||||||
"/$FFF9 = " + Variant(i >> 2).toString() +")");
|
|
||||||
|
|
||||||
myBank = new PopUpWidget(boss, _font, xpos, ypos - 2,
|
|
||||||
_font.getStringWidth("7 ($FFF8 = 3/$FFF9 = 1)"),
|
|
||||||
myLineHeight, items, "Set bank ",
|
|
||||||
0, kBankChanged);
|
|
||||||
myBank->setTarget(this);
|
|
||||||
addFocusWidget(myBank);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeFCWidget::loadConfig()
|
string CartridgeFCWidget::hotspotStr(int bank, int, bool prefix)
|
||||||
{
|
{
|
||||||
Debugger& dbg = instance().debugger();
|
ostringstream info;
|
||||||
CartDebug& cart = dbg.cartDebug();
|
uInt16 hotspot = myCart.hotspot() | ADDR_BASE;
|
||||||
const CartState& state = static_cast<const CartState&>(cart.getState());
|
|
||||||
const CartState& oldstate = static_cast<const CartState&>(cart.getOldState());
|
|
||||||
|
|
||||||
myBank->setSelectedIndex(myCart.getBank(), state.bank != oldstate.bank);
|
info << "(" << (prefix ? "hotspots " : "");
|
||||||
|
info << "$" << Common::Base::HEX4 << hotspot << " = " << (bank & 0b11);
|
||||||
|
info << ", $" << Common::Base::HEX4 << (hotspot + 1) << " = " << (bank >> 2);
|
||||||
|
info << ")";
|
||||||
|
|
||||||
CartDebugWidget::loadConfig();
|
return info.str();
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
void CartridgeFCWidget::handleCommand(CommandSender* sender,
|
|
||||||
int cmd, int data, int id)
|
|
||||||
{
|
|
||||||
if (cmd == kBankChanged)
|
|
||||||
{
|
|
||||||
myCart.unlockBank();
|
|
||||||
myCart.bank(myBank->getSelected());
|
|
||||||
myCart.lockBank();
|
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFCWidget::bankState()
|
|
||||||
{
|
|
||||||
ostringstream& buf = buffer();
|
|
||||||
uInt16 bank = myCart.getBank();
|
|
||||||
|
|
||||||
buf << "Bank = #" << std::dec << bank
|
|
||||||
<< ", hotspots $FFF8 = " << (bank & 0b11)
|
|
||||||
<< "/$FF99 = " << (bank >> 2);
|
|
||||||
|
|
||||||
return buf.str();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,10 @@
|
||||||
#define CARTRIDGEFC_WIDGET_HXX
|
#define CARTRIDGEFC_WIDGET_HXX
|
||||||
|
|
||||||
class CartridgeFC;
|
class CartridgeFC;
|
||||||
class PopUpWidget;
|
|
||||||
|
|
||||||
#include "CartDebugWidget.hxx"
|
#include "CartEnhancedWidget.hxx"
|
||||||
|
|
||||||
class CartridgeFCWidget : public CartDebugWidget
|
class CartridgeFCWidget : public CartEnhancedWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CartridgeFCWidget(GuiObject* boss, const GUI::Font& lfont,
|
CartridgeFCWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
@ -33,17 +32,13 @@ class CartridgeFCWidget : public CartDebugWidget
|
||||||
virtual ~CartridgeFCWidget() = default;
|
virtual ~CartridgeFCWidget() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CartridgeFC& myCart;
|
string manufacturer() override { return "Amiga Corp."; }
|
||||||
PopUpWidget* myBank{nullptr};
|
|
||||||
|
|
||||||
enum { kBankChanged = 'bkCH' };
|
string description() override;
|
||||||
|
|
||||||
|
string hotspotStr(int bank, int seg = 0, bool prefix = false) override;
|
||||||
|
|
||||||
private:
|
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
|
// Following constructors and assignment operators not supported
|
||||||
CartridgeFCWidget() = delete;
|
CartridgeFCWidget() = delete;
|
||||||
CartridgeFCWidget(const CartridgeFCWidget&) = delete;
|
CartridgeFCWidget(const CartridgeFCWidget&) = delete;
|
||||||
|
|
|
@ -16,72 +16,36 @@
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
#include "CartFE.hxx"
|
#include "CartFE.hxx"
|
||||||
#include "PopUpWidget.hxx"
|
|
||||||
#include "CartFEWidget.hxx"
|
#include "CartFEWidget.hxx"
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
CartridgeFEWidget::CartridgeFEWidget(
|
CartridgeFEWidget::CartridgeFEWidget(
|
||||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||||
int x, int y, int w, int h, CartridgeFE& cart)
|
int x, int y, int w, int h, CartridgeFE& cart)
|
||||||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
: CartEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||||
myCart(cart)
|
|
||||||
{
|
{
|
||||||
string info =
|
initialize();
|
||||||
"FE cartridge, two 4K banks\n"
|
|
||||||
"Monitors access to hotspot $01FE, and uses "
|
|
||||||
"upper 3 bits of databus for bank number:\n"
|
|
||||||
"Bank 0 @ $F000 - $FFFF (DATA = 111, D5 = 1)\n"
|
|
||||||
"Bank 1 @ $D000 - $DFFF (DATA = 110, D5 = 0)\n";
|
|
||||||
|
|
||||||
int xpos = 2,
|
|
||||||
ypos = addBaseInformation(2 * 4096, "Activision", info) + myLineHeight;
|
|
||||||
|
|
||||||
VariantList items;
|
|
||||||
VarList::push_back(items, "0 ($01FE, D5=1)");
|
|
||||||
VarList::push_back(items, "1 ($01FE, D5=0)");
|
|
||||||
myBank =
|
|
||||||
new PopUpWidget(boss, _font, xpos, ypos-2,
|
|
||||||
_font.getStringWidth("0 ($01FE, D5=1)"),
|
|
||||||
myLineHeight, items, "Set bank ",
|
|
||||||
0, kBankChanged);
|
|
||||||
myBank->setTarget(this);
|
|
||||||
addFocusWidget(myBank);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeFEWidget::loadConfig()
|
string CartridgeFEWidget::description()
|
||||||
{
|
{
|
||||||
Debugger& dbg = instance().debugger();
|
ostringstream info;
|
||||||
CartDebug& cart = dbg.cartDebug();
|
|
||||||
const CartState& state = static_cast<const CartState&>(cart.getState());
|
|
||||||
const CartState& oldstate = static_cast<const CartState&>(cart.getOldState());
|
|
||||||
|
|
||||||
myBank->setSelectedIndex(myCart.getBank(), state.bank != oldstate.bank);
|
info << "FE cartridge, two 4K banks\n"
|
||||||
|
<< "Monitors access to hotspot $01FE, and uses "
|
||||||
|
<< "upper 3 bits of databus for bank number:\n";
|
||||||
|
info << CartEnhancedWidget::description();
|
||||||
|
|
||||||
CartDebugWidget::loadConfig();
|
return info.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
void CartridgeFEWidget::handleCommand(CommandSender* sender,
|
string CartridgeFEWidget::hotspotStr(int bank, int, bool)
|
||||||
int cmd, int data, int id)
|
|
||||||
{
|
{
|
||||||
if(cmd == kBankChanged)
|
ostringstream info;
|
||||||
{
|
|
||||||
myCart.unlockBank();
|
info << "(DATA = 11" << !bank << ", D5 = " << !bank << ")";
|
||||||
myCart.bank(myBank->getSelected());
|
|
||||||
myCart.lockBank();
|
return info.str();
|
||||||
invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
string CartridgeFEWidget::bankState()
|
|
||||||
{
|
|
||||||
ostringstream& buf = buffer();
|
|
||||||
|
|
||||||
static constexpr std::array<const char*, 2> range = { "$F000", "$D000" };
|
|
||||||
buf << "Bank = " << std::dec << myCart.getBank()
|
|
||||||
<< ", address range = " << range[myCart.getBank()];
|
|
||||||
|
|
||||||
return buf.str();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,10 @@
|
||||||
#define CARTRIDGEFE_WIDGET_HXX
|
#define CARTRIDGEFE_WIDGET_HXX
|
||||||
|
|
||||||
class CartridgeFE;
|
class CartridgeFE;
|
||||||
class PopUpWidget;
|
|
||||||
|
|
||||||
#include "CartDebugWidget.hxx"
|
#include "CartEnhancedWidget.hxx"
|
||||||
|
|
||||||
class CartridgeFEWidget : public CartDebugWidget
|
class CartridgeFEWidget : public CartEnhancedWidget
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
CartridgeFEWidget(GuiObject* boss, const GUI::Font& lfont,
|
CartridgeFEWidget(GuiObject* boss, const GUI::Font& lfont,
|
||||||
|
@ -33,18 +32,13 @@ class CartridgeFEWidget : public CartDebugWidget
|
||||||
virtual ~CartridgeFEWidget() = default;
|
virtual ~CartridgeFEWidget() = default;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
CartridgeFE& myCart;
|
string manufacturer() override { return "Activision"; }
|
||||||
PopUpWidget* myBank{nullptr};
|
|
||||||
|
|
||||||
enum { kBankChanged = 'bkCH' };
|
string description() override;
|
||||||
|
|
||||||
|
string hotspotStr(int bank, int, bool) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// No implementation for non-bankswitched ROMs
|
|
||||||
void loadConfig() override;
|
|
||||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
|
||||||
|
|
||||||
string bankState() override;
|
|
||||||
|
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
CartridgeFEWidget() = delete;
|
CartridgeFEWidget() = delete;
|
||||||
CartridgeFEWidget(const CartridgeFEWidget&) = delete;
|
CartridgeFEWidget(const CartridgeFEWidget&) = delete;
|
||||||
|
|
|
@ -110,7 +110,7 @@ class CartridgeFA2 : public CartridgeFA
|
||||||
private:
|
private:
|
||||||
bool checkSwitchBank(uInt16 address, uInt8 value = 0) override;
|
bool checkSwitchBank(uInt16 address, uInt8 value = 0) override;
|
||||||
|
|
||||||
uInt16 hotspot() const override { return 0x1FF4; }
|
uInt16 hotspot() const override { return 0x1FF5; }
|
||||||
|
|
||||||
uInt16 getStartBank() const override { return 0; }
|
uInt16 getStartBank() const override { return 0; }
|
||||||
|
|
||||||
|
|
|
@ -165,6 +165,8 @@ class CartridgeFE : public CartridgeEnhanced
|
||||||
*/
|
*/
|
||||||
bool checkSwitchBank(uInt16 address, uInt8 value) override;
|
bool checkSwitchBank(uInt16 address, uInt8 value) override;
|
||||||
|
|
||||||
|
uInt16 hotspot() const override { return 0x01FE; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Whether previous address by peek/poke equals $01FE (hotspot)
|
// Whether previous address by peek/poke equals $01FE (hotspot)
|
||||||
bool myLastAccessWasFE{false};
|
bool myLastAccessWasFE{false};
|
||||||
|
|
Loading…
Reference in New Issue