From 9026598d9e787433d27c8f4eeefcfa43d3e9d1ac Mon Sep 17 00:00:00 2001 From: thrust26 Date: Sun, 24 May 2020 23:50:36 +0200 Subject: [PATCH] Added TV Boy bankswitching --- src/debugger/gui/CartTVBoyWidget.cxx | 41 ++++++++++ src/debugger/gui/CartTVBoyWidget.hxx | 48 ++++++++++++ src/debugger/gui/module.mk | 1 + src/emucore/CartTVBoy.cxx | 87 +++++++++++++++++++++ src/emucore/CartTVBoy.hxx | 113 +++++++++++++++++++++++++++ src/emucore/module.mk | 1 + 6 files changed, 291 insertions(+) create mode 100644 src/debugger/gui/CartTVBoyWidget.cxx create mode 100644 src/debugger/gui/CartTVBoyWidget.hxx create mode 100644 src/emucore/CartTVBoy.cxx create mode 100644 src/emucore/CartTVBoy.hxx diff --git a/src/debugger/gui/CartTVBoyWidget.cxx b/src/debugger/gui/CartTVBoyWidget.cxx new file mode 100644 index 000000000..43fff60f7 --- /dev/null +++ b/src/debugger/gui/CartTVBoyWidget.cxx @@ -0,0 +1,41 @@ +//============================================================================ +// +// 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-2020 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 "CartTVBoy.hxx" +#include "CartTVBoyWidget.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +CartridgeTVBoyWidget::CartridgeTVBoyWidget( + GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, + int x, int y, int w, int h, CartridgeTVBoy& cart) + : CartridgeEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart) +{ + initialize(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +string CartridgeTVBoyWidget::description() +{ + ostringstream info; + + info << "TV Boy, " << myCart.romBankCount() << " 4K banks\n" + << "Hotspots are from $" << Common::Base::HEX2 << 0x1800 << " to $" + << Common::Base::HEX2 << (0x1800 + myCart.romBankCount() - 1) << "\n"; + info << "Startup bank = #" << std::dec << myCart.startBank(); + + return info.str(); +} diff --git a/src/debugger/gui/CartTVBoyWidget.hxx b/src/debugger/gui/CartTVBoyWidget.hxx new file mode 100644 index 000000000..7303750a7 --- /dev/null +++ b/src/debugger/gui/CartTVBoyWidget.hxx @@ -0,0 +1,48 @@ +//============================================================================ +// +// 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-2020 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 CARTRIDGETVBOY_WIDGET_HXX +#define CARTRIDGETVBOY_WIDGET_HXX + +class CartridgeTVBoy; + +#include "CartEnhancedWidget.hxx" + +class CartridgeTVBoyWidget : public CartridgeEnhancedWidget +{ +public: + CartridgeTVBoyWidget(GuiObject* boss, const GUI::Font& lfont, + const GUI::Font& nfont, + int x, int y, int w, int h, + CartridgeTVBoy& cart); + virtual ~CartridgeTVBoyWidget() = default; + +private: + string manufacturer() override { return "Akor"; } + + string description() override; + +private: + // Following constructors and assignment operators not supported + CartridgeTVBoyWidget() = delete; + CartridgeTVBoyWidget(const CartridgeTVBoyWidget&) = delete; + CartridgeTVBoyWidget(CartridgeTVBoyWidget&&) = delete; + CartridgeTVBoyWidget& operator=(const CartridgeTVBoyWidget&) = delete; + CartridgeTVBoyWidget& operator=(CartridgeTVBoyWidget&&) = delete; +}; + +#endif diff --git a/src/debugger/gui/module.mk b/src/debugger/gui/module.mk index 8f19ce5fa..d992ae85a 100644 --- a/src/debugger/gui/module.mk +++ b/src/debugger/gui/module.mk @@ -48,6 +48,7 @@ MODULE_OBJS := \ src/debugger/gui/CartMDMWidget.o \ src/debugger/gui/CartRamWidget.o \ src/debugger/gui/CartSBWidget.o \ + src/debugger/gui/CartTVBoyWidget.o \ src/debugger/gui/CartUAWidget.o \ src/debugger/gui/CartWDWidget.o \ src/debugger/gui/CartX07Widget.o \ diff --git a/src/emucore/CartTVBoy.cxx b/src/emucore/CartTVBoy.cxx new file mode 100644 index 000000000..8ce3c4549 --- /dev/null +++ b/src/emucore/CartTVBoy.cxx @@ -0,0 +1,87 @@ +//============================================================================ +// +// 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-2020 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 "CartTVBoy.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +CartridgeTVBoy::CartridgeTVBoy(const ByteBuffer& image, size_t size, + const string& md5, const Settings& settings) + : CartridgeEnhanced(image, size, md5, settings) +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeTVBoy::checkSwitchBank(uInt16 address, uInt8) +{ + // Switch banks if necessary + if((address & ADDR_MASK) >= 0x1800 && (address & ADDR_MASK) <= 0x187F) + { + bank(address & (romBankCount() - 1)); + return true; + } + return false; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeTVBoy::bank(uInt16 bank) +{ + if(myBankingDisabled) return false; + + bool banked = CartridgeEnhanced::bank(bank); + + // Any bankswitching locks further bankswitching, we check for bank 0 + // to avoid locking on cart init. + if (banked && bank != 0) + myBankingDisabled = true; + + return banked; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeTVBoy::save(Serializer& out) const +{ + CartridgeEnhanced::save(out); + try + { + out.putBool(myBankingDisabled); + } + catch(...) + { + cerr << "ERROR: CartridgeTVBoy::save" << endl; + return false; + } + + return true; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeTVBoy::load(Serializer& in) +{ + CartridgeEnhanced::load(in); + try + { + myBankingDisabled = in.getBool(); + } + catch(...) + { + cerr << "ERROR: CartridgeTVBoy::load" << endl; + return false; + } + + return true; +} diff --git a/src/emucore/CartTVBoy.hxx b/src/emucore/CartTVBoy.hxx new file mode 100644 index 000000000..670a358ff --- /dev/null +++ b/src/emucore/CartTVBoy.hxx @@ -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-2020 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 CARTRIDGETVBOY_HXX +#define CARTRIDGETVBOY_HXX + +#include "bspf.hxx" +#include "CartEnhanced.hxx" +#include "System.hxx" +#ifdef DEBUGGER_SUPPORT +#include "CartTVBoyWidget.hxx" +#endif + +/** + Cartridge class used for TV Boy + There are 128 4K banks, accessing $F800..$F87F selects bank and locks any + further bankswitching. + + @author Thomas Jentzsch +*/ +class CartridgeTVBoy : public CartridgeEnhanced +{ + friend class CartridgeMDMWidget; + + 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) + */ + CartridgeTVBoy(const ByteBuffer& image, size_t size, const string& md5, + const Settings& settings); + virtual ~CartridgeTVBoy() = default; + + public: + /** + Install pages for the specified bank in the system. + + @param bank The bank that should be installed in the system + */ + bool bank(uInt16 bank) override; + + /** + Save the current state of this cart to the given Serializer. + + @param out The Serializer object to use + @return False on any errors, else true + */ + bool save(Serializer& out) const override; + + /** + Load the current state of this cart from the given Serializer. + + @param in The Serializer object to use + @return False on any errors, else true + */ + bool load(Serializer& in) override; + + /** + Get a descriptor for the device name (used in error checking). + + @return The name of the object + */ + string name() const override { return "CartridgeTVBoy"; } + + #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 CartridgeTVBoyWidget(boss, lfont, nfont, x, y, w, h, *this); + } + #endif + + private: + bool checkSwitchBank(uInt16 address, uInt8 value = 0) override; + + uInt16 hotspot() const override { return 0x1800; } + + private: + // Indicates whether banking has been disabled due to a bankswitch + bool myBankingDisabled{false}; + + private: + // Following constructors and assignment operators not supported + CartridgeTVBoy() = delete; + CartridgeTVBoy(const CartridgeTVBoy&) = delete; + CartridgeTVBoy(CartridgeTVBoy&&) = delete; + CartridgeTVBoy& operator=(const CartridgeTVBoy&) = delete; + CartridgeTVBoy& operator=(CartridgeTVBoy&&) = delete; +}; + +#endif diff --git a/src/emucore/module.mk b/src/emucore/module.mk index e0dd4f96f..cccda359c 100644 --- a/src/emucore/module.mk +++ b/src/emucore/module.mk @@ -47,6 +47,7 @@ MODULE_OBJS := \ src/emucore/CartFE.o \ src/emucore/CartMDM.o \ src/emucore/CartSB.o \ + src/emucore/CartTVBoy.o \ src/emucore/CartUA.o \ src/emucore/CartWD.o \ src/emucore/CartX07.o \