From 71dbf0baa36eb031500f98044636c14c8d585b7d Mon Sep 17 00:00:00 2001 From: Thomas Jentzsch Date: Fri, 24 Sep 2021 22:22:48 +0200 Subject: [PATCH] merged E7 bankswitching classes --- docs/index.html | 3 +- src/debugger/gui/CartE78KWidget.cxx | 71 --------------- src/debugger/gui/CartE78KWidget.hxx | 45 ---------- src/debugger/gui/CartE7Widget.cxx | 71 --------------- src/debugger/gui/CartE7Widget.hxx | 45 ---------- src/debugger/gui/CartMNetworkWidget.cxx | 56 +++++++++++- src/debugger/gui/CartMNetworkWidget.hxx | 4 +- src/emucore/Bankswitch.cxx | 8 +- src/emucore/Bankswitch.hxx | 8 +- src/emucore/CartCreator.cxx | 7 +- src/emucore/CartDetector.cxx | 2 +- src/emucore/CartE7.cxx | 41 --------- src/emucore/CartE7.hxx | 85 ------------------ src/emucore/CartE78K.cxx | 41 --------- src/emucore/CartE78K.hxx | 83 ----------------- src/emucore/CartMNetwork.cxx | 19 ++++ src/emucore/CartMNetwork.hxx | 39 ++++++-- src/windows/Stella.vcxproj | 16 ---- src/windows/Stella.vcxproj.filters | 24 ----- ...p (1988) (Telegames) (7045 A015) (PAL).bin | Bin 8192 -> 0 bytes .../E7/Elite Demo v1.0 (NTSC).bin | Bin 0 -> 16384 bytes 21 files changed, 117 insertions(+), 551 deletions(-) delete mode 100644 src/debugger/gui/CartE78KWidget.cxx delete mode 100644 src/debugger/gui/CartE78KWidget.hxx delete mode 100644 src/debugger/gui/CartE7Widget.cxx delete mode 100644 src/debugger/gui/CartE7Widget.hxx delete mode 100644 src/emucore/CartE7.cxx delete mode 100644 src/emucore/CartE7.hxx delete mode 100644 src/emucore/CartE78K.cxx delete mode 100644 src/emucore/CartE78K.hxx delete mode 100644 test/roms/bankswitching/E7/Bump 'n' Jump (1988) (Telegames) (7045 A015) (PAL).bin create mode 100644 test/roms/bankswitching/E7/Elite Demo v1.0 (NTSC).bin diff --git a/docs/index.html b/docs/index.html index 5febe104e..c827beb84 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4856,8 +4856,7 @@ Ms Pac-Man (Stella extended codes): DPC Pitfall II .DPC DPC+Enhanced DPC .DPP, .DPC+ E0 8K Parker Bros .E0 - E7 16K M Network .E7 - E78K 8K M Network .E78, .E78K + E7 8-16K M Network .E7 .E78, .E78K EF 64K Homestar Runner .EF EFSC 64K Homestar Runner + RAM.EFS, .EFSC F0 Dynacom Megaboy .F0 diff --git a/src/debugger/gui/CartE78KWidget.cxx b/src/debugger/gui/CartE78KWidget.cxx deleted file mode 100644 index c9304c69b..000000000 --- a/src/debugger/gui/CartE78KWidget.cxx +++ /dev/null @@ -1,71 +0,0 @@ -//============================================================================ -// -// 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-2021 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 "CartMNetwork.hxx" -#include "PopUpWidget.hxx" -#include "CartE78KWidget.hxx" - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CartridgeE78KWidget::CartridgeE78KWidget( - GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, - int x, int y, int w, int h, - CartridgeMNetwork& cart) - : CartridgeMNetworkWidget(boss, lfont, nfont, x, y, w, h, cart) -{ - ostringstream info; - 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 - uInt16 start = (cart.myImage[size - 3] << 8) | cart.myImage[size - 4]; - start -= start % 0x1000; - info << "Bank RORG" << " = $" << HEX4 << start << "\n"; -#endif - - initialize(boss, cart, info); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const char* CartridgeE78KWidget::getSpotLower(int idx) -{ - static constexpr std::array spot_lower = { - "#0 - ROM ($FFE4)", "#1 - ROM ($FFE5)", "#2 - ROM ($FFE6)", "#3 - RAM ($FFE7)" - }; - - return spot_lower[idx]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const char* CartridgeE78KWidget::getSpotUpper(int idx) -{ - static constexpr std::array spot_upper = { - "#0 - RAM ($FFE8)", "#1 - RAM ($FFE9)", "#2 - RAM ($FFEA)", "#3 - RAM ($FFEB)" - }; - - return spot_upper[idx]; -} diff --git a/src/debugger/gui/CartE78KWidget.hxx b/src/debugger/gui/CartE78KWidget.hxx deleted file mode 100644 index 4e93e4cd8..000000000 --- a/src/debugger/gui/CartE78KWidget.hxx +++ /dev/null @@ -1,45 +0,0 @@ -//============================================================================ -// -// 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-2021 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 CARTRIDGEE78K_WIDGET_HXX -#define CARTRIDGEE78K_WIDGET_HXX - -#include "CartMNetworkWidget.hxx" - -class CartridgeE78KWidget : public CartridgeMNetworkWidget -{ - public: - CartridgeE78KWidget(GuiObject* boss, const GUI::Font& lfont, - const GUI::Font& nfont, - int x, int y, int w, int h, - CartridgeMNetwork& cart); - ~CartridgeE78KWidget() override = default; - - protected: - const char* getSpotLower(int idx) override; - const char* getSpotUpper(int idx) override; - - private: - // Following constructors and assignment operators not supported - CartridgeE78KWidget() = delete; - CartridgeE78KWidget(const CartridgeE78KWidget&) = delete; - CartridgeE78KWidget(CartridgeE78KWidget&&) = delete; - CartridgeE78KWidget& operator=(const CartridgeE78KWidget&) = delete; - CartridgeE78KWidget& operator=(CartridgeE78KWidget&&) = delete; -}; - -#endif diff --git a/src/debugger/gui/CartE7Widget.cxx b/src/debugger/gui/CartE7Widget.cxx deleted file mode 100644 index 8207dd3ef..000000000 --- a/src/debugger/gui/CartE7Widget.cxx +++ /dev/null @@ -1,71 +0,0 @@ -//============================================================================ -// -// 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-2021 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 "CartMNetwork.hxx" -#include "CartE7Widget.hxx" - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CartridgeE7Widget::CartridgeE7Widget( - GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, - int x, int y, int w, int h, - CartridgeMNetwork& cart) - : CartridgeMNetworkWidget(boss, lfont, nfont, x, y, w, h, cart) -{ - ostringstream info; - info << "E7 cartridge, eight 2K banks ROM + 2K RAM,\n" - << " mapped into three segments\n" - << "Lower 2K accessible @ $F000 - $F7FF\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" - << " 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 - uInt16 start = (cart.myImage[size-3] << 8) | cart.myImage[size-4]; - start -= start % 0x1000; - info << "Bank RORG" << " = $" << HEX4 << start << "\n"; -#endif - - initialize(boss, cart, info); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const char* CartridgeE7Widget::getSpotLower(int idx) -{ - static constexpr std::array 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)" - }; - - return spot_lower[idx]; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -const char* CartridgeE7Widget::getSpotUpper(int idx) -{ - static constexpr std::array spot_upper = { - "#0 - RAM ($FFE8)", "#1 - RAM ($FFE9)", "#2 - RAM ($FFEA)", "#3 - RAM ($FFEB)" - }; - - return spot_upper[idx]; -} diff --git a/src/debugger/gui/CartE7Widget.hxx b/src/debugger/gui/CartE7Widget.hxx deleted file mode 100644 index b60d8419a..000000000 --- a/src/debugger/gui/CartE7Widget.hxx +++ /dev/null @@ -1,45 +0,0 @@ -//============================================================================ -// -// 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-2021 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 CARTRIDGEE7_WIDGET_HXX -#define CARTRIDGEE7_WIDGET_HXX - -#include "CartMNetworkWidget.hxx" - -class CartridgeE7Widget : public CartridgeMNetworkWidget -{ - public: - CartridgeE7Widget(GuiObject* boss, const GUI::Font& lfont, - const GUI::Font& nfont, - int x, int y, int w, int h, - CartridgeMNetwork& cart); - ~CartridgeE7Widget() override = default; - - protected: - const char* getSpotLower(int idx) override; - const char* getSpotUpper(int idx) override; - - private: - // Following constructors and assignment operators not supported - CartridgeE7Widget() = delete; - CartridgeE7Widget(const CartridgeE7Widget&) = delete; - CartridgeE7Widget(CartridgeE7Widget&&) = delete; - CartridgeE7Widget& operator=(const CartridgeE7Widget&) = delete; - CartridgeE7Widget& operator=(CartridgeE7Widget&&) = delete; -}; - -#endif diff --git a/src/debugger/gui/CartMNetworkWidget.cxx b/src/debugger/gui/CartMNetworkWidget.cxx index 59c5154a6..281fd9e55 100644 --- a/src/debugger/gui/CartMNetworkWidget.cxx +++ b/src/debugger/gui/CartMNetworkWidget.cxx @@ -15,7 +15,6 @@ // this file, and for a DISCLAIMER OF ALL WARRANTIES. //============================================================================ -//#include "CartE7.hxx" #include "CartMNetwork.hxx" #include "PopUpWidget.hxx" #include "CartMNetworkWidget.hxx" @@ -28,6 +27,33 @@ CartridgeMNetworkWidget::CartridgeMNetworkWidget( : CartDebugWidget(boss, lfont, nfont, x, y, w, h), myCart{cart} { + ostringstream info; + + info << "E7 cartridge, " + << (myCart.romBankCount() == 4 ? "four" : "eight") + << " 2K banks ROM + 2K RAM, \n" + << " mapped into three segments\n" + << "Lower 2K accessible @ $F000 - $F7FF\n" + << (myCart.romBankCount() == 4 + ? " ROM banks 0 - 2 (hotspots $FFE4 to $FFE6)\n" + : " ROM Banks 0 - 6 (hotspots $FFE0 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 + uInt16 start = (cart.myImage[size - 3] << 8) | cart.myImage[size - 4]; + start -= start % 0x1000; + info << "Bank RORG" << " = $" << HEX4 << start << "\n"; +#endif + + initialize(boss, cart, info); + } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -172,3 +198,31 @@ uInt8 CartridgeMNetworkWidget::internalRamGetValue(int addr) { return myCart.myRAM[addr]; } + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const char* CartridgeMNetworkWidget::getSpotLower(int idx) +{ + static constexpr std::array spot_lower_8K = { + "#0 - ROM ($FFE4)", "#1 - ROM ($FFE5)", "#2 - ROM ($FFE6)", "#3 - RAM ($FFE7)" + }; + static constexpr std::array spot_lower_16K = { + "#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 myCart.romBankCount() == 4 + ? spot_lower_8K[idx] + : spot_lower_16K[idx]; +} + + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +const char* CartridgeMNetworkWidget::getSpotUpper(int idx) +{ + static constexpr std::array spot_upper = { + "#0 - RAM ($FFE8)", "#1 - RAM ($FFE9)", "#2 - RAM ($FFEA)", "#3 - RAM ($FFEB)" + }; + + return spot_upper[idx]; +} + diff --git a/src/debugger/gui/CartMNetworkWidget.hxx b/src/debugger/gui/CartMNetworkWidget.hxx index 4bc8b58b3..53bcfd4d1 100644 --- a/src/debugger/gui/CartMNetworkWidget.hxx +++ b/src/debugger/gui/CartMNetworkWidget.hxx @@ -55,8 +55,8 @@ class CartridgeMNetworkWidget : public CartDebugWidget protected: void initialize(GuiObject* boss, CartridgeMNetwork& cart, ostringstream& info); - virtual const char* getSpotLower(int idx) = 0; - virtual const char* getSpotUpper(int idx) = 0; + virtual const char* getSpotLower(int idx); + virtual const char* getSpotUpper(int idx); private: void saveOldState() override; diff --git a/src/emucore/Bankswitch.cxx b/src/emucore/Bankswitch.cxx index 9cf200b4b..bba8e1ebc 100644 --- a/src/emucore/Bankswitch.cxx +++ b/src/emucore/Bankswitch.cxx @@ -124,8 +124,7 @@ Bankswitch::BSList = {{ { "DPC" , "DPC (Pitfall II)" }, { "DPC+" , "DPC+ (Enhanced DPC)" }, { "E0" , "E0 (8K Parker Bros)" }, - { "E7" , "E7 (16K M Network)" }, - { "E78K" , "E78K (8K M Network)" }, + { "E7" , "E7 (8-16K M Network)" }, { "EF" , "EF (64K H. Runner)" }, { "EFSC" , "EFSC (64K H. Runner + RAM)" }, { "F0" , "F0 (Dynacom Megaboy)" }, @@ -207,8 +206,8 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = { { "DPCP" , Bankswitch::Type::_DPCP }, { "E0" , Bankswitch::Type::_E0 }, { "E7" , Bankswitch::Type::_E7 }, - { "E78" , Bankswitch::Type::_E78K }, - { "E78K" , Bankswitch::Type::_E78K }, + { "E78" , Bankswitch::Type::_E7 }, + { "E78K" , Bankswitch::Type::_E7 }, { "EF" , Bankswitch::Type::_EF }, { "EFS" , Bankswitch::Type::_EFSC }, { "EFSC" , Bankswitch::Type::_EFSC }, @@ -271,7 +270,6 @@ Bankswitch::NameToTypeMap Bankswitch::ourNameToTypes = { { "DPC+" , Bankswitch::Type::_DPCP }, { "E0" , Bankswitch::Type::_E0 }, { "E7" , Bankswitch::Type::_E7 }, - { "E78K" , Bankswitch::Type::_E78K }, { "EF" , Bankswitch::Type::_EF }, { "EFSC" , Bankswitch::Type::_EFSC }, { "F0" , Bankswitch::Type::_F0 }, diff --git a/src/emucore/Bankswitch.hxx b/src/emucore/Bankswitch.hxx index 38485d2ea..ef2e7c17e 100644 --- a/src/emucore/Bankswitch.hxx +++ b/src/emucore/Bankswitch.hxx @@ -42,10 +42,10 @@ class Bankswitch _64IN1, _128IN1, _2K, _3E, _3EX, _3EP, _3F, _4A50, _4K, _4KSC, _AR, _BF, _BFSC, _BUS, _CDF, _CM, _CTY, _CV, _DF, _DFSC, _DPC, - _DPCP, _E0, _E7, _E78K, _EF, _EFSC, _F0, - _F4, _F4SC, _F6, _F6SC, _F8, _F8SC, _FA, - _FA2, _FC, _FE, _MDM, _MVC, _SB, _TVBOY, - _UA, _UASW, _WD, _WDSW, _X07, + _DPCP, _E0, _E7, _EF, _EFSC, _F0, _F4, + _F4SC, _F6, _F6SC, _F8, _F8SC, _FA, _FA2, + _FC, _FE, _MDM, _MVC, _SB, _TVBOY, _UA, + _UASW, _WD, _WDSW, _X07, #ifdef CUSTOM_ARM _CUSTOM, #endif diff --git a/src/emucore/CartCreator.cxx b/src/emucore/CartCreator.cxx index 797e1deeb..37aec071a 100644 --- a/src/emucore/CartCreator.cxx +++ b/src/emucore/CartCreator.cxx @@ -39,8 +39,7 @@ #include "CartDPC.hxx" #include "CartDPCPlus.hxx" #include "CartE0.hxx" -#include "CartE7.hxx" -#include "CartE78K.hxx" +#include "CartMNetwork.hxx" #include "CartEF.hxx" #include "CartEFSC.hxx" #include "CartF0.hxx" @@ -307,9 +306,7 @@ CartCreator::createFromImage(const ByteBuffer& image, size_t size, Bankswitch::T case Bankswitch::Type::_E0: return make_unique(image, size, md5, settings); case Bankswitch::Type::_E7: - return make_unique(image, size, md5, settings); - case Bankswitch::Type::_E78K: - return make_unique(image, size, md5, settings); + return make_unique(image, size, md5, settings); case Bankswitch::Type::_EF: return make_unique(image, size, md5, settings); case Bankswitch::Type::_EFSC: diff --git a/src/emucore/CartDetector.cxx b/src/emucore/CartDetector.cxx index 7a18e9299..95af6a7bd 100644 --- a/src/emucore/CartDetector.cxx +++ b/src/emucore/CartDetector.cxx @@ -80,7 +80,7 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si else if(isProbably0840(image, size)) type = Bankswitch::Type::_0840; else if(isProbablyE78K(image, size)) - type = Bankswitch::Type::_E78K; + type = Bankswitch::Type::_E7; else if (isProbablyWD(image,size)) type = Bankswitch::Type::_WD; else if (isProbablyFC(image, size)) diff --git a/src/emucore/CartE7.cxx b/src/emucore/CartE7.cxx deleted file mode 100644 index d9622408d..000000000 --- a/src/emucore/CartE7.cxx +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// -// 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-2021 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 "CartE7.hxx" - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CartridgeE7::CartridgeE7(const ByteBuffer& image, size_t size, - const string& md5, const Settings& settings) - : CartridgeMNetwork(image, size, md5, settings) -{ - initialize(image, size); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeE7::checkSwitchBank(uInt16 address) -{ - // Switch banks if necessary - if((address >= 0x0FE0) && (address <= 0x0FE7)) - { - bank(address & 0x0007); - } - else if((address >= 0x0FE8) && (address <= 0x0FEB)) - { - bankRAM(address & 0x0003); - } -} diff --git a/src/emucore/CartE7.hxx b/src/emucore/CartE7.hxx deleted file mode 100644 index 8fcfcd543..000000000 --- a/src/emucore/CartE7.hxx +++ /dev/null @@ -1,85 +0,0 @@ -//============================================================================ -// -// 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-2021 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 CARTRIDGEE7_HXX -#define CARTRIDGEE7_HXX - -class System; - -#include "bspf.hxx" -#include "Cart.hxx" -#ifdef DEBUGGER_SUPPORT - #include "CartE7Widget.hxx" -#endif -#include "CartMNetwork.hxx" - -/** - This is the cartridge class for 16K M-Network bankswitched games. - - @author Bradford W. Mott, Thomas Jentzsch -*/ -class CartridgeE7 : public CartridgeMNetwork -{ - 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) - */ - CartridgeE7(const ByteBuffer& image, size_t size, const string& md5, - const Settings& settings); - ~CartridgeE7() override = default; - - public: - /** - Get a descriptor for the device name (used in error checking). - - @return The name of the object - */ - string name() const override { return "CartridgeE7"; } - - #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 CartridgeE7Widget(boss, lfont, nfont, x, y, w, h, *this); - } - #endif - - private: - /** - Check hotspots and switch bank if triggered. - */ - void checkSwitchBank(uInt16 address) override; - - private: - // Following constructors and assignment operators not supported - CartridgeE7() = delete; - CartridgeE7(const CartridgeE7&) = delete; - CartridgeE7(CartridgeE7&&) = delete; - CartridgeE7& operator=(const CartridgeE7&) = delete; - CartridgeE7& operator=(CartridgeE7&&) = delete; -}; - -#endif diff --git a/src/emucore/CartE78K.cxx b/src/emucore/CartE78K.cxx deleted file mode 100644 index 2f514ba82..000000000 --- a/src/emucore/CartE78K.cxx +++ /dev/null @@ -1,41 +0,0 @@ -//============================================================================ -// -// 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-2021 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 "CartE78K.hxx" - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -CartridgeE78K::CartridgeE78K(const ByteBuffer& image, size_t size, - const string& md5, const Settings& settings) - : CartridgeMNetwork(image, size, md5, settings) -{ - initialize(image, size); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CartridgeE78K::checkSwitchBank(uInt16 address) -{ - // Switch banks if necessary - if((address >= 0x0FE4) && (address <= 0x0FE7)) - { - bank(address & 0x0003); - } - else if((address >= 0x0FE8) && (address <= 0x0FEB)) - { - bankRAM(address & 0x0003); - } -} diff --git a/src/emucore/CartE78K.hxx b/src/emucore/CartE78K.hxx deleted file mode 100644 index ac42960c2..000000000 --- a/src/emucore/CartE78K.hxx +++ /dev/null @@ -1,83 +0,0 @@ -//============================================================================ -// -// 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-2021 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 CARTRIDGE_E78K_HXX -#define CARTRIDGE_E78K_HXX - -#include "bspf.hxx" -#include "Cart.hxx" -#ifdef DEBUGGER_SUPPORT - #include "CartE78KWidget.hxx" -#endif -#include "CartMNetwork.hxx" - -/** - This is the cartridge class for 8K M-Network bankswitched games. - - @author Bradford W. Mott, Thomas Jentzsch -*/ -class CartridgeE78K : public CartridgeMNetwork -{ - 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) - */ - CartridgeE78K(const ByteBuffer& image, size_t size, const string& md5, - const Settings& settings); - ~CartridgeE78K() override = default; - - public: - /** - Get a descriptor for the device name (used in error checking). - - @return The name of the object - */ - string name() const override { return "CartridgeE78K"; } - - #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 CartridgeE78KWidget(boss, lfont, nfont, x, y, w, h, *this); - } - #endif - - private: - /** - Check hotspots and switch bank if triggered. - */ - void checkSwitchBank(uInt16 address) override; - - private: - // Following constructors and assignment operators not supported - CartridgeE78K() = delete; - CartridgeE78K(const CartridgeE78K&) = delete; - CartridgeE78K(CartridgeE78K&&) = delete; - CartridgeE78K& operator=(const CartridgeE78K&) = delete; - CartridgeE78K& operator=(CartridgeE78K&&) = delete; -}; - -#endif diff --git a/src/emucore/CartMNetwork.cxx b/src/emucore/CartMNetwork.cxx index f71aff1c9..b0295251d 100644 --- a/src/emucore/CartMNetwork.cxx +++ b/src/emucore/CartMNetwork.cxx @@ -24,6 +24,7 @@ CartridgeMNetwork::CartridgeMNetwork(const ByteBuffer& image, size_t size, : Cartridge(settings, md5), mySize{size} { + initialize(image, size); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -106,6 +107,24 @@ void CartridgeMNetwork::install(System& system) bank(startBank()); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void CartridgeMNetwork::checkSwitchBank(uInt16 address) +{ + // Switch banks if necessary + if(romBankCount() == 4 && (address >= 0x0FE4) && (address <= 0x0FE7)) + { + bank(address & 0x0003); + } + else if(romBankCount() == 8 && (address >= 0x0FE0) && (address <= 0x0FE7)) + { + bank(address & 0x0007); + } + else if((address >= 0x0FE8) && (address <= 0x0FEB)) + { + bankRAM(address & 0x0003); + } +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - uInt8 CartridgeMNetwork::peek(uInt16 address) { diff --git a/src/emucore/CartMNetwork.hxx b/src/emucore/CartMNetwork.hxx index 2951de335..e5b10b15c 100644 --- a/src/emucore/CartMNetwork.hxx +++ b/src/emucore/CartMNetwork.hxx @@ -22,6 +22,10 @@ #include "System.hxx" #include "bspf.hxx" #include "Cart.hxx" +#ifdef DEBUGGER_SUPPORT + #include "CartMNetworkWidget.hxx" +#endif + /** This is the abstract cartridge class for M-Network @@ -50,8 +54,8 @@ read port. You select which 256 byte block appears here by accessing 1FE8 to 1FEB. - This cart reports having 8 banks; 1 for each of the possible 7 - bank in the lower 2K area, and the last for RAM in the lower + This cart reports having 8 banks; one for each of the possible + 7 banks 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. @@ -61,8 +65,6 @@ class CartridgeMNetwork : public Cartridge { friend class CartridgeMNetworkWidget; - friend class CartridgeE7Widget; - friend class CartridgeE78KWidget; public: /** @@ -163,6 +165,25 @@ class CartridgeMNetwork : public Cartridge */ bool poke(uInt16 address, uInt8 value) override; + /** + Get a descriptor for the device name (used in error checking). + + @return The name of the object + */ + string name() const override { return "CartridgeE7"; } + + #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 CartridgeMNetworkWidget(boss, lfont, nfont, x, y, w, h, *this); + } + #endif + protected: /** Class initialization @@ -176,6 +197,11 @@ class CartridgeMNetwork : public Cartridge */ void bankRAM(uInt16 bank); + /** + Check hotspots and switch bank if triggered. + */ + void checkSwitchBank(uInt16 address); + // Size of a ROM or RAM bank static constexpr uInt32 BANK_SIZE = 0x800; // 2K @@ -190,11 +216,6 @@ class CartridgeMNetwork : public Cartridge */ uInt16 romSize() const; - /** - Check hotspots and switch bank if triggered. - */ - virtual void checkSwitchBank(uInt16 address) = 0; - void setAccess(uInt16 addrFrom, uInt16 size, uInt16 directOffset, uInt8* directData, uInt16 codeOffset, System::PageAccessType type, uInt16 addrMask = 0); diff --git a/src/windows/Stella.vcxproj b/src/windows/Stella.vcxproj index 918b927cf..23a07de54 100755 --- a/src/windows/Stella.vcxproj +++ b/src/windows/Stella.vcxproj @@ -624,12 +624,6 @@ true - - true - - - true - true @@ -758,7 +752,6 @@ - @@ -844,7 +837,6 @@ - @@ -1686,12 +1678,6 @@ true - - true - - - true - true @@ -1831,7 +1817,6 @@ - @@ -1939,7 +1924,6 @@ - diff --git a/src/windows/Stella.vcxproj.filters b/src/windows/Stella.vcxproj.filters index 773e9a088..821b7e800 100644 --- a/src/windows/Stella.vcxproj.filters +++ b/src/windows/Stella.vcxproj.filters @@ -153,9 +153,6 @@ Source Files\emucore - - Source Files\emucore - Source Files\emucore @@ -639,9 +636,6 @@ Source Files\debugger - - Source Files\debugger - Source Files\debugger @@ -861,15 +855,9 @@ Source Files\emucore - - Source Files\emucore - Source Files\debugger - - Source Files\debugger - Source Files\gui @@ -1196,9 +1184,6 @@ Header Files\emucore - - Header Files\emucore - Header Files\emucore @@ -1709,9 +1694,6 @@ Header Files\debugger - - Header Files\debugger - Header Files\debugger @@ -1976,15 +1958,9 @@ Header Files\emucore - - Header Files\emucore - Header Files\debugger - - Header Files\debugger - Header Files\gui diff --git a/test/roms/bankswitching/E7/Bump 'n' Jump (1988) (Telegames) (7045 A015) (PAL).bin b/test/roms/bankswitching/E7/Bump 'n' Jump (1988) (Telegames) (7045 A015) (PAL).bin deleted file mode 100644 index 20cfc1551cc224f718a08204397ad77209ec2c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 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 diff --git a/test/roms/bankswitching/E7/Elite Demo v1.0 (NTSC).bin b/test/roms/bankswitching/E7/Elite Demo v1.0 (NTSC).bin new file mode 100644 index 0000000000000000000000000000000000000000..366ca9fd6a4c86b5dda8532264ba53f9a90803d1 GIT binary patch literal 16384 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 Sx#1^kpYOTUgJb89o&RsWh7EoI literal 0 HcmV?d00001