mirror of https://github.com/stella-emu/stella.git
replaced "slice" with "bank" in many Cart(Widget) classes
minor UI fixed for CartDPCWidget
This commit is contained in:
parent
4699a28af8
commit
d4025e86da
|
@ -27,12 +27,13 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
: CartDebugWidget(boss, lfont, nfont, x, y, w, h),
|
||||
myCart(cart)
|
||||
{
|
||||
const int V_GAP = 4;
|
||||
size_t size = cart.mySize;
|
||||
|
||||
ostringstream info;
|
||||
|
||||
info << "DPC cartridge, two 4K banks + 2K display bank\n"
|
||||
<< "DPC registers accessible @ $F000 - $F07F\n"
|
||||
<< " $F000 - $F03F (R), $F040 - $F07F (W)\n"
|
||||
<< "DPC registers accessible @ $" << Common::Base::HEX4 << 0xF000 << " - $" << 0xF07F << "\n"
|
||||
<< " $" << 0xF000 << " - " << 0xF03F << " (R), $" << 0xF040 << " - $" << 0xF07F << " (W)\n"
|
||||
|
||||
<< "Startup bank = " << cart.startBank() << " or undetermined\n";
|
||||
|
||||
|
@ -42,7 +43,7 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
|
||||
start -= start % 0x1000;
|
||||
info << "Bank " << i << " @ $" << Common::Base::HEX4 << (start + 0x80) << " - "
|
||||
<< "$" << (start + 0xFFF) << " (hotspot = $F" << (spot+i) << ")\n";
|
||||
<< "$" << (start + 0xFFF) << " (hotspot = $" << (0xF000 + spot + i) << ")\n";
|
||||
}
|
||||
|
||||
int xpos = 2,
|
||||
|
@ -50,26 +51,30 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
myLineHeight;
|
||||
|
||||
VariantList items;
|
||||
VarList::push_back(items, "0 ($FFF8)");
|
||||
VarList::push_back(items, "1 ($FFF9)");
|
||||
for(int bank = 0; bank < 2; ++bank)
|
||||
{
|
||||
ostringstream buf;
|
||||
|
||||
buf << "#" << std::dec << bank << " ($" << Common::Base::HEX4 << (0xFFF8 + bank) << ")";
|
||||
VarList::push_back(items, buf.str());
|
||||
}
|
||||
|
||||
myBank =
|
||||
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("0 ($FFFx)"),
|
||||
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("#0 ($FFFx)"),
|
||||
myLineHeight, items, "Set bank ",
|
||||
0, kBankChanged);
|
||||
myBank->setTarget(this);
|
||||
addFocusWidget(myBank);
|
||||
ypos += myLineHeight + 8;
|
||||
ypos += myLineHeight + V_GAP * 3;
|
||||
|
||||
// Data fetchers
|
||||
int lwidth = _font.getStringWidth("Data Fetchers ");
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Data Fetchers ", TextAlign::Left);
|
||||
int lwidth = _font.getStringWidth("Data fetchers ");
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Data fetchers ");
|
||||
|
||||
// Top registers
|
||||
lwidth = _font.getStringWidth("Counter Registers ");
|
||||
xpos = 18; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Top Registers ", TextAlign::Left);
|
||||
lwidth = _font.getStringWidth("Counter registers ");
|
||||
xpos = 2 + _font.getMaxCharWidth() * 2; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Top registers ");
|
||||
xpos += lwidth;
|
||||
|
||||
myTops = new DataGridWidget(boss, _nfont, xpos, ypos-2, 8, 1, 2, 8, Common::Base::Fmt::_16);
|
||||
|
@ -77,9 +82,8 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
myTops->setEditable(false);
|
||||
|
||||
// Bottom registers
|
||||
xpos = 10; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Bottom Registers ", TextAlign::Left);
|
||||
xpos = 2 + _font.getMaxCharWidth() * 2; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Bottom registers ");
|
||||
xpos += lwidth;
|
||||
|
||||
myBottoms = new DataGridWidget(boss, _nfont, xpos, ypos-2, 8, 1, 2, 8, Common::Base::Fmt::_16);
|
||||
|
@ -87,9 +91,8 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
myBottoms->setEditable(false);
|
||||
|
||||
// Counter registers
|
||||
xpos = 10; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Counter Registers ", TextAlign::Left);
|
||||
xpos = 2 + _font.getMaxCharWidth() * 2; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Counter registers ");
|
||||
xpos += lwidth;
|
||||
|
||||
myCounters = new DataGridWidget(boss, _nfont, xpos, ypos-2, 8, 1, 4, 16, Common::Base::Fmt::_16_4);
|
||||
|
@ -97,9 +100,8 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
myCounters->setEditable(false);
|
||||
|
||||
// Flag registers
|
||||
xpos = 10; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Flag Registers ", TextAlign::Left);
|
||||
xpos = 2 + _font.getMaxCharWidth() * 2; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Flag registers ");
|
||||
xpos += lwidth;
|
||||
|
||||
myFlags = new DataGridWidget(boss, _nfont, xpos, ypos-2, 8, 1, 2, 8, Common::Base::Fmt::_16);
|
||||
|
@ -107,10 +109,9 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
myFlags->setEditable(false);
|
||||
|
||||
// Music mode
|
||||
xpos = 2; ypos += myLineHeight + 12;
|
||||
xpos = 2; ypos += myLineHeight + V_GAP * 3;
|
||||
lwidth = _font.getStringWidth("Music mode (DF5/DF6/DF7) ");
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Music mode (DF5/DF6/DF7) ", TextAlign::Left);
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Music mode (DF5/DF6/DF7) ");
|
||||
xpos += lwidth;
|
||||
|
||||
myMusicMode = new DataGridWidget(boss, _nfont, xpos, ypos-2, 3, 1, 2, 8, Common::Base::Fmt::_16);
|
||||
|
@ -118,9 +119,8 @@ CartridgeDPCWidget::CartridgeDPCWidget(
|
|||
myMusicMode->setEditable(false);
|
||||
|
||||
// Current random number
|
||||
xpos = 10; ypos += myLineHeight + 4;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, lwidth,
|
||||
myFontHeight, "Current random number ", TextAlign::Left);
|
||||
xpos = 2; ypos += myLineHeight + V_GAP * 3;
|
||||
new StaticTextWidget(boss, _font, xpos, ypos, "Current random number ");
|
||||
xpos += lwidth;
|
||||
|
||||
myRandom = new DataGridWidget(boss, _nfont, xpos, ypos-2, 1, 1, 2, 8, Common::Base::Fmt::_16);
|
||||
|
@ -229,9 +229,8 @@ string CartridgeDPCWidget::bankState()
|
|||
{
|
||||
ostringstream& buf = buffer();
|
||||
|
||||
static constexpr std::array<const char*, 2> spot = { "$FFF8", "$FFF9" };
|
||||
buf << "Bank = " << std::dec << myCart.getBank()
|
||||
<< ", hotspot = " << spot[myCart.getBank()];
|
||||
buf << "Bank #" << std::dec << myCart.getBank()
|
||||
<< " (hotspot $" << Common::Base::HEX4 << (0xFFF8 + myCart.getBank()) << ")";
|
||||
|
||||
return buf.str();
|
||||
}
|
||||
|
@ -252,10 +251,9 @@ uInt32 CartridgeDPCWidget::internalRamRPort(int start)
|
|||
string CartridgeDPCWidget::internalRamDescription()
|
||||
{
|
||||
ostringstream desc;
|
||||
desc << "$0000 - $07FF - 2K display data\n"
|
||||
<< " indirectly accessible to 6507\n"
|
||||
<< " via DPC+'s Data Fetcher\n"
|
||||
<< " registers\n";
|
||||
desc << "2K display data @ $0000 - $" << Common::Base::HEX4 << 0x07FF << "\n"
|
||||
<< " indirectly accessible to 6507 via DPC's\n"
|
||||
<< " data fetcher registers\n";
|
||||
|
||||
return desc.str();
|
||||
}
|
||||
|
|
|
@ -75,6 +75,7 @@ class CartridgeDPCWidget : public CartDebugWidget
|
|||
const ByteArray& internalRamCurrent(int start, int count) override;
|
||||
void internalRamSetValue(int addr, uInt8 value) override;
|
||||
uInt8 internalRamGetValue(int addr) override;
|
||||
string tabLabel() override { return " DPC Display Data "; }
|
||||
// end of functions for Cartridge RAM tab
|
||||
|
||||
// Following constructors and assignment operators not supported
|
||||
|
|
|
@ -49,7 +49,7 @@ int CartDebugWidget::addBaseInformation(size_t bytes, const string& manufacturer
|
|||
int x = 2, y = 8;
|
||||
|
||||
// Add ROM size, manufacturer and bankswitch info
|
||||
new StaticTextWidget(_boss, _font, x, y + 1, "ROM Size ");
|
||||
new StaticTextWidget(_boss, _font, x, y + 1, "ROM size ");
|
||||
buf << bytes << " bytes";
|
||||
if(bytes >= 1024)
|
||||
buf << " / " << (bytes/1024) << "KB";
|
||||
|
|
|
@ -58,7 +58,7 @@ class CartDebugWidget : public Widget, public CommandSender
|
|||
virtual string bankState() { return "0 (non-bankswitched)"; }
|
||||
|
||||
// To make the Cartridge RAM show up in the debugger, implement
|
||||
// the following 8 functions for cartridges with internal RAM
|
||||
// the following 9 functions for cartridges with internal RAM
|
||||
virtual uInt32 internalRamSize() { return 0; }
|
||||
virtual uInt32 internalRamRPort(int start) { return 0; }
|
||||
virtual string internalRamDescription() { return EmptyString; }
|
||||
|
@ -67,6 +67,7 @@ class CartDebugWidget : public Widget, public CommandSender
|
|||
virtual void internalRamSetValue(int addr, uInt8 value) { }
|
||||
virtual uInt8 internalRamGetValue(int addr) { return 0; }
|
||||
virtual string internalRamLabel(int addr) { return "Not available/applicable"; }
|
||||
virtual string tabLabel() { return " Cartridge RAM "; }
|
||||
|
||||
protected:
|
||||
// Arrays used to hold current and previous internal RAM values
|
||||
|
|
|
@ -27,17 +27,18 @@ CartridgeE78KWidget::CartridgeE78KWidget(
|
|||
: CartridgeMNetworkWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||
{
|
||||
ostringstream info;
|
||||
info << "E78K cartridge, 4 2K slices ROM + 2 1K RAM\n"
|
||||
<< "Lower 2K accessible @ $F000 - $F7FF\n"
|
||||
<< " Slice 0 - 2 of ROM (hotspots $FE4 to $FE6)\n"
|
||||
<< " Slice 7 (1K) of RAM (hotspot $FE7)\n"
|
||||
<< " $F400 - $F7FF (R), $F000 - $F3FF (W)\n"
|
||||
<< "256B RAM accessible @ $F800 - $F9FF\n"
|
||||
<< " Hotspots $FE8 - $FEB (256B of RAM slice 1)\n"
|
||||
<< " $F900 - $F9FF (R), $F800 - $F8FF (W)\n"
|
||||
<< "Upper 1.5K ROM accessible @ $FA00 - $FFFF\n"
|
||||
<< " Always points to last 1.5K of ROM\n"
|
||||
<< "Startup slices = 0 / 0 or undetermined\n";
|
||||
info << "E78K cartridge, four 2K banks ROM + 2K RAM,\n"
|
||||
<< " mapped into three segments\n"
|
||||
<< "Lower 2K accessible @ $F000 - $F7FF\n"
|
||||
<< " ROM banks 0 - 2 (hotspots $FFE4 to $FFE6)\n"
|
||||
<< " 1K RAM bank 3 (hotspot $FFE7)\n"
|
||||
<< " $F400 - $F7FF (R), $F000 - $F3FF (W)\n"
|
||||
<< "256B RAM accessible @ $F800 - $F9FF\n"
|
||||
<< " RAM banks 0 - 3 (hotspots $FFE8 - $FFEB)\n"
|
||||
<< " $F900 - $F9FF (R), $F800 - $F8FF (W)\n"
|
||||
<< "Upper 1.5K ROM accessible @ $FA00 - $FFFF\n"
|
||||
<< " Always points to last 1.5K of ROM\n"
|
||||
<< "Startup segments = 0 / 0 or undetermined\n";
|
||||
|
||||
#if 0
|
||||
// Eventually, we should query this from the debugger/disassembler
|
||||
|
@ -53,7 +54,7 @@ CartridgeE78KWidget::CartridgeE78KWidget(
|
|||
const char* CartridgeE78KWidget::getSpotLower(int idx)
|
||||
{
|
||||
static constexpr std::array<const char*, 4> spot_lower = {
|
||||
"0 - ROM ($FFE4)", "1 - ROM ($FFE5)", "2 - ROM ($FFE6)", "3 - RAM ($FFE7)"
|
||||
"#0 - ROM ($FFE4)", "#1 - ROM ($FFE5)", "#2 - ROM ($FFE6)", "#3 - RAM ($FFE7)"
|
||||
};
|
||||
|
||||
return spot_lower[idx];
|
||||
|
@ -63,7 +64,7 @@ const char* CartridgeE78KWidget::getSpotLower(int idx)
|
|||
const char* CartridgeE78KWidget::getSpotUpper(int idx)
|
||||
{
|
||||
static constexpr std::array<const char*, 4> spot_upper = {
|
||||
"0 - RAM ($FFE8)", "1 - RAM ($FFE9)", "2 - RAM ($FFEA)", "3 - RAM ($FFEB)"
|
||||
"#0 - RAM ($FFE8)", "#1 - RAM ($FFE9)", "#2 - RAM ($FFEA)", "#3 - RAM ($FFEB)"
|
||||
};
|
||||
|
||||
return spot_upper[idx];
|
||||
|
|
|
@ -26,17 +26,18 @@ CartridgeE7Widget::CartridgeE7Widget(
|
|||
: CartridgeMNetworkWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||
{
|
||||
ostringstream info;
|
||||
info << "E7 cartridge, 8 2K slices ROM + 2 1K RAM\n"
|
||||
info << "E7 cartridge, eight 2K banks ROM + 2K RAM,\n"
|
||||
<< " mapped into three segments\n"
|
||||
<< "Lower 2K accessible @ $F000 - $F7FF\n"
|
||||
<< " Slice 0 - 6 of ROM (hotspots $FE0 to $FE6)\n"
|
||||
<< " Slice 7 (1K) of RAM (hotspot $FE7)\n"
|
||||
<< " ROM Banks 0 - 6 (hotspots $FFE0 to $FFE6)\n"
|
||||
<< " 1K RAM Bank 7 (hotspot $FFE7)\n"
|
||||
<< " $F400 - $F7FF (R), $F000 - $F3FF (W)\n"
|
||||
<< "256B RAM accessible @ $F800 - $F9FF\n"
|
||||
<< " Hotspots $FE8 - $FEB (256B of RAM slice 1)\n"
|
||||
<< " RAM banks 0 - 3 (hotspots $FFE8 - $FFEB)\n"
|
||||
<< " $F900 - $F9FF (R), $F800 - $F8FF (W)\n"
|
||||
<< "Upper 1.5K ROM accessible @ $FA00 - $FFFF\n"
|
||||
<< " Always points to last 1.5K of ROM\n"
|
||||
<< "Startup slices = 0 / 0 or undetermined\n";
|
||||
<< "Startup segments = 0 / 0 or undetermined\n";
|
||||
|
||||
#if 0
|
||||
// Eventually, we should query this from the debugger/disassembler
|
||||
|
@ -52,8 +53,8 @@ CartridgeE7Widget::CartridgeE7Widget(
|
|||
const char* CartridgeE7Widget::getSpotLower(int idx)
|
||||
{
|
||||
static constexpr std::array<const char*, 8> spot_lower = {
|
||||
"0 - ROM ($FFE0)", "1 - ROM ($FFE1)", "2 - ROM ($FFE2)", "3 - ROM ($FFE3)",
|
||||
"4 - ROM ($FFE4)", "5 - ROM ($FFE5)", "6 - ROM ($FFE6)", "7 - RAM ($FFE7)"
|
||||
"#0 - ROM ($FFE0)", "#1 - ROM ($FFE1)", "#2 - ROM ($FFE2)", "#3 - ROM ($FFE3)",
|
||||
"#4 - ROM ($FFE4)", "#5 - ROM ($FFE5)", "#6 - ROM ($FFE6)", "#7 - RAM ($FFE7)"
|
||||
};
|
||||
|
||||
return spot_lower[idx];
|
||||
|
@ -63,7 +64,7 @@ const char* CartridgeE7Widget::getSpotLower(int idx)
|
|||
const char* CartridgeE7Widget::getSpotUpper(int idx)
|
||||
{
|
||||
static constexpr std::array<const char*, 4> spot_upper = {
|
||||
"0 - RAM ($FFE8)", "1 - RAM ($FFE9)", "2 - RAM ($FFEA)", "3 - RAM ($FFEB)"
|
||||
"#0 - RAM ($FFE8)", "#1 - RAM ($FFE9)", "#2 - RAM ($FFEA)", "#3 - RAM ($FFEB)"
|
||||
};
|
||||
|
||||
return spot_upper[idx];
|
||||
|
|
|
@ -233,7 +233,7 @@ string CartridgeEnhancedWidget::bankState()
|
|||
}
|
||||
return buf.str();
|
||||
}
|
||||
return "0 (non-bankswitched)";
|
||||
return "non-bankswitched";
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -339,18 +339,18 @@ string CartridgeEnhancedWidget::internalRamDescription()
|
|||
{
|
||||
desc << indent << "$" << Common::Base::HEX4 << (ADDR_BASE | myCart.myReadOffset)
|
||||
<< " - $" << (ADDR_BASE | (myCart.myReadOffset + myCart.myRamMask))
|
||||
<< " used for read Access\n";
|
||||
<< " used for read access\n";
|
||||
}
|
||||
|
||||
desc << indent << "$" << Common::Base::HEX4 << (ADDR_BASE | myCart.myWriteOffset)
|
||||
<< " - $" << (ADDR_BASE | (myCart.myWriteOffset + myCart.myRamMask))
|
||||
<< " used for write Access";
|
||||
<< " used for write access";
|
||||
|
||||
if(myCart.myReadOffset > myCart.myWriteOffset)
|
||||
{
|
||||
desc << indent << "\n$" << Common::Base::HEX4 << (ADDR_BASE | myCart.myReadOffset)
|
||||
<< " - $" << (ADDR_BASE | (myCart.myReadOffset + myCart.myRamMask))
|
||||
<< " used for read Access";
|
||||
<< " used for read access";
|
||||
}
|
||||
|
||||
return desc.str();
|
||||
|
|
|
@ -47,18 +47,18 @@ void CartridgeMNetworkWidget::initialize(GuiObject* boss, CartridgeMNetwork& car
|
|||
for(int i = 0; i < 4; ++i)
|
||||
VarList::push_back(items1, getSpotUpper(i));
|
||||
|
||||
const int lwidth = _font.getStringWidth("Set slice for upper 256B "),
|
||||
fwidth = _font.getStringWidth("3 - RAM ($FFEB)");
|
||||
const int lwidth = _font.getStringWidth("Set bank for upper 256B segment "),
|
||||
fwidth = _font.getStringWidth("#3 - RAM ($FFEB)");
|
||||
myLower2K =
|
||||
new PopUpWidget(boss, _font, xpos, ypos - 2, fwidth, myLineHeight, items0,
|
||||
"Set slice for lower 2K ", lwidth, kLowerChanged);
|
||||
"Set bank for lower 2K segment", lwidth, kLowerChanged);
|
||||
myLower2K->setTarget(this);
|
||||
addFocusWidget(myLower2K);
|
||||
ypos += myLower2K->getHeight() + 4;
|
||||
|
||||
myUpper256B =
|
||||
new PopUpWidget(boss, _font, xpos, ypos - 2, fwidth, myLineHeight, items1,
|
||||
"Set slice for upper 256B ", lwidth, kUpperChanged);
|
||||
"Set bank for upper 256B segment ", lwidth, kUpperChanged);
|
||||
myUpper256B->setTarget(this);
|
||||
addFocusWidget(myUpper256B);
|
||||
}
|
||||
|
@ -71,14 +71,14 @@ void CartridgeMNetworkWidget::saveOldState()
|
|||
for(uInt32 i = 0; i < internalRamSize(); ++i)
|
||||
myOldState.internalram.push_back(myCart.myRAM[i]);
|
||||
|
||||
myOldState.lowerBank = myCart.myCurrentSlice[0];
|
||||
myOldState.lowerBank = myCart.myCurrentBank[0];
|
||||
myOldState.upperBank = myCart.myCurrentRAM;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeMNetworkWidget::loadConfig()
|
||||
{
|
||||
myLower2K->setSelectedIndex(myCart.myCurrentSlice[0], myCart.myCurrentSlice[0] != myOldState.lowerBank);
|
||||
myLower2K->setSelectedIndex(myCart.myCurrentBank[0], myCart.myCurrentBank[0] != myOldState.lowerBank);
|
||||
myUpper256B->setSelectedIndex(myCart.myCurrentRAM, myCart.myCurrentRAM != myOldState.upperBank);
|
||||
|
||||
CartDebugWidget::loadConfig();
|
||||
|
@ -111,8 +111,8 @@ string CartridgeMNetworkWidget::bankState()
|
|||
{
|
||||
ostringstream& buf = buffer();
|
||||
|
||||
buf << "Slices: " << std::dec
|
||||
<< getSpotLower(myCart.myCurrentSlice[0]) << " / "
|
||||
buf << "Segments: " << std::dec
|
||||
<< getSpotLower(myCart.myCurrentBank[0]) << " / "
|
||||
<< getSpotUpper(myCart.myCurrentRAM);
|
||||
|
||||
return buf.str();
|
||||
|
@ -135,11 +135,11 @@ string CartridgeMNetworkWidget::internalRamDescription()
|
|||
{
|
||||
ostringstream desc;
|
||||
desc << "First 1K accessible via:\n"
|
||||
<< " $F000 - $F3FF used for Write Access\n"
|
||||
<< " $F400 - $F7FF used for Read Access\n"
|
||||
<< "256K of second 1K accessible via:\n"
|
||||
<< " $F800 - $F8FF used for Write Access\n"
|
||||
<< " $F900 - $F9FF used for Read Access";
|
||||
<< " $F000 - $F3FF used for write access\n"
|
||||
<< " $F400 - $F7FF used for read access\n"
|
||||
<< "256 bytes of second 1K accessible via:\n"
|
||||
<< " $F800 - $F8FF used for write access\n"
|
||||
<< " $F900 - $F9FF used for read access";
|
||||
|
||||
return desc.str();
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ CartRamWidget::CartRamWidget(
|
|||
int xpos = 2, ypos = 8;
|
||||
|
||||
// Add RAM size
|
||||
new StaticTextWidget(_boss, _font, xpos, ypos + 1, "RAM Size ");
|
||||
new StaticTextWidget(_boss, _font, xpos, ypos + 1, "RAM size ");
|
||||
|
||||
uInt32 ramsize = cartDebug.internalRamSize();
|
||||
buf << ramsize << " bytes";
|
||||
|
|
|
@ -640,7 +640,7 @@ void DebuggerDialog::addRomArea()
|
|||
// The cartridge RAM tab
|
||||
if (myCartDebug->internalRamSize() > 0)
|
||||
{
|
||||
tabID = myRomTab->addTab(" Cartridge RAM ", TabWidget::AUTO_WIDTH);
|
||||
tabID = myRomTab->addTab(myCartDebug->tabLabel(), TabWidget::AUTO_WIDTH);
|
||||
myCartRam =
|
||||
new CartRamWidget(myRomTab, *myLFont, *myNFont, 2, 2, tabWidth - 1,
|
||||
tabHeight - myRomTab->getTabHeight() - 2, *myCartDebug);
|
||||
|
|
|
@ -41,12 +41,9 @@ RomWidget::RomWidget(GuiObject* boss, const GUI::Font& lfont, const GUI::Font& n
|
|||
|
||||
// Show current bank state
|
||||
xpos = x; ypos = y + 7;
|
||||
t = new StaticTextWidget(boss, lfont, xpos, ypos,
|
||||
lfont.getStringWidth("Bank"),
|
||||
lfont.getFontHeight(),
|
||||
"Bank", TextAlign::Left);
|
||||
t = new StaticTextWidget(boss, lfont, xpos, ypos, "Info ");
|
||||
|
||||
xpos += t->getWidth() + 5;
|
||||
xpos += t->getRight();
|
||||
myBank = new EditTextWidget(boss, nfont, xpos, ypos-2,
|
||||
_w - 2 - xpos, nfont.getLineHeight());
|
||||
myBank->setEditable(false);
|
||||
|
|
|
@ -189,7 +189,7 @@ class Cartridge : public Device
|
|||
cases where ROMs have 2K blocks in some preset area, the bankCount
|
||||
is the number of such blocks. Finally, in some esoteric schemes,
|
||||
the number of ways that the addressing can change (multiple ROM and
|
||||
RAM slices at multiple access points) is so complicated that the
|
||||
RAM segments at multiple access points) is so complicated that the
|
||||
cart will report having only one 'virtual' bank.
|
||||
*/
|
||||
virtual uInt16 romBankCount() const { return 1; }
|
||||
|
|
|
@ -29,7 +29,7 @@ CartridgeE0::CartridgeE0(const ByteBuffer& image, size_t size,
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void CartridgeE0::reset()
|
||||
{
|
||||
// Setup segments to some default slices
|
||||
// Setup segments to some default banks
|
||||
if(randomStartBank())
|
||||
{
|
||||
bank(mySystem->randGenerator().next() % 8, 0);
|
||||
|
|
|
@ -29,10 +29,10 @@ class System;
|
|||
/**
|
||||
This is the cartridge class for Parker Brothers' 8K games. In
|
||||
this bankswitching scheme the 2600's 4K cartridge address space
|
||||
is broken into four 1K segments. The desired 1K slice of the
|
||||
is broken into four 1K segments. The desired 1K bank of the
|
||||
ROM is selected by accessing $1FE0 to $1FE7 for the first 1K.
|
||||
$1FE8 to $1FEF selects the slice for the second 1K, and $1FF0 to
|
||||
$1FF7 selects the slice for the third 1K. The last 1K segment
|
||||
$1FE8 to $1FEF selects the bank for the second 1K, and $1FF0 to
|
||||
$1FF7 selects the bank for the third 1K. The last 1K segment
|
||||
always points to the last 1K of the ROM image.
|
||||
|
||||
Because of the complexity of this scheme, the cart reports having
|
||||
|
|
|
@ -48,7 +48,7 @@ void CartridgeEnhanced::install(System& system)
|
|||
|
||||
createRomAccessArrays(mySize + (myRomOffset > 0 ? 0 : myRamSize));
|
||||
|
||||
// Allocate array for the current bank segments slices
|
||||
// Allocate array for the segment's current bank offset
|
||||
myCurrentSegOffset = make_unique<uInt32[]>(myBankSegs);
|
||||
|
||||
// Allocate array for the RAM area
|
||||
|
|
|
@ -36,7 +36,7 @@ void CartridgeMNetwork::initialize(const ByteBuffer& image, size_t size)
|
|||
std::copy_n(image.get(), std::min<size_t>(romSize(), size), myImage.get());
|
||||
createRomAccessArrays(romSize() + myRAM.size());
|
||||
|
||||
myRAMSlice = romBankCount() - 1;
|
||||
myRAMBank = romBankCount() - 1;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -96,10 +96,10 @@ void CartridgeMNetwork::install(System& system)
|
|||
/*setAccess(0x1FE0 & ~System::PAGE_MASK, System::PAGE_SIZE,
|
||||
0, nullptr, 0x1fc0, System::PA_NONE, 0x1fc0);*/
|
||||
|
||||
// Setup the second segment to always point to the last ROM slice
|
||||
// Setup the second segment to always point to the last ROM bank
|
||||
setAccess(0x1A00, 0x1FE0U & (~System::PAGE_MASK - 0x1A00),
|
||||
myRAMSlice * BANK_SIZE, myImage.get(), myRAMSlice * BANK_SIZE, System::PageAccessType::READ, BANK_SIZE - 1);
|
||||
myCurrentSlice[1] = myRAMSlice;
|
||||
myRAMBank * BANK_SIZE, myImage.get(), myRAMBank * BANK_SIZE, System::PageAccessType::READ, BANK_SIZE - 1);
|
||||
myCurrentBank[1] = myRAMBank;
|
||||
|
||||
// Install some default banks for the RAM and first segment
|
||||
bankRAM(0);
|
||||
|
@ -115,7 +115,7 @@ uInt8 CartridgeMNetwork::peek(uInt16 address)
|
|||
// Switch banks if necessary
|
||||
checkSwitchBank(address);
|
||||
|
||||
if((myCurrentSlice[0] == myRAMSlice) && (address < BANK_SIZE / 2))
|
||||
if((myCurrentBank[0] == myRAMBank) && (address < BANK_SIZE / 2))
|
||||
{
|
||||
// Reading from the 1K write port @ $1000 triggers an unwanted write
|
||||
return peekRAM(myRAM[address & (BANK_SIZE / 2 - 1)], peekAddress);
|
||||
|
@ -126,7 +126,7 @@ uInt8 CartridgeMNetwork::peek(uInt16 address)
|
|||
return peekRAM(myRAM[0x0400 + (myCurrentRAM << 8) + (address & 0x00FF)], peekAddress);
|
||||
}
|
||||
else
|
||||
return myImage[(myCurrentSlice[address >> 11] << 11) + (address & (BANK_SIZE - 1))];
|
||||
return myImage[(myCurrentBank[address >> 11] << 11) + (address & (BANK_SIZE - 1))];
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -139,9 +139,9 @@ bool CartridgeMNetwork::poke(uInt16 address, uInt8 value)
|
|||
checkSwitchBank(address);
|
||||
|
||||
// All RAM writes are mapped here
|
||||
if((myCurrentSlice[0] == myRAMSlice) && (address < BANK_SIZE / 2))
|
||||
if((myCurrentBank[0] == myRAMBank) && (address < BANK_SIZE / 2))
|
||||
{
|
||||
// RAM slices
|
||||
// RAM banks
|
||||
if(!(address & 0x0400))
|
||||
{
|
||||
pokeRAM(myRAM[address & (BANK_SIZE / 2 - 1)], pokeAddress, value);
|
||||
|
@ -189,7 +189,7 @@ void CartridgeMNetwork::bankRAM(uInt16 bank)
|
|||
|
||||
// Remember what bank we're in
|
||||
myCurrentRAM = bank;
|
||||
uInt16 offset = bank << 8; // * RAM_SLICE_SIZE (256)
|
||||
uInt16 offset = bank << 8; // * RAM_BANK_SIZE (256)
|
||||
|
||||
// Setup the page access methods for the current bank
|
||||
// Set the page accessing method for the 256 bytes of RAM reading pages
|
||||
|
@ -201,26 +201,26 @@ void CartridgeMNetwork::bankRAM(uInt16 bank)
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
bool CartridgeMNetwork::bank(uInt16 slice)
|
||||
bool CartridgeMNetwork::bank(uInt16 bank)
|
||||
{
|
||||
if(bankLocked()) return false;
|
||||
|
||||
// Remember what bank we're in
|
||||
myCurrentSlice[0] = slice;
|
||||
myCurrentBank[0] = bank;
|
||||
|
||||
// Setup the page access methods for the current bank
|
||||
if(slice != myRAMSlice)
|
||||
if(bank != myRAMBank)
|
||||
{
|
||||
uInt16 offset = slice << 11; // * BANK_SIZE (2048)
|
||||
uInt16 offset = bank << 11; // * BANK_SIZE (2048)
|
||||
|
||||
// Map ROM image into first segment
|
||||
setAccess(0x1000, BANK_SIZE, offset, myImage.get(), offset, System::PageAccessType::READ);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Set the page accessing method for the 1K slice of RAM writing pages
|
||||
// Set the page accessing method for the 1K bank of RAM writing pages
|
||||
setAccess(0x1000, BANK_SIZE / 2, 0, myRAM.data(), romSize(), System::PageAccessType::WRITE);
|
||||
// Set the page accessing method for the 1K slice of RAM reading pages
|
||||
// Set the page accessing method for the 1K bank of RAM reading pages
|
||||
setAccess(0x1000 + BANK_SIZE / 2, BANK_SIZE / 2, 0, myRAM.data(), romSize(), System::PageAccessType::READ);
|
||||
}
|
||||
return myBankChanged = true;
|
||||
|
@ -229,7 +229,7 @@ bool CartridgeMNetwork::bank(uInt16 slice)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
uInt16 CartridgeMNetwork::getBank(uInt16 address) const
|
||||
{
|
||||
return myCurrentSlice[(address & 0xFFF) >> 11]; // 2K slices
|
||||
return myCurrentBank[(address & 0xFFF) >> 11]; // 2K segments
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -239,7 +239,7 @@ bool CartridgeMNetwork::patch(uInt16 address, uInt8 value)
|
|||
|
||||
if(address < 0x0800)
|
||||
{
|
||||
if(myCurrentSlice[0] == myRAMSlice)
|
||||
if(myCurrentBank[0] == myRAMBank)
|
||||
{
|
||||
// Normally, a write to the read port won't do anything
|
||||
// However, the patch command is special in that ignores such
|
||||
|
@ -247,7 +247,7 @@ bool CartridgeMNetwork::patch(uInt16 address, uInt8 value)
|
|||
myRAM[address & 0x03FF] = value;
|
||||
}
|
||||
else
|
||||
myImage[(myCurrentSlice[0] << 11) + (address & (BANK_SIZE-1))] = value;
|
||||
myImage[(myCurrentBank[0] << 11) + (address & (BANK_SIZE-1))] = value;
|
||||
}
|
||||
else if(address < 0x0900)
|
||||
{
|
||||
|
@ -257,7 +257,7 @@ bool CartridgeMNetwork::patch(uInt16 address, uInt8 value)
|
|||
myRAM[0x0400 + (myCurrentRAM << 8) + (address & 0x00FF)] = value;
|
||||
}
|
||||
else
|
||||
myImage[(myCurrentSlice[address >> 11] << 11) + (address & (BANK_SIZE-1))] = value;
|
||||
myImage[(myCurrentBank[address >> 11] << 11) + (address & (BANK_SIZE-1))] = value;
|
||||
|
||||
return myBankChanged = true;
|
||||
}
|
||||
|
@ -274,7 +274,7 @@ bool CartridgeMNetwork::save(Serializer& out) const
|
|||
{
|
||||
try
|
||||
{
|
||||
out.putShortArray(myCurrentSlice.data(), myCurrentSlice.size());
|
||||
out.putShortArray(myCurrentBank.data(), myCurrentBank.size());
|
||||
out.putShort(myCurrentRAM);
|
||||
out.putByteArray(myRAM.data(), myRAM.size());
|
||||
}
|
||||
|
@ -292,7 +292,7 @@ bool CartridgeMNetwork::load(Serializer& in)
|
|||
{
|
||||
try
|
||||
{
|
||||
in.getShortArray(myCurrentSlice.data(), myCurrentSlice.size());
|
||||
in.getShortArray(myCurrentBank.data(), myCurrentBank.size());
|
||||
myCurrentRAM = in.getShort();
|
||||
in.getByteArray(myRAM.data(), myRAM.size());
|
||||
}
|
||||
|
@ -304,7 +304,7 @@ bool CartridgeMNetwork::load(Serializer& in)
|
|||
|
||||
// Set up the previously used banks for the RAM and segment
|
||||
bankRAM(myCurrentRAM);
|
||||
bank(myCurrentSlice[0]);
|
||||
bank(myCurrentBank[0]);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -51,7 +51,7 @@
|
|||
here by accessing 1FE8 to 1FEB.
|
||||
|
||||
This cart reports having 8 banks; 1 for each of the possible 7
|
||||
slices in the lower 2K area, and the last for RAM in the lower
|
||||
bank in the lower 2K area, and the last for RAM in the lower
|
||||
2K area."
|
||||
|
||||
There are 8K, 12K and 16K variations, with or without RAM.
|
||||
|
@ -179,7 +179,7 @@ class CartridgeMNetwork : public Cartridge
|
|||
private:
|
||||
// Size of RAM in the cart
|
||||
static constexpr uInt32 RAM_SIZE = 0x800; // 1K + 4 * 256B = 2K
|
||||
// Number of slices with 4K address space
|
||||
// Number of segment within the 4K address space
|
||||
static constexpr uInt32 NUM_SEGMENTS = 2;
|
||||
|
||||
/**
|
||||
|
@ -198,8 +198,6 @@ class CartridgeMNetwork : public Cartridge
|
|||
private:
|
||||
// Pointer to a dynamically allocated ROM image of the cartridge
|
||||
ByteBuffer myImage;
|
||||
// The 16K ROM image of the cartridge (works for E78K too)
|
||||
//uInt8 myImage[BANK_SIZE * 8];
|
||||
|
||||
// Size of the ROM image
|
||||
size_t mySize{0};
|
||||
|
@ -207,14 +205,14 @@ class CartridgeMNetwork : public Cartridge
|
|||
// The 2K of RAM
|
||||
std::array<uInt8, RAM_SIZE> myRAM;
|
||||
|
||||
// Indicates which slice is in the segment
|
||||
std::array<uInt16, NUM_SEGMENTS> myCurrentSlice;
|
||||
// Indicates which bank is in the segment
|
||||
std::array<uInt16, NUM_SEGMENTS> myCurrentBank;
|
||||
|
||||
// Indicates which 256 byte bank of RAM is being used
|
||||
uInt16 myCurrentRAM{0};
|
||||
|
||||
// The number of the RAM slice (== bankCount() - 1)
|
||||
uInt32 myRAMSlice{0};
|
||||
// The number of the RAM bank (== bankCount() - 1)
|
||||
uInt32 myRAMBank{0};
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
|
|
|
@ -28,7 +28,7 @@ CartridgeWD::CartridgeWD(const ByteBuffer& image, size_t size,
|
|||
// Copy the ROM image into my buffer
|
||||
if (mySize == 8_KB + 3)
|
||||
{
|
||||
// swap slices 2 & 3 of bad dump and correct size
|
||||
// swap banks 2 & 3 of bad dump and correct size
|
||||
std::copy_n(image.get() + 1_KB * 3, 1_KB * 1, myImage.get() + 1_KB * 2);
|
||||
std::copy_n(image.get() + 1_KB * 2, 1_KB * 1, myImage.get() + 1_KB * 3);
|
||||
mySize = 8_KB;
|
||||
|
|
|
@ -30,8 +30,8 @@ class System;
|
|||
This is the cartridge class for a "Wickstead Design" prototype cart.
|
||||
The ROM has 64 bytes of RAM.
|
||||
In this bankswitching scheme the 2600's 4K cartridge address space
|
||||
is broken into four 1K segments. The desired arrangement of 1K slices
|
||||
is selected by accessing $30 - $3F of TIA address space. The slices
|
||||
is broken into four 1K segments. The desired arrangement of 1K banks
|
||||
is selected by accessing $30 - $3F of TIA address space. The banks
|
||||
are mapped into all 4 segments at once as follows:
|
||||
|
||||
$0030, $0038: 0,0,1,3
|
||||
|
|
Loading…
Reference in New Issue