diff --git a/Changes.txt b/Changes.txt
index 4603ade98..a6b34ae41 100644
--- a/Changes.txt
+++ b/Changes.txt
@@ -38,6 +38,8 @@
* Added limited GameLine Master Module bankswitching support.
+ * Added 03E0 bankswitching for Brazilian Parker Bros ROMs.
+
* Added BUS bankswitching support for some older demos.
* Fixed broken 7800 pause key support.
diff --git a/docs/index.html b/docs/index.html
index 575f6c525..f7696d7c0 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -4888,6 +4888,7 @@ Ms Pac-Man (Stella extended codes):
Note: If 'Filter' is checked, only the bankswitching types matching the ROM size are listed.
Type | Description | File Extension (to force type) |
+ 03e0 | 8K Brazilian Parker Bros | .03e, .03e0 |
0840 | 8K EconoBanking | .084, .0840 |
0FA0 | 8K Fotomania | .0FA, .0FA0 |
2IN1 ¹ | 4-64K Multicart (2 games) | .2N1 |
diff --git a/src/debugger/gui/Cart03E0Widget.cxx b/src/debugger/gui/Cart03E0Widget.cxx
new file mode 100644
index 000000000..7d35467d1
--- /dev/null
+++ b/src/debugger/gui/Cart03E0Widget.cxx
@@ -0,0 +1,74 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2023 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#include "Cart03E0.hxx"
+#include "Cart03E0Widget.hxx"
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Cartridge03E0Widget::Cartridge03E0Widget(
+ GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
+ int x, int y, int w, int h, Cartridge03E0& cart)
+ : CartridgeEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
+{
+ initialize();
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+string Cartridge03E0Widget::description()
+{
+ ostringstream info;
+
+ info << "03E0 cartridge,\n eight 1K banks mapped into four segments\n"
+ << CartridgeEnhancedWidget::description();
+
+ return info.str();
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+string Cartridge03E0Widget::romDescription()
+{
+ ostringstream info;
+
+ for(int seg = 0; seg < 4; ++seg)
+ {
+ const uInt16 segmentOffset = seg << 10; // myCart.myBankShift;
+
+ info << "Segment #" << seg << " accessible @ $"
+ << Common::Base::HEX4 << (ADDR_BASE | segmentOffset)
+ << " - $" << (ADDR_BASE | (segmentOffset + /*myCart.myBankSize - 1*/ 0x3FF)) << ",\n";
+ if (seg < 3)
+ info << " Hotspots " << hotspotStr(0, seg, true) << " - " << hotspotStr(7, seg, true) << "\n";
+ else
+ info << " Always points to last 1K bank of ROM\n";
+ }
+ info << "Startup banks = 4 / 5 / 6 or undetermined";
+
+ return info.str();
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+string Cartridge03E0Widget::hotspotStr(int bank, int segment, bool noBrackets)
+{
+ static constexpr uInt16 hotspots[3] = {0x03E0, 0x03D0, 0x03B0};
+ ostringstream info;
+
+ info << (noBrackets ? "" : "(")
+ << "$" << Common::Base::HEX1 << ( hotspots[segment] + bank)
+ << (noBrackets ? "" : ")");
+
+ return info.str();
+}
diff --git a/src/debugger/gui/Cart03E0Widget.hxx b/src/debugger/gui/Cart03E0Widget.hxx
new file mode 100644
index 000000000..eccb9cdf6
--- /dev/null
+++ b/src/debugger/gui/Cart03E0Widget.hxx
@@ -0,0 +1,54 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2023 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#ifndef CARTRIDGE03E0_WIDGET_HXX
+#define CARTRIDGE03E0_WIDGET_HXX
+
+class Cartridge03E0;
+
+#include "CartEnhancedWidget.hxx"
+
+class Cartridge03E0Widget : public CartridgeEnhancedWidget
+{
+ public:
+ Cartridge03E0Widget(GuiObject* boss, const GUI::Font& lfont,
+ const GUI::Font& nfont,
+ int x, int y, int w, int h,
+ Cartridge03E0& cart);
+ ~Cartridge03E0Widget() override = default;
+
+ private:
+ string manufacturer() override { return "Parker Brothers (Brazil Pirate)"; }
+
+ string description() override;
+
+ string romDescription() override;
+
+ string hotspotStr(int bank, int segment, bool noBrackets = false) override;
+
+ uInt16 bankSegs() override { return 3; }
+
+ private:
+ // Following constructors and assignment operators not supported
+ Cartridge03E0Widget() = delete;
+ Cartridge03E0Widget(const Cartridge03E0Widget&) = delete;
+ Cartridge03E0Widget(Cartridge03E0Widget&&) = delete;
+ Cartridge03E0Widget& operator=(const Cartridge03E0Widget&) = delete;
+ Cartridge03E0Widget& operator=(Cartridge03E0Widget&&) = delete;
+};
+
+#endif
diff --git a/src/debugger/gui/CartEnhancedWidget.cxx b/src/debugger/gui/CartEnhancedWidget.cxx
index 3cd486d5f..5b82a8a5c 100644
--- a/src/debugger/gui/CartEnhancedWidget.cxx
+++ b/src/debugger/gui/CartEnhancedWidget.cxx
@@ -270,7 +270,7 @@ string CartridgeEnhancedWidget::bankState()
//if(hotspot >= 0x100)
if(hotspot != 0 && myHotspotDelta > 0)
- buf << " " << hotspotStr(bank, 0, bankSegs() < 3);
+ buf << " " << hotspotStr(bank, seg, bankSegs() < 3);
}
}
else
diff --git a/src/debugger/gui/module.mk b/src/debugger/gui/module.mk
index 45ea9b5ae..7742e84f6 100644
--- a/src/debugger/gui/module.mk
+++ b/src/debugger/gui/module.mk
@@ -6,6 +6,7 @@ MODULE_OBJS := \
src/debugger/gui/AtariVoxWidget.o \
src/debugger/gui/AudioWidget.o \
src/debugger/gui/BoosterWidget.o \
+ src/debugger/gui/Cart03E0Widget.o \
src/debugger/gui/Cart0840Widget.o \
src/debugger/gui/Cart0FA0Widget.o \
src/debugger/gui/Cart2KWidget.o \
diff --git a/src/emucore/Bankswitch.cxx b/src/emucore/Bankswitch.cxx
index 6c17fca3b..52aec7232 100644
--- a/src/emucore/Bankswitch.cxx
+++ b/src/emucore/Bankswitch.cxx
@@ -75,6 +75,7 @@ bool Bankswitch::isValidRomName(string_view name, string& ext)
constexpr std::array(Bankswitch::Type::NumSchemes)>
Bankswitch::BSList = {{
{ "AUTO" , "Auto-detect" },
+ { "03E0" , "03E0 (8K Braz. Parker Bros)" },
{ "0840" , "0840 (8K EconoBanking)" },
{ "0FA0" , "0FA0 (8K Fotomania)" },
{ "2IN1" , "2in1 Multicart (4-64K)" },
@@ -138,6 +139,7 @@ Bankswitch::BSList = {{
const std::array(Bankswitch::Type::NumSchemes)>
Bankswitch::Sizes = {{
{ Bankswitch::any_KB, Bankswitch::any_KB }, // _AUTO
+ { 8_KB, 8_KB }, // _03E0
{ 8_KB, 8_KB }, // _0840
{ 8_KB, 8_KB }, // _0FA0
{ 4_KB, 64_KB }, // _2IN1
@@ -210,6 +212,8 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
{ "cu" , Bankswitch::Type::_AUTO },
// All bankswitch types (those that UnoCart and HarmonyCart support have the same name)
+ { "03E" , Bankswitch::Type::_03E0 },
+ { "03E0" , Bankswitch::Type::_03E0 },
{ "084" , Bankswitch::Type::_0840 },
{ "0840" , Bankswitch::Type::_0840 },
{ "0FA" , Bankswitch::Type::_0FA0 },
@@ -288,6 +292,7 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bankswitch::NameToTypeMap Bankswitch::ourNameToTypes = {
{ "AUTO" , Bankswitch::Type::_AUTO },
+ { "03E0" , Bankswitch::Type::_03E0 },
{ "0840" , Bankswitch::Type::_0840 },
{ "0FA0" , Bankswitch::Type::_0FA0 },
{ "2IN1" , Bankswitch::Type::_2IN1 },
diff --git a/src/emucore/Bankswitch.hxx b/src/emucore/Bankswitch.hxx
index d7eebd9a4..b3e3f7750 100644
--- a/src/emucore/Bankswitch.hxx
+++ b/src/emucore/Bankswitch.hxx
@@ -38,13 +38,13 @@ class Bankswitch
public:
// Currently supported bankswitch schemes
enum class Type {
- _AUTO, _0840, _0FA0, _2IN1, _4IN1, _8IN1, _16IN1, _32IN1,
- _64IN1, _128IN1, _2K, _3E, _3EX, _3EP, _3F, _4A50,
- _4K, _4KSC, _AR, _BF, _BFSC, _BUS, _CDF, _CM,
- _CTY, _CV, _DF, _DFSC, _DPC, _DPCP, _E0, _E7,
- _EF, _EFSC, _F0, _F4, _F4SC, _F6, _F6SC, _F8,
- _F8SC, _FA, _FA2, _FC, _FE, _GL, _MDM, _MVC,
- _SB, _TVBOY, _UA, _UASW, _WD, _WDSW, _X07,
+ _AUTO, _03E0, _0840, _0FA0, _2IN1, _4IN1, _8IN1, _16IN1,
+ _32IN1, _64IN1, _128IN1, _2K, _3E, _3EX, _3EP, _3F,
+ _4A50, _4K, _4KSC, _AR, _BF, _BFSC, _BUS, _CDF,
+ _CM, _CTY, _CV, _DF, _DFSC, _DPC, _DPCP, _E0,
+ _E7, _EF, _EFSC, _F0, _F4, _F4SC, _F6, _F6SC,
+ _F8, _F8SC, _FA, _FA2, _FC, _FE, _GL, _MDM,
+ _MVC, _SB, _TVBOY, _UA, _UASW, _WD, _WDSW, _X07,
#ifdef CUSTOM_ARM
_CUSTOM,
#endif
diff --git a/src/emucore/Cart03E0.cxx b/src/emucore/Cart03E0.cxx
new file mode 100644
index 000000000..e6cf12577
--- /dev/null
+++ b/src/emucore/Cart03E0.cxx
@@ -0,0 +1,113 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2023 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#include "System.hxx"
+#include "Cart03E0.hxx"
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+Cartridge03E0::Cartridge03E0(const ByteBuffer& image, size_t size,
+ string_view md5, const Settings& settings,
+ size_t bsSize)
+ : CartridgeEnhanced(image, size, md5, settings, bsSize)
+{
+ myBankShift = BANK_SHIFT;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void Cartridge03E0::install(System& system)
+{
+ CartridgeEnhanced::install(system);
+
+ // 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
+ myHotSpotPageAccess[0] = mySystem->getPageAccess(0x0380);
+ myHotSpotPageAccess[1] = mySystem->getPageAccess(0x03c0);
+
+ // Set the page accessing methods for the hot spots
+ const System::PageAccess access(this, System::PageAccessType::READ);
+ for(uInt16 addr = 0x0380; addr < 0x03FF; addr += System::PAGE_SIZE)
+ mySystem->setPageAccess(addr, access);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+void Cartridge03E0::reset()
+{
+ // Setup segments to some default banks
+ if(randomStartBank())
+ {
+ bank(mySystem->randGenerator().next() % 8, 0);
+ bank(mySystem->randGenerator().next() % 8, 1);
+ bank(mySystem->randGenerator().next() % 8, 2);
+ }
+ else
+ {
+ bank(4, 0);
+ bank(5, 1);
+ bank(6, 2);
+ }
+ myBankChanged = true;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+bool Cartridge03E0::checkSwitchBank(uInt16 address, uInt8)
+{
+ bool switched = false;
+
+ if((address & 0x10) == 0)
+ {
+ bank(address & 0x0007, 0);
+ switched = true;
+ }
+ if((address & 0x20) == 0)
+ {
+ bank(address & 0x0007, 1);
+ switched = true;
+ }
+ if((address & 0x40) == 0)
+ {
+ bank(address & 0x0007, 2);
+ switched = true;
+ }
+ return switched;
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+uInt8 Cartridge03E0::peek(uInt16 address)
+{
+ checkSwitchBank(address, 0);
+
+ // Because of the way we've set up accessing above, we can only
+ // get here when the addresses are from 0x380 - 0x3FF
+ const int hotspot = ((address & 0x40) >> 6);
+ return myHotSpotPageAccess[hotspot].device->peek(address);
+}
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+bool Cartridge03E0::poke(uInt16 address, uInt8 value)
+{
+ // Because of the way accessing is set up, we will may get here by
+ // doing a write to 0x380 - 0x3FF or cart; we ignore the cart write
+ if(!(address & 0x1000))
+ {
+ checkSwitchBank(address, 0);
+
+ const int hotspot = ((address & 0x40) >> 6);
+ myHotSpotPageAccess[hotspot].device->poke(address, value);
+ }
+
+ return false;
+}
diff --git a/src/emucore/Cart03E0.hxx b/src/emucore/Cart03E0.hxx
new file mode 100644
index 000000000..899c23438
--- /dev/null
+++ b/src/emucore/Cart03E0.hxx
@@ -0,0 +1,137 @@
+//============================================================================
+//
+// SSSS tt lll lll
+// SS SS tt ll ll
+// SS tttttt eeee ll ll aaaa
+// SSSS tt ee ee ll ll aa
+// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator"
+// SS SS tt ee ll ll aa aa
+// SSSS ttt eeeee llll llll aaaaa
+//
+// Copyright (c) 1995-2023 by Bradford W. Mott, Stephen Anthony
+// and the Stella Team
+//
+// See the file "License.txt" for information on usage and redistribution of
+// this file, and for a DISCLAIMER OF ALL WARRANTIES.
+//============================================================================
+
+#ifndef Cartridge03E0_HXX
+#define Cartridge03E0_HXX
+
+#include "bspf.hxx"
+#include "CartEnhanced.hxx"
+#include "System.hxx"
+#ifdef DEBUGGER_SUPPORT
+ #include "Cart03e0Widget.hxx"
+#endif
+
+/**
+ This is the cartridge class for Parker Brothers' 8K games with special
+ Brazilian bankswitching. In this bankswitching scheme the 2600's 4K
+ cartridge address space is broken into four 1K segments.
+
+ The desired 1K bank of the ROM is selected as follows:
+ If A12 == 0, A9 == 1, A8 == 1, A7 == 1 ($0380..$03ff):
+ A4 == 0 ($03e0) loads the bank number for segment #0
+ A5 == 0 ($03d0) loads the bank number for segment #1
+ A6 == 0 ($03b0) loads the bank number for segment #2
+ Bits A0, A1, A2 determine the bank number (0..7)
+
+ 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
+ only one actual bank, in which pieces of it can be swapped out in
+ many different ways.
+
+ @author Thomas Jentzsch
+*/
+class Cartridge03E0 : public CartridgeEnhanced
+{
+ friend class Cartridge03E0Widget;
+
+ public:
+ /**
+ Create a new cartridge using the specified image
+
+ @param image Pointer to the ROM image
+ @param size The size of the ROM image
+ @param md5 The md5sum of the ROM image
+ @param settings A reference to the various settings (read-only)
+ @param bsSize The size specified by the bankswitching scheme
+ */
+ Cartridge03E0(const ByteBuffer& image, size_t size, string_view md5,
+ const Settings& settings, size_t bsSize = 8_KB);
+ ~Cartridge03E0() override = default;
+
+ public:
+ /**
+ Install cartridge in the specified system. Invoked by the system
+ when the cartridge is attached to it.
+
+ @param system The system the device should install itself in
+ */
+ void install(System& system) override;
+
+ /**
+ Reset device to its power-on state
+ */
+ void reset() override;
+
+ /**
+ Get a descriptor for the device name (used in error checking).
+
+ @return The name of the object
+ */
+ string name() const override { return "Cartridge03E0"; }
+
+ #ifdef DEBUGGER_SUPPORT
+ /**
+ Get debugger widget responsible for accessing the inner workings
+ of the cart.
+ */
+ CartDebugWidget* debugWidget(GuiObject* boss, const GUI::Font& lfont,
+ const GUI::Font& nfont, int x, int y, int w, int h) override
+ {
+ return new Cartridge03E0Widget(boss, lfont, nfont, x, y, w, h, *this);
+ }
+ #endif
+
+ public:
+ /**
+ Get the byte at the specified address.
+
+ @return The byte at the specified address
+ */
+ uInt8 peek(uInt16 address) override;
+
+ /**
+ Change the byte at the specified address to the given value
+
+ @param address The address where the value should be stored
+ @param value The value to be stored at the address
+ @return True if the poke changed the device address space, else false
+ */
+ bool poke(uInt16 address, uInt8 value) override;
+
+ private:
+ bool checkSwitchBank(uInt16 address, uInt8) override;
+
+ uInt16 hotspot() const override { return 0x0380; }
+
+ private:
+ // log(ROM bank segment size) / log(2)
+ static constexpr uInt16 BANK_SHIFT = 10; // = 1K = 0x0400
+
+ // Previous Device's page access
+ std::array myHotSpotPageAccess;
+
+ private:
+ // Following constructors and assignment operators not supported
+ Cartridge03E0() = delete;
+ Cartridge03E0(const Cartridge03E0&) = delete;
+ Cartridge03E0(Cartridge03E0&&) = delete;
+ Cartridge03E0& operator=(const Cartridge03E0&) = delete;
+ Cartridge03E0& operator=(Cartridge03E0&&) = delete;
+};
+
+#endif
diff --git a/src/emucore/CartCreator.cxx b/src/emucore/CartCreator.cxx
index 111695afe..021cbed2f 100644
--- a/src/emucore/CartCreator.cxx
+++ b/src/emucore/CartCreator.cxx
@@ -17,6 +17,7 @@
#include "bspf.hxx"
#include "Cart.hxx"
+#include "Cart03E0.hxx"
#include "Cart0840.hxx"
#include "Cart0FA0.hxx"
#include "Cart2K.hxx"
@@ -232,6 +233,8 @@ CartCreator::createFromImage(const ByteBuffer& image, size_t size,
// We should know the cart's type by now so let's create it
switch(type)
{
+ case Bankswitch::Type::_03E0:
+ return make_unique(image, size, md5, settings);
case Bankswitch::Type::_0840:
return make_unique(image, size, md5, settings);
case Bankswitch::Type::_0FA0:
diff --git a/src/emucore/CartDetector.cxx b/src/emucore/CartDetector.cxx
index 1e3b9a4f4..d1f3af5d4 100644
--- a/src/emucore/CartDetector.cxx
+++ b/src/emucore/CartDetector.cxx
@@ -92,6 +92,8 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
type = Bankswitch::Type::_WD;
else if (isProbablyFC(image, size))
type = Bankswitch::Type::_FC;
+ else if(isProbably03E0(image, size))
+ type = Bankswitch::Type::_03E0;
else
type = Bankswitch::Type::_F8;
}
@@ -324,6 +326,22 @@ bool CartDetector::isProbablyARM(const ByteBuffer& image, size_t size)
return searchForBytes(image, std::min(size, 1_KB), signature[1], 4);
}
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+bool CartDetector::isProbably03E0(const ByteBuffer& image, size_t size)
+{
+ // 03E0 cart bankswitching for Brazilian Parker Bros ROMs, switches segment
+ // 0 into bank 0 by accessing address 0x3E0 using 'LDA $3E0' or 'ORA $3E0'.
+ static constexpr uInt8 signature[2][4] = {
+ { 0x0D, 0xE0, 0x03, 0x0D }, // ORA $3E0, ORA (Popeye)
+ { 0xAD, 0xE0, 0x03, 0xAD } // LDA $3E0, ORA (Montezuma's Revenge)
+ };
+ for(const auto* const sig: signature)
+ if(searchForBytes(image, size, sig, 4))
+ return true;
+
+ return false;
+}
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool CartDetector::isProbably0840(const ByteBuffer& image, size_t size)
{
diff --git a/src/emucore/CartDetector.hxx b/src/emucore/CartDetector.hxx
index e2d346f0a..b9ce7a2bc 100644
--- a/src/emucore/CartDetector.hxx
+++ b/src/emucore/CartDetector.hxx
@@ -86,13 +86,18 @@ class CartDetector
*/
static bool isProbablyARM(const ByteBuffer& image, size_t size);
+ /**
+ Returns true if the image is probably a 03E0 bankswitching cartridge
+ */
+ static bool isProbably03E0(const ByteBuffer& image, size_t size);
+
/**
Returns true if the image is probably a 0840 bankswitching cartridge
*/
static bool isProbably0840(const ByteBuffer& image, size_t size);
/**
- Returns true if the image is probably a BRazilian bankswitching cartridge
+ Returns true if the image is probably a Brazilian 0FA0 bankswitching cartridge
*/
static bool isProbably0FA0(const ByteBuffer& image, size_t size);
diff --git a/src/emucore/CartE0.cxx b/src/emucore/CartE0.cxx
index 4fcf5ad40..24bbcb32d 100644
--- a/src/emucore/CartE0.cxx
+++ b/src/emucore/CartE0.cxx
@@ -67,5 +67,6 @@ bool CartridgeE0::checkSwitchBank(uInt16 address, uInt8)
bank(address & 0x0007, 2);
return true;
}
+
return false;
}
diff --git a/src/emucore/module.mk b/src/emucore/module.mk
index be23f42ee..38e53273d 100644
--- a/src/emucore/module.mk
+++ b/src/emucore/module.mk
@@ -9,6 +9,7 @@ MODULE_OBJS := \
src/emucore/CartCreator.o \
src/emucore/CartDetector.o \
src/emucore/CartEnhanced.o \
+ src/emucore/Cart03E0.o \
src/emucore/Cart0840.o \
src/emucore/Cart0FA0.o \
src/emucore/Cart2K.o \
diff --git a/src/gui/FileListWidget.cxx b/src/gui/FileListWidget.cxx
index 01f2a53e7..205ffe53a 100644
--- a/src/gui/FileListWidget.cxx
+++ b/src/gui/FileListWidget.cxx
@@ -353,7 +353,7 @@ bool FileListWidget::handleKeyDown(StellaKey key, StellaMod mod)
_lastKey = key; _lastMod = mod;
if(_quickSelectTime < TimerManager::getTicks() / 1000)
_firstMod = mod;
- else if(key == KBDK_SPACE) // allow seaching strings with a space without selecting/starting
+ else if(key == KBDK_SPACE) // allow searching ROMs with a space without selecting/starting
handled = true;
return handled;
diff --git a/src/os/libretro/Makefile.common b/src/os/libretro/Makefile.common
index 453f3cf3f..724fd4adb 100644
--- a/src/os/libretro/Makefile.common
+++ b/src/os/libretro/Makefile.common
@@ -43,6 +43,7 @@ SOURCES_CXX := \
$(CORE_DIR)/emucore/CartCreator.cxx \
$(CORE_DIR)/emucore/CartDetector.cxx \
$(CORE_DIR)/emucore/CartEnhanced.cxx \
+ $(CORE_DIR)/emucore/Cart03E0.cxx \
$(CORE_DIR)/emucore/Cart0840.cxx \
$(CORE_DIR)/emucore/Cart0FA0.cxx \
$(CORE_DIR)/emucore/Cart2K.cxx \
diff --git a/src/os/libretro/Stella.vcxproj b/src/os/libretro/Stella.vcxproj
index ee90e9f86..c9ba437b3 100644
--- a/src/os/libretro/Stella.vcxproj
+++ b/src/os/libretro/Stella.vcxproj
@@ -219,6 +219,7 @@
+
@@ -382,6 +383,7 @@
+
diff --git a/src/os/windows/Stella.vcxproj b/src/os/windows/Stella.vcxproj
index d659a040d..8e25f756f 100755
--- a/src/os/windows/Stella.vcxproj
+++ b/src/os/windows/Stella.vcxproj
@@ -918,6 +918,7 @@
true
+
true
@@ -978,6 +979,7 @@
+
@@ -2108,6 +2110,7 @@
true
+
true
@@ -2303,6 +2306,7 @@
+
diff --git a/src/os/windows/Stella.vcxproj.filters b/src/os/windows/Stella.vcxproj.filters
index 7d3849df5..d75b91f01 100644
--- a/src/os/windows/Stella.vcxproj.filters
+++ b/src/os/windows/Stella.vcxproj.filters
@@ -1203,6 +1203,12 @@
Source Files\debugger\gui
+
+ Source Files\emucore
+
+
+ Source Files\debugger\gui
+
@@ -2453,6 +2459,12 @@
Header Files\debugger\gui
+
+ Header Files\emucore
+
+
+ Header Files\debugger\gui
+
diff --git a/test/roms/bankswitching/03E0/Montezuma's Revenge (Brazilian Parker Brothers).bin b/test/roms/bankswitching/03E0/Montezuma's Revenge (Brazilian Parker Brothers).bin
new file mode 100644
index 000000000..5652d9d67
Binary files /dev/null and b/test/roms/bankswitching/03E0/Montezuma's Revenge (Brazilian Parker Brothers).bin differ
diff --git a/test/roms/bankswitching/03E0/Popeye (Brazilian Parker Brothers).bin b/test/roms/bankswitching/03E0/Popeye (Brazilian Parker Brothers).bin
new file mode 100644
index 000000000..66703bf59
Binary files /dev/null and b/test/roms/bankswitching/03E0/Popeye (Brazilian Parker Brothers).bin differ