mirror of https://github.com/stella-emu/stella.git
adapted UA bankswitching to new Brazilian carts (except Mickey)
This commit is contained in:
parent
78cce1e50b
commit
bd39c0836f
|
@ -39,17 +39,17 @@ CartridgeUAWidget::CartridgeUAWidget(
|
||||||
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
|
uInt16 start = (cart.myImage[offset+1] << 8) | cart.myImage[offset];
|
||||||
start -= start % 0x1000;
|
start -= start % 0x1000;
|
||||||
info << "Bank " << i << " @ $" << Common::Base::HEX4 << start << " - "
|
info << "Bank " << i << " @ $" << Common::Base::HEX4 << start << " - "
|
||||||
<< "$" << (start + 0xFFF) << " (hotspot = $" << spot << ")\n";
|
<< "$" << (start + 0xFFF) << " (hotspots = $" << spot << ", $" << (spot | 0x80) << ")\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
int xpos = 10,
|
int xpos = 10,
|
||||||
ypos = addBaseInformation(size, "UA Limited", info.str()) + myLineHeight;
|
ypos = addBaseInformation(size, "UA Limited", info.str()) + myLineHeight;
|
||||||
|
|
||||||
VariantList items;
|
VariantList items;
|
||||||
VarList::push_back(items, "0 ($220)");
|
VarList::push_back(items, "0 ($220, $2A0)");
|
||||||
VarList::push_back(items, "1 ($240)");
|
VarList::push_back(items, "1 ($240, $2C0)");
|
||||||
myBank =
|
myBank =
|
||||||
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("0 ($FFx) "),
|
new PopUpWidget(boss, _font, xpos, ypos-2, _font.getStringWidth("0 ($FFx, $FFx)"),
|
||||||
myLineHeight, items, "Set bank ",
|
myLineHeight, items, "Set bank ",
|
||||||
_font.getStringWidth("Set bank "), kBankChanged);
|
_font.getStringWidth("Set bank "), kBankChanged);
|
||||||
myBank->setTarget(this);
|
myBank->setTarget(this);
|
||||||
|
@ -87,9 +87,9 @@ string CartridgeUAWidget::bankState()
|
||||||
{
|
{
|
||||||
ostringstream& buf = buffer();
|
ostringstream& buf = buffer();
|
||||||
|
|
||||||
static const char* const spot[] = { "$220", "$240" };
|
static const char* const spot[] = { "$220, $2A0", "$240, $2C0" };
|
||||||
buf << "Bank = " << std::dec << myCart.getBank()
|
buf << "Bank = " << std::dec << myCart.getBank()
|
||||||
<< ", hotspot = " << spot[myCart.getBank()];
|
<< ", hotspots = " << spot[myCart.getBank()];
|
||||||
|
|
||||||
return buf.str();
|
return buf.str();
|
||||||
}
|
}
|
||||||
|
|
|
@ -966,12 +966,17 @@ bool CartDetector::isProbablyUA(const ByteBuffer& image, uInt32 size)
|
||||||
{
|
{
|
||||||
// UA cart bankswitching switches to bank 1 by accessing address 0x240
|
// UA cart bankswitching switches to bank 1 by accessing address 0x240
|
||||||
// using 'STA $240' or 'LDA $240'
|
// using 'STA $240' or 'LDA $240'
|
||||||
uInt8 signature[3][3] = {
|
// Similar Brazilian cart bankswitching switches to bank 1 by accessing address 0x2C0
|
||||||
|
// using 'BIT $2C0', 'STA $2C0' or 'LDA $2C0'
|
||||||
|
uInt8 signature[6][3] = {
|
||||||
{ 0x8D, 0x40, 0x02 }, // STA $240
|
{ 0x8D, 0x40, 0x02 }, // STA $240
|
||||||
{ 0xAD, 0x40, 0x02 }, // LDA $240
|
{ 0xAD, 0x40, 0x02 }, // LDA $240
|
||||||
{ 0xBD, 0x1F, 0x02 } // LDA $21F,X
|
{ 0xBD, 0x1F, 0x02 }, // LDA $21F,X
|
||||||
|
{ 0x2C, 0xC0, 0x02 }, // BIT $2C0
|
||||||
|
{ 0x8D, 0xC0, 0x02 }, // STA $2C0
|
||||||
|
{ 0xAD, 0xC0, 0x02 } // LDA $2C0
|
||||||
};
|
};
|
||||||
for(uInt32 i = 0; i < 3; ++i)
|
for(uInt32 i = 0; i < 6; ++i)
|
||||||
if(searchForBytes(image.get(), size, signature[i], 3, 1))
|
if(searchForBytes(image.get(), size, signature[i], 3, 1))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
|
|
@ -44,12 +44,15 @@ void CartridgeUA::install(System& system)
|
||||||
|
|
||||||
// Get the page accessing methods for the hot spots since they overlap
|
// Get the page accessing methods for the hot spots since they overlap
|
||||||
// areas within the TIA we'll need to forward requests to the TIA
|
// areas within the TIA we'll need to forward requests to the TIA
|
||||||
myHotSpotPageAccess = mySystem->getPageAccess(0x0220);
|
myHotSpotPageAccess[0] = mySystem->getPageAccess(0x0220);
|
||||||
|
myHotSpotPageAccess[1] = mySystem->getPageAccess(0x0220 | 0x80);
|
||||||
|
|
||||||
// Set the page accessing methods for the hot spots
|
// Set the page accessing methods for the hot spots
|
||||||
System::PageAccess access(this, System::PageAccessType::READ);
|
System::PageAccess access(this, System::PageAccessType::READ);
|
||||||
mySystem->setPageAccess(0x0220, access);
|
mySystem->setPageAccess(0x0220, access);
|
||||||
mySystem->setPageAccess(0x0240, access);
|
mySystem->setPageAccess(0x0240, access);
|
||||||
|
mySystem->setPageAccess(0x0220 | 0x80, access);
|
||||||
|
mySystem->setPageAccess(0x0240 | 0x80, access);
|
||||||
|
|
||||||
// Install pages for the startup bank
|
// Install pages for the startup bank
|
||||||
bank(startBank());
|
bank(startBank());
|
||||||
|
@ -61,7 +64,7 @@ uInt8 CartridgeUA::peek(uInt16 address)
|
||||||
address &= 0x1FFF;
|
address &= 0x1FFF;
|
||||||
|
|
||||||
// Switch banks if necessary
|
// Switch banks if necessary
|
||||||
switch(address)
|
switch(address & 0x1260)
|
||||||
{
|
{
|
||||||
case 0x0220:
|
case 0x0220:
|
||||||
// Set the current bank to the lower 4k bank
|
// Set the current bank to the lower 4k bank
|
||||||
|
@ -79,7 +82,8 @@ uInt8 CartridgeUA::peek(uInt16 address)
|
||||||
|
|
||||||
// Because of the way accessing is set up, we will only get here
|
// Because of the way accessing is set up, we will only get here
|
||||||
// when doing a TIA read
|
// when doing a TIA read
|
||||||
return myHotSpotPageAccess.device->peek(address);
|
int hotspot = ((address & 0x80) >> 7);
|
||||||
|
return myHotSpotPageAccess[hotspot].device->peek(address);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
@ -88,7 +92,7 @@ bool CartridgeUA::poke(uInt16 address, uInt8 value)
|
||||||
address &= 0x1FFF;
|
address &= 0x1FFF;
|
||||||
|
|
||||||
// Switch banks if necessary
|
// Switch banks if necessary
|
||||||
switch(address)
|
switch(address & 0x1260)
|
||||||
{
|
{
|
||||||
case 0x0220:
|
case 0x0220:
|
||||||
// Set the current bank to the lower 4k bank
|
// Set the current bank to the lower 4k bank
|
||||||
|
@ -106,8 +110,11 @@ bool CartridgeUA::poke(uInt16 address, uInt8 value)
|
||||||
|
|
||||||
// Because of the way accessing is set up, we will may get here by
|
// Because of the way accessing is set up, we will may get here by
|
||||||
// doing a write to TIA or cart; we ignore the cart write
|
// doing a write to TIA or cart; we ignore the cart write
|
||||||
if(!(address & 0x1000))
|
if (!(address & 0x1000))
|
||||||
myHotSpotPageAccess.device->poke(address, value);
|
{
|
||||||
|
int hotspot = ((address & 0x80) >> 7);
|
||||||
|
myHotSpotPageAccess[hotspot].device->poke(address, value);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -154,7 +154,7 @@ class CartridgeUA : public Cartridge
|
||||||
uInt8 myImage[8192];
|
uInt8 myImage[8192];
|
||||||
|
|
||||||
// Previous Device's page access
|
// Previous Device's page access
|
||||||
System::PageAccess myHotSpotPageAccess;
|
System::PageAccess myHotSpotPageAccess[2];
|
||||||
|
|
||||||
// Indicates the offset into the ROM image (aligns to current bank)
|
// Indicates the offset into the ROM image (aligns to current bank)
|
||||||
uInt16 myBankOffset;
|
uInt16 myBankOffset;
|
||||||
|
|
Loading…
Reference in New Issue