mirror of https://github.com/stella-emu/stella.git
Added TV Boy bankswitching
This commit is contained in:
parent
4466f470a3
commit
9026598d9e
|
@ -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();
|
||||
}
|
|
@ -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
|
|
@ -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 \
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
|
@ -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 \
|
||||
|
|
Loading…
Reference in New Issue