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/CartMDMWidget.o \
|
||||||
src/debugger/gui/CartRamWidget.o \
|
src/debugger/gui/CartRamWidget.o \
|
||||||
src/debugger/gui/CartSBWidget.o \
|
src/debugger/gui/CartSBWidget.o \
|
||||||
|
src/debugger/gui/CartTVBoyWidget.o \
|
||||||
src/debugger/gui/CartUAWidget.o \
|
src/debugger/gui/CartUAWidget.o \
|
||||||
src/debugger/gui/CartWDWidget.o \
|
src/debugger/gui/CartWDWidget.o \
|
||||||
src/debugger/gui/CartX07Widget.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/CartFE.o \
|
||||||
src/emucore/CartMDM.o \
|
src/emucore/CartMDM.o \
|
||||||
src/emucore/CartSB.o \
|
src/emucore/CartSB.o \
|
||||||
|
src/emucore/CartTVBoy.o \
|
||||||
src/emucore/CartUA.o \
|
src/emucore/CartUA.o \
|
||||||
src/emucore/CartWD.o \
|
src/emucore/CartWD.o \
|
||||||
src/emucore/CartX07.o \
|
src/emucore/CartX07.o \
|
||||||
|
|
Loading…
Reference in New Issue