Added TV Boy bankswitching

This commit is contained in:
thrust26 2020-05-24 23:50:36 +02:00
parent 4466f470a3
commit 9026598d9e
6 changed files with 291 additions and 0 deletions

View File

@ -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();
}

View File

@ -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

View File

@ -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 \

87
src/emucore/CartTVBoy.cxx Normal file
View File

@ -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;
}

113
src/emucore/CartTVBoy.hxx Normal file
View File

@ -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

View File

@ -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 \