mirror of https://github.com/stella-emu/stella.git
add 3EX bankswitching type (addresses #619) (TODO: debugger details)
This commit is contained in:
parent
e502be6048
commit
4a6e14d306
|
@ -169,7 +169,7 @@ string Cartridge3EWidget::bankState()
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt32 Cartridge3EWidget::internalRamSize()
|
uInt32 Cartridge3EWidget::internalRamSize()
|
||||||
{
|
{
|
||||||
return 32*1024;
|
return uInt32(myCart.myRamSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -296,7 +296,7 @@ void CartridgeEnhancedWidget::handleCommand(CommandSender* sender,
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
uInt32 CartridgeEnhancedWidget::internalRamSize()
|
uInt32 CartridgeEnhancedWidget::internalRamSize()
|
||||||
{
|
{
|
||||||
return myCart.myRamSize;
|
return uInt32(myCart.myRamSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
|
|
@ -104,7 +104,8 @@ Bankswitch::BSList = {{
|
||||||
{ "64IN1" , "64IN1 Multicart (128/256K)" },
|
{ "64IN1" , "64IN1 Multicart (128/256K)" },
|
||||||
{ "128IN1" , "128IN1 Multicart (256/512K)" },
|
{ "128IN1" , "128IN1 Multicart (256/512K)" },
|
||||||
{ "2K" , "2K (32-2048 bytes Atari)" },
|
{ "2K" , "2K (32-2048 bytes Atari)" },
|
||||||
{ "3E" , "3E (32K Tigervision)" },
|
{ "3E" , "3E (Tigervision, 32K RAM)" },
|
||||||
|
{ "3EX" , "3EX (Tigervision, 256K RAM)" },
|
||||||
{ "3E+" , "3E+ (TJ modified 3E)" },
|
{ "3E+" , "3E+ (TJ modified 3E)" },
|
||||||
{ "3F" , "3F (512K Tigervision)" },
|
{ "3F" , "3F (512K Tigervision)" },
|
||||||
{ "4A50" , "4A50 (64K 4A50 + RAM)" },
|
{ "4A50" , "4A50 (64K 4A50 + RAM)" },
|
||||||
|
@ -178,6 +179,7 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
|
||||||
{ "128N1" , Bankswitch::Type::_128IN1 },
|
{ "128N1" , Bankswitch::Type::_128IN1 },
|
||||||
{ "2K" , Bankswitch::Type::_2K },
|
{ "2K" , Bankswitch::Type::_2K },
|
||||||
{ "3E" , Bankswitch::Type::_3E },
|
{ "3E" , Bankswitch::Type::_3E },
|
||||||
|
{ "3EX" , Bankswitch::Type::_3EX },
|
||||||
{ "3EP" , Bankswitch::Type::_3EP },
|
{ "3EP" , Bankswitch::Type::_3EP },
|
||||||
{ "3E+" , Bankswitch::Type::_3EP },
|
{ "3E+" , Bankswitch::Type::_3EP },
|
||||||
{ "3F" , Bankswitch::Type::_3F },
|
{ "3F" , Bankswitch::Type::_3F },
|
||||||
|
@ -245,6 +247,7 @@ Bankswitch::NameToTypeMap Bankswitch::ourNameToTypes = {
|
||||||
{ "2K" , Bankswitch::Type::_2K },
|
{ "2K" , Bankswitch::Type::_2K },
|
||||||
{ "3E" , Bankswitch::Type::_3E },
|
{ "3E" , Bankswitch::Type::_3E },
|
||||||
{ "3E+" , Bankswitch::Type::_3EP },
|
{ "3E+" , Bankswitch::Type::_3EP },
|
||||||
|
{ "3EX" , Bankswitch::Type::_3EX },
|
||||||
{ "3F" , Bankswitch::Type::_3F },
|
{ "3F" , Bankswitch::Type::_3F },
|
||||||
{ "4A50" , Bankswitch::Type::_4A50 },
|
{ "4A50" , Bankswitch::Type::_4A50 },
|
||||||
{ "4K" , Bankswitch::Type::_4K },
|
{ "4K" , Bankswitch::Type::_4K },
|
||||||
|
|
|
@ -39,13 +39,13 @@ class Bankswitch
|
||||||
// Currently supported bankswitch schemes
|
// Currently supported bankswitch schemes
|
||||||
enum class Type {
|
enum class Type {
|
||||||
_AUTO, _0840, _2IN1, _4IN1, _8IN1, _16IN1, _32IN1,
|
_AUTO, _0840, _2IN1, _4IN1, _8IN1, _16IN1, _32IN1,
|
||||||
_64IN1, _128IN1, _2K, _3E, _3EP, _3F, _4A50,
|
_64IN1, _128IN1, _2K, _3E, _3EX, _3EP, _3F,
|
||||||
_4K, _4KSC, _AR, _BF, _BFSC, _BUS, _CDF,
|
_4A50, _4K, _4KSC, _AR, _BF, _BFSC, _BUS,
|
||||||
_CM, _CTY, _CV, _DF, _DFSC, _DPC, _DPCP,
|
_CDF, _CM, _CTY, _CV, _DF, _DFSC, _DPC,
|
||||||
_E0, _E7, _E78K, _EF, _EFSC, _F0, _F4,
|
_DPCP, _E0, _E7, _E78K, _EF, _EFSC, _F0,
|
||||||
_F4SC, _F6, _F6SC, _F8, _F8SC, _FA, _FA2,
|
_F4, _F4SC, _F6, _F6SC, _F8, _F8SC, _FA,
|
||||||
_FC, _FE, _MDM, _SB, _UA, _UASW, _WD,
|
_FA2, _FC, _FE, _MDM, _SB, _UA, _UASW,
|
||||||
_WDSW, _X07,
|
_WD, _WDSW, _X07,
|
||||||
#ifdef CUSTOM_ARM
|
#ifdef CUSTOM_ARM
|
||||||
_CUSTOM,
|
_CUSTOM,
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -116,15 +116,15 @@ class Cartridge3E : public CartridgeEnhanced
|
||||||
private:
|
private:
|
||||||
bool checkSwitchBank(uInt16 address, uInt8 value) override;
|
bool checkSwitchBank(uInt16 address, uInt8 value) override;
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
// log(ROM bank segment size) / log(2)
|
// log(ROM bank segment size) / log(2)
|
||||||
static constexpr uInt16 BANK_SHIFT = 11; // = 2K = 0x0800
|
static constexpr uInt16 BANK_SHIFT = 11; // = 2K = 0x0800
|
||||||
|
|
||||||
// The size of extra RAM in ROM address space
|
// The number of RAM banks
|
||||||
static constexpr uInt16 RAM_BANKS = 32;
|
static constexpr uInt16 RAM_BANKS = 32;
|
||||||
|
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = RAM_BANKS << (BANK_SHIFT - 1); // = 32K = 0x4000;
|
static constexpr size_t RAM_SIZE = RAM_BANKS << (BANK_SHIFT - 1); // = 32K = 0x8000;
|
||||||
|
|
||||||
// Write port for extra RAM is at high address
|
// Write port for extra RAM is at high address
|
||||||
static constexpr bool RAM_HIGH_WP = true;
|
static constexpr bool RAM_HIGH_WP = true;
|
||||||
|
|
|
@ -165,7 +165,7 @@ class Cartridge3EPlus: public CartridgeEnhanced
|
||||||
static constexpr uInt16 RAM_BANKS = 64;
|
static constexpr uInt16 RAM_BANKS = 64;
|
||||||
|
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = RAM_BANKS << (BANK_SHIFT - 1); // = 32K = 0x4000;
|
static constexpr size_t RAM_SIZE = RAM_BANKS << (BANK_SHIFT - 1); // = 32K = 0x4000;
|
||||||
|
|
||||||
// Write port for extra RAM is at high address
|
// Write port for extra RAM is at high address
|
||||||
static constexpr bool RAM_HIGH_WP = true;
|
static constexpr bool RAM_HIGH_WP = true;
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
//============================================================================
|
||||||
|
//
|
||||||
|
// 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 "Cart3EX.hxx"
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
Cartridge3EX::Cartridge3EX(const ByteBuffer& image, size_t size,
|
||||||
|
const string& md5, const Settings& settings)
|
||||||
|
: Cartridge3E(image, size, md5, settings)
|
||||||
|
{
|
||||||
|
myRamSize = RAM_SIZE;
|
||||||
|
myRamBankCount = RAM_BANKS;
|
||||||
|
}
|
|
@ -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.
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
#ifndef CARTRIDGE3EX_HXX
|
||||||
|
#define CARTRIDGE3EX_HXX
|
||||||
|
|
||||||
|
class System;
|
||||||
|
|
||||||
|
#include "Cart3E.hxx"
|
||||||
|
#ifdef DEBUGGER_SUPPORT
|
||||||
|
//#include "Cart3EXWidget.hxx"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
This is an enhanced version of 3E which supports up to 256KB RAM.
|
||||||
|
|
||||||
|
@author Thomas Jentzsch
|
||||||
|
*/
|
||||||
|
|
||||||
|
class Cartridge3EX : public Cartridge3E
|
||||||
|
{
|
||||||
|
//friend class Cartridge3EXWidget;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
Create a new cartridge using the specified image and size
|
||||||
|
|
||||||
|
@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)
|
||||||
|
*/
|
||||||
|
Cartridge3EX(const ByteBuffer& image, size_t size, const string& md5,
|
||||||
|
const Settings& settings);
|
||||||
|
virtual ~Cartridge3EX() = default;
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
Get a descriptor for the device name (used in error checking).
|
||||||
|
|
||||||
|
@return The name of the object
|
||||||
|
*/
|
||||||
|
string name() const override { return "Cartridge3EX"; }
|
||||||
|
|
||||||
|
#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 Cartridge3EXWidget(boss, lfont, nfont, x, y, w, h, *this);
|
||||||
|
//}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
// The number of RAM banks
|
||||||
|
static constexpr uInt16 RAM_BANKS = 256;
|
||||||
|
|
||||||
|
// RAM size
|
||||||
|
static constexpr size_t RAM_SIZE = RAM_BANKS << (BANK_SHIFT - 1); // = 256K = 0x40000;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Following constructors and assignment operators not supported
|
||||||
|
Cartridge3EX() = delete;
|
||||||
|
Cartridge3EX(const Cartridge3EX&) = delete;
|
||||||
|
Cartridge3EX(Cartridge3EX&&) = delete;
|
||||||
|
Cartridge3EX& operator=(const Cartridge3EX&) = delete;
|
||||||
|
Cartridge3EX& operator=(Cartridge3EX&&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -72,7 +72,7 @@ class Cartridge4KSC : public Cartridge4K
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr size_t RAM_SIZE = 0x80;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -74,7 +74,7 @@ class CartridgeBFSC : public CartridgeBF
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr uInt32 RAM_SIZE = 0x80;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -89,7 +89,7 @@ class CartridgeCV : public CartridgeEnhanced
|
||||||
static constexpr uInt16 BANK_SHIFT = 11; // 2K
|
static constexpr uInt16 BANK_SHIFT = 11; // 2K
|
||||||
|
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x400; // 1K
|
static constexpr uInt32 RAM_SIZE = 0x400; // 1K
|
||||||
|
|
||||||
// Write port for extra RAM is at high address
|
// Write port for extra RAM is at high address
|
||||||
static constexpr bool RAM_HIGH_WP = true;
|
static constexpr bool RAM_HIGH_WP = true;
|
||||||
|
|
|
@ -72,7 +72,7 @@ class CartridgeDFSC : public CartridgeDF
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr size_t RAM_SIZE = 0x80;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "Cart0840.hxx"
|
#include "Cart0840.hxx"
|
||||||
#include "Cart2K.hxx"
|
#include "Cart2K.hxx"
|
||||||
#include "Cart3E.hxx"
|
#include "Cart3E.hxx"
|
||||||
|
#include "Cart3EX.hxx"
|
||||||
#include "Cart3EPlus.hxx"
|
#include "Cart3EPlus.hxx"
|
||||||
#include "Cart3F.hxx"
|
#include "Cart3F.hxx"
|
||||||
#include "Cart4A50.hxx"
|
#include "Cart4A50.hxx"
|
||||||
|
@ -250,6 +251,8 @@ CartDetector::createFromImage(const ByteBuffer& image, size_t size, Bankswitch::
|
||||||
return make_unique<Cartridge2K>(image, size, md5, settings);
|
return make_unique<Cartridge2K>(image, size, md5, settings);
|
||||||
case Bankswitch::Type::_3E:
|
case Bankswitch::Type::_3E:
|
||||||
return make_unique<Cartridge3E>(image, size, md5, settings);
|
return make_unique<Cartridge3E>(image, size, md5, settings);
|
||||||
|
case Bankswitch::Type::_3EX:
|
||||||
|
return make_unique<Cartridge3EX>(image, size, md5, settings);
|
||||||
case Bankswitch::Type::_3EP:
|
case Bankswitch::Type::_3EP:
|
||||||
return make_unique<Cartridge3EPlus>(image, size, md5, settings);
|
return make_unique<Cartridge3EPlus>(image, size, md5, settings);
|
||||||
case Bankswitch::Type::_3F:
|
case Bankswitch::Type::_3F:
|
||||||
|
@ -380,6 +383,8 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
type = Bankswitch::Type::_4K;
|
type = Bankswitch::Type::_4K;
|
||||||
else if(isProbablyE0(image, size))
|
else if(isProbablyE0(image, size))
|
||||||
type = Bankswitch::Type::_E0;
|
type = Bankswitch::Type::_E0;
|
||||||
|
else if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
else if(isProbably3E(image, size))
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
else if(isProbably3F(image, size))
|
else if(isProbably3F(image, size))
|
||||||
|
@ -419,6 +424,8 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
type = Bankswitch::Type::_E7;
|
type = Bankswitch::Type::_E7;
|
||||||
else if (isProbablyFC(image, size))
|
else if (isProbablyFC(image, size))
|
||||||
type = Bankswitch::Type::_FC;
|
type = Bankswitch::Type::_FC;
|
||||||
|
else if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
else if(isProbably3E(image, size))
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
/* no known 16K 3F ROMS
|
/* no known 16K 3F ROMS
|
||||||
|
@ -445,6 +452,8 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
type = Bankswitch::Type::_CTY;
|
type = Bankswitch::Type::_CTY;
|
||||||
else if(isProbablySC(image, size))
|
else if(isProbablySC(image, size))
|
||||||
type = Bankswitch::Type::_F4SC;
|
type = Bankswitch::Type::_F4SC;
|
||||||
|
else if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
else if(isProbably3E(image, size))
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
else if(isProbably3F(image, size))
|
else if(isProbably3F(image, size))
|
||||||
|
@ -471,7 +480,9 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
}
|
}
|
||||||
else if(size == 64_KB)
|
else if(size == 64_KB)
|
||||||
{
|
{
|
||||||
if(isProbably3E(image, size))
|
if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
else if(isProbably3F(image, size))
|
else if(isProbably3F(image, size))
|
||||||
type = Bankswitch::Type::_3F;
|
type = Bankswitch::Type::_3F;
|
||||||
|
@ -486,7 +497,9 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
}
|
}
|
||||||
else if(size == 128_KB)
|
else if(size == 128_KB)
|
||||||
{
|
{
|
||||||
if(isProbably3E(image, size))
|
if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
else if(isProbablyDF(image, size, type))
|
else if(isProbablyDF(image, size, type))
|
||||||
; // type has been set directly in the function
|
; // type has been set directly in the function
|
||||||
|
@ -499,7 +512,9 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
}
|
}
|
||||||
else if(size == 256_KB)
|
else if(size == 256_KB)
|
||||||
{
|
{
|
||||||
if(isProbably3E(image, size))
|
if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
else if(isProbablyBF(image, size, type))
|
else if(isProbablyBF(image, size, type))
|
||||||
; // type has been set directly in the function
|
; // type has been set directly in the function
|
||||||
|
@ -510,7 +525,9 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
||||||
}
|
}
|
||||||
else // what else can we do?
|
else // what else can we do?
|
||||||
{
|
{
|
||||||
if(isProbably3E(image, size))
|
if(isProbably3EX(image, size))
|
||||||
|
type = Bankswitch::Type::_3EX;
|
||||||
|
else if(isProbably3E(image, size))
|
||||||
type = Bankswitch::Type::_3E;
|
type = Bankswitch::Type::_3E;
|
||||||
else if(isProbably3F(image, size))
|
else if(isProbably3F(image, size))
|
||||||
type = Bankswitch::Type::_3F;
|
type = Bankswitch::Type::_3F;
|
||||||
|
@ -632,6 +649,14 @@ bool CartDetector::isProbably3E(const ByteBuffer& image, size_t size)
|
||||||
&& searchForBytes(image.get(), size, signature2, 2, 2);
|
&& searchForBytes(image.get(), size, signature2, 2, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
|
bool CartDetector::isProbably3EX(const ByteBuffer& image, size_t size)
|
||||||
|
{
|
||||||
|
// 3EX cart have at least 2 occurrences of the string "3EX"
|
||||||
|
uInt8 _3EX[] = { '3', 'E', 'X'};
|
||||||
|
return searchForBytes(image.get(), size, _3EX, 3, 2);
|
||||||
|
}
|
||||||
|
|
||||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||||
bool CartDetector::isProbably3EPlus(const ByteBuffer& image, size_t size)
|
bool CartDetector::isProbably3EPlus(const ByteBuffer& image, size_t size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -130,6 +130,11 @@ class CartDetector
|
||||||
*/
|
*/
|
||||||
static bool isProbably3E(const ByteBuffer& image, size_t size);
|
static bool isProbably3E(const ByteBuffer& image, size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns true if the image is probably a 3EX bankswitching cartridge
|
||||||
|
*/
|
||||||
|
static bool isProbably3EX(const ByteBuffer& image, size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns true if the image is probably a 3E+ bankswitching cartridge
|
Returns true if the image is probably a 3E+ bankswitching cartridge
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -76,7 +76,7 @@ class CartridgeEFSC : public CartridgeEF
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr size_t RAM_SIZE = 0x80;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -35,13 +35,13 @@ CartridgeEnhanced::CartridgeEnhanced(const ByteBuffer& image, size_t size,
|
||||||
void CartridgeEnhanced::install(System& system)
|
void CartridgeEnhanced::install(System& system)
|
||||||
{
|
{
|
||||||
// limit banked RAM size to the size of one RAM bank
|
// limit banked RAM size to the size of one RAM bank
|
||||||
uInt16 ramSize = myRamBankCount > 0 ? 1 << (myBankShift - 1) : myRamSize;
|
uInt32 ramSize = myRamBankCount > 0 ? 1 << (myBankShift - 1) : uInt32(myRamSize);
|
||||||
|
|
||||||
// calculate bank switching and RAM sizes and masks
|
// calculate bank switching and RAM sizes and masks
|
||||||
myBankSize = 1 << myBankShift; // e.g. = 2 ^ 12 = 4K = 0x1000
|
myBankSize = 1 << myBankShift; // e.g. = 2 ^ 12 = 4K = 0x1000
|
||||||
myBankMask = myBankSize - 1; // e.g. = 0x0FFF
|
myBankMask = myBankSize - 1; // e.g. = 0x0FFF
|
||||||
myBankSegs = 1 << (MAX_BANK_SHIFT - myBankShift); // e.g. = 1
|
myBankSegs = 1 << (MAX_BANK_SHIFT - myBankShift); // e.g. = 1
|
||||||
myRomOffset = myRamBankCount > 0 ? 0 : myRamSize * 2;
|
myRomOffset = myRamBankCount > 0 ? 0 : uInt32(myRamSize) * 2;
|
||||||
myRamMask = ramSize - 1; // e.g. = 0xFFFF (doesn't matter for RAM size 0)
|
myRamMask = ramSize - 1; // e.g. = 0xFFFF (doesn't matter for RAM size 0)
|
||||||
myWriteOffset = myRamWpHigh ? ramSize : 0; // e.g. = 0x0000
|
myWriteOffset = myRamWpHigh ? ramSize : 0; // e.g. = 0x0000
|
||||||
myReadOffset = myRamWpHigh ? 0 : ramSize; // e.g. = 0x0080
|
myReadOffset = myRamWpHigh ? 0 : ramSize; // e.g. = 0x0080
|
||||||
|
|
|
@ -183,7 +183,7 @@ class CartridgeEnhanced : public Cartridge
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// The extra RAM size
|
// The extra RAM size
|
||||||
uInt16 myRamSize{RAM_SIZE}; // default 0
|
size_t myRamSize{RAM_SIZE}; // default 0
|
||||||
|
|
||||||
// The number of RAM banks
|
// The number of RAM banks
|
||||||
uInt16 myRamBankCount{RAM_BANKS}; // default 0
|
uInt16 myRamBankCount{RAM_BANKS}; // default 0
|
||||||
|
@ -246,9 +246,9 @@ class CartridgeEnhanced : public Cartridge
|
||||||
static constexpr uInt16 BANK_SHIFT = 12; // default = 4K
|
static constexpr uInt16 BANK_SHIFT = 12; // default = 4K
|
||||||
|
|
||||||
// The size of extra RAM in ROM address space
|
// The size of extra RAM in ROM address space
|
||||||
static constexpr uInt16 RAM_SIZE = 0; // default = none
|
static constexpr size_t RAM_SIZE = 0; // default = none
|
||||||
|
|
||||||
// The size of extra RAM in ROM address space
|
// The number of RAM banks
|
||||||
static constexpr uInt16 RAM_BANKS = 0;
|
static constexpr uInt16 RAM_BANKS = 0;
|
||||||
|
|
||||||
// Write port for extra RAM is at low address by default
|
// Write port for extra RAM is at low address by default
|
||||||
|
|
|
@ -69,7 +69,7 @@ class CartridgeF4SC : public CartridgeF4
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr size_t RAM_SIZE = 0x80;
|
||||||
|
|
||||||
// RAM mask
|
// RAM mask
|
||||||
static constexpr uInt16 RAM_MASK = RAM_SIZE - 1;
|
static constexpr uInt16 RAM_MASK = RAM_SIZE - 1;
|
||||||
|
|
|
@ -69,7 +69,7 @@ class CartridgeF6SC : public CartridgeF6
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr size_t RAM_SIZE = 0x80;
|
||||||
|
|
||||||
// RAM mask
|
// RAM mask
|
||||||
static constexpr uInt16 RAM_MASK = RAM_SIZE - 1;
|
static constexpr uInt16 RAM_MASK = RAM_SIZE - 1;
|
||||||
|
|
|
@ -69,7 +69,7 @@ class CartridgeF8SC : public CartridgeF8
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x80;
|
static constexpr size_t RAM_SIZE = 0x80;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -79,7 +79,7 @@ class CartridgeFA : public CartridgeEnhanced
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x100;
|
static constexpr size_t RAM_SIZE = 0x100;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Following constructors and assignment operators not supported
|
// Following constructors and assignment operators not supported
|
||||||
|
|
|
@ -176,7 +176,7 @@ class CartridgeWD : public CartridgeEnhanced
|
||||||
static constexpr uInt16 BANK_SHIFT = 10; // = 1K = 0x0400
|
static constexpr uInt16 BANK_SHIFT = 10; // = 1K = 0x0400
|
||||||
|
|
||||||
// RAM size
|
// RAM size
|
||||||
static constexpr uInt16 RAM_SIZE = 0x40;
|
static constexpr size_t RAM_SIZE = 0x40;
|
||||||
|
|
||||||
// Write port for extra RAM is at low address by default
|
// Write port for extra RAM is at low address by default
|
||||||
static constexpr bool RAM_HIGH_WP = true;
|
static constexpr bool RAM_HIGH_WP = true;
|
||||||
|
|
|
@ -11,6 +11,7 @@ MODULE_OBJS := \
|
||||||
src/emucore/Cart2K.o \
|
src/emucore/Cart2K.o \
|
||||||
src/emucore/Cart3E.o \
|
src/emucore/Cart3E.o \
|
||||||
src/emucore/Cart3EPlus.o \
|
src/emucore/Cart3EPlus.o \
|
||||||
|
src/emucore/Cart3EX.o \
|
||||||
src/emucore/Cart3F.o \
|
src/emucore/Cart3F.o \
|
||||||
src/emucore/Cart4A50.o \
|
src/emucore/Cart4A50.o \
|
||||||
src/emucore/Cart4K.o \
|
src/emucore/Cart4K.o \
|
||||||
|
|
|
@ -711,6 +711,7 @@
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\emucore\Bankswitch.cxx" />
|
<ClCompile Include="..\emucore\Bankswitch.cxx" />
|
||||||
<ClCompile Include="..\emucore\Cart3EPlus.cxx" />
|
<ClCompile Include="..\emucore\Cart3EPlus.cxx" />
|
||||||
|
<ClCompile Include="..\emucore\Cart3EX.cxx" />
|
||||||
<ClCompile Include="..\emucore\Cart4KSC.cxx" />
|
<ClCompile Include="..\emucore\Cart4KSC.cxx" />
|
||||||
<ClCompile Include="..\emucore\CartEnhanced.cxx" />
|
<ClCompile Include="..\emucore\CartEnhanced.cxx" />
|
||||||
<ClCompile Include="..\emucore\CartBF.cxx" />
|
<ClCompile Include="..\emucore\CartBF.cxx" />
|
||||||
|
@ -1727,6 +1728,7 @@
|
||||||
<ClInclude Include="..\emucore\Bankswitch.hxx" />
|
<ClInclude Include="..\emucore\Bankswitch.hxx" />
|
||||||
<ClInclude Include="..\emucore\BSType.hxx" />
|
<ClInclude Include="..\emucore\BSType.hxx" />
|
||||||
<ClInclude Include="..\emucore\Cart3EPlus.hxx" />
|
<ClInclude Include="..\emucore\Cart3EPlus.hxx" />
|
||||||
|
<ClInclude Include="..\emucore\Cart3EX.hxx" />
|
||||||
<ClInclude Include="..\emucore\Cart4KSC.hxx" />
|
<ClInclude Include="..\emucore\Cart4KSC.hxx" />
|
||||||
<ClInclude Include="..\emucore\CartEnhanced.hxx" />
|
<ClInclude Include="..\emucore\CartEnhanced.hxx" />
|
||||||
<ClInclude Include="..\emucore\CartBF.hxx" />
|
<ClInclude Include="..\emucore\CartBF.hxx" />
|
||||||
|
|
|
@ -999,6 +999,9 @@
|
||||||
<ClCompile Include="..\debugger\gui\CartEnhancedWidget.cxx">
|
<ClCompile Include="..\debugger\gui\CartEnhancedWidget.cxx">
|
||||||
<Filter>Source Files\debugger</Filter>
|
<Filter>Source Files\debugger</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\emucore\Cart3EX.cxx">
|
||||||
|
<Filter>Source Files\emucore</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\common\bspf.hxx">
|
<ClInclude Include="..\common\bspf.hxx">
|
||||||
|
@ -2051,6 +2054,9 @@
|
||||||
<ClInclude Include="..\debugger\gui\CartEnhancedWidget.hxx">
|
<ClInclude Include="..\debugger\gui\CartEnhancedWidget.hxx">
|
||||||
<Filter>Header Files\debugger</Filter>
|
<Filter>Header Files\debugger</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\emucore\Cart3EX.hxx">
|
||||||
|
<Filter>Header Files\emucore</Filter>
|
||||||
|
</ClInclude>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="stella.ico">
|
<None Include="stella.ico">
|
||||||
|
|
Loading…
Reference in New Issue