mirror of https://github.com/stella-emu/stella.git
added 0FA0 (Mania) bankswitching
modified UA bankswitching accordingly
This commit is contained in:
parent
224de3184f
commit
728c7409f3
|
@ -39,6 +39,8 @@
|
|||
|
||||
* Enhanced support for CDFJ+ bankswitching type.
|
||||
|
||||
* Added 0FA0 bankswitching for Mania ROMs
|
||||
|
||||
* Added ARM chip auto detection.
|
||||
|
||||
* Fixed Stella crash due to invalid ZIP files.
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
<img src="graphics/stella_icon.png">
|
||||
<h2><b>A multi-platform Atari 2600 VCS emulator</b></h2>
|
||||
|
||||
<h4><b>Release 6.6</b></h4>
|
||||
<h4><b>Release 6.7</b></h4>
|
||||
<br>
|
||||
|
||||
<h2><b>User's Guide</b></h2>
|
||||
|
@ -354,7 +354,6 @@
|
|||
the following:</p>
|
||||
<ul>
|
||||
<li>i386 or x86_64 class machine, with 32 or 64-bit distribution</li>
|
||||
<li>OpenGL capable video card</li>
|
||||
<li>Other architectures (MIPS, PPC, PPC64, etc.) have been confirmed to work,
|
||||
but aren't as well tested as i386/x86_64</li>
|
||||
<li>GNU g++ v/7 or Clang v/5 (with C++17 support) and the make utility are required for compiling the Stella source code</li>
|
||||
|
@ -368,7 +367,6 @@
|
|||
<ul>
|
||||
<li>macOS 10.7 or above</li>
|
||||
<li>64-bit Intel processor</li>
|
||||
<li>OpenGL capable video card</li>
|
||||
<li>Xcode 8.0 is required to compile the Stella source code</li>
|
||||
</ul>
|
||||
|
||||
|
@ -379,7 +377,6 @@
|
|||
with the following:</p>
|
||||
|
||||
<ul>
|
||||
<li>Direct3D or OpenGL capable video card</li>
|
||||
<li>Visual C++ 2017/2019 Community is required to compile the Stella source code</li>
|
||||
</ul>
|
||||
|
||||
|
@ -2759,7 +2756,7 @@
|
|||
</tr>
|
||||
|
||||
<tr>
|
||||
<td><pre>-video <direct3d|opengl|opengles2|opengles|software></pre></td>
|
||||
<td><pre>-video <direct3d|metal|opengl|opengles2|opengles|software></pre></td>
|
||||
<td>Use the given rendering backend (where applicable); default is the best available
|
||||
mode detected.</td>
|
||||
</tr>
|
||||
|
@ -5064,7 +5061,8 @@ Ms Pac-Man (Stella extended codes):
|
|||
are not fully supported in the debugger.
|
||||
<table cellpadding="2" border="1">
|
||||
<tr><th> Type </th><th>Description</th><th>File Extension<br>(to force type)</th></tr>
|
||||
<tr><td>0840 </td><td>8K ECONObanking </td><td>.084, .0840</td></tr>
|
||||
<tr><td>0840 </td><td>8K ECONObanking</td><td>.084, .0840</td></tr>
|
||||
<tr><td>0FA0 </td><td>8K Mania</td><td>.0FA, .0FA0</td></tr>
|
||||
<tr><td>2IN1 ¹</td><td>4-64K Multicart (2 games)</td><td>.2N1 </td></tr>
|
||||
<tr><td>4IN1 ¹</td><td>8-64K Multicart (4 games)</td><td>.4N1 </td></tr>
|
||||
<tr><td>8IN1 ¹</td><td>16-64K Multicart (8 games)</td><td>.8N1 </td></tr>
|
||||
|
|
|
@ -48,8 +48,7 @@ string CartridgeUAWidget::hotspotStr(int bank, int, bool prefix)
|
|||
const uInt16 hotspot = myCart.hotspot() + (bank ^ (mySwappedHotspots ? 1 : 0)) * myHotspotDelta;
|
||||
|
||||
info << "(" << (prefix ? "hotspot " : "")
|
||||
<< "$" << Common::Base::HEX1 << hotspot << ", $" << (hotspot | 0x80)
|
||||
<< ", $" << (hotspot | 0xf80) << ")";
|
||||
<< "$" << Common::Base::HEX1 << hotspot << ", $" << (hotspot | 0x80) << ")";
|
||||
|
||||
return info.str();
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ MODULE_OBJS := \
|
|||
src/debugger/gui/AudioWidget.o \
|
||||
src/debugger/gui/BoosterWidget.o \
|
||||
src/debugger/gui/Cart0840Widget.o \
|
||||
src/debugger/gui/Cart0FA0Widget.o \
|
||||
src/debugger/gui/Cart2KWidget.o \
|
||||
src/debugger/gui/Cart3EPlusWidget.o \
|
||||
src/debugger/gui/Cart3EWidget.o \
|
||||
|
|
|
@ -96,6 +96,7 @@ const std::array<Bankswitch::Description, static_cast<int>(Bankswitch::Type::Num
|
|||
Bankswitch::BSList = {{
|
||||
{ "AUTO" , "Auto-detect" },
|
||||
{ "0840" , "0840 (8K ECONObank)" },
|
||||
{ "0FA0" , "0FA0 (8K Mania)" },
|
||||
{ "2IN1" , "2IN1 Multicart (4-64K)" },
|
||||
{ "4IN1" , "4IN1 Multicart (8-64K)" },
|
||||
{ "8IN1" , "8IN1 Multicart (16-64K)" },
|
||||
|
@ -167,6 +168,8 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
|
|||
// All bankswitch types (those that UnoCart and HarmonyCart support have the same name)
|
||||
{ "084" , Bankswitch::Type::_0840 },
|
||||
{ "0840" , Bankswitch::Type::_0840 },
|
||||
{ "0FA" , Bankswitch::Type::_0FA0 },
|
||||
{ "0FA0" , Bankswitch::Type::_0FA0 },
|
||||
{ "2N1" , Bankswitch::Type::_2IN1 },
|
||||
{ "4N1" , Bankswitch::Type::_4IN1 },
|
||||
{ "8N1" , Bankswitch::Type::_8IN1 },
|
||||
|
@ -241,6 +244,7 @@ Bankswitch::ExtensionMap Bankswitch::ourExtensions = {
|
|||
Bankswitch::NameToTypeMap Bankswitch::ourNameToTypes = {
|
||||
{ "AUTO" , Bankswitch::Type::_AUTO },
|
||||
{ "0840" , Bankswitch::Type::_0840 },
|
||||
{ "0FA0" , Bankswitch::Type::_0FA0 },
|
||||
{ "2IN1" , Bankswitch::Type::_2IN1 },
|
||||
{ "4IN1" , Bankswitch::Type::_4IN1 },
|
||||
{ "8IN1" , Bankswitch::Type::_8IN1 },
|
||||
|
|
|
@ -38,14 +38,13 @@ class Bankswitch
|
|||
public:
|
||||
// Currently supported bankswitch schemes
|
||||
enum class Type {
|
||||
_AUTO, _0840, _2IN1, _4IN1, _8IN1, _16IN1, _32IN1,
|
||||
_64IN1, _128IN1, _2K, _3E, _3EX, _3EP, _3F,
|
||||
_4A50, _4K, _4KSC, _AR, _BF, _BFSC, _BUS,
|
||||
_CDF, _CM, _CTY, _CV, _DF, _DFSC, _DPC,
|
||||
_DPCP, _E0, _E7, _EF, _EFSC, _F0, _F4,
|
||||
_F4SC, _F6, _F6SC, _F8, _F8SC, _FA, _FA2,
|
||||
_FC, _FE, _MDM, _MVC, _SB, _TVBOY, _UA,
|
||||
_UASW, _WD, _WDSW, _X07,
|
||||
_AUTO, _0840, _0FA0, _2IN1, _4IN1, _8IN1, _16IN1, _32IN1,
|
||||
_64IN1, _128IN1, _2K, _3E, _3EX, _3EP, _3F, _4A50,
|
||||
_4K, _4KSC, _AR, _BF, _BFSC, _BUS, _CDF, _CM,
|
||||
_CTY, _CV, _DF, _DFSC, _DPC, _DPCP, _E0, _E7,
|
||||
_EF, _EFSC, _F0, _F4, _F4SC, _F6, _F6SC, _F8,
|
||||
_F8SC, _FA, _FA2, _FC, _FE, _MDM, _MVC, _SB,
|
||||
_TVBOY, _UA, _UASW, _WD, _WDSW, _X07,
|
||||
#ifdef CUSTOM_ARM
|
||||
_CUSTOM,
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,104 @@
|
|||
//============================================================================
|
||||
//
|
||||
// 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-2022 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 "Cart0FA0.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Cartridge0FA0::Cartridge0FA0(const ByteBuffer& image, size_t size,
|
||||
const string& md5, const Settings& settings)
|
||||
: CartridgeEnhanced(image, size, md5, settings, 8_KB)
|
||||
{
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void Cartridge0FA0::install(System& system)
|
||||
{
|
||||
CartridgeEnhanced::install(system);
|
||||
|
||||
// Get the page accessing methods for the hot spots since they overlap
|
||||
// areas within the TIA we'll need to forward requests to the TIA
|
||||
myHotSpotPageAccess = mySystem->getPageAccess(0x06a0);
|
||||
|
||||
// Set the page accessing methods for the hot spots
|
||||
const System::PageAccess access(this, System::PageAccessType::READ);
|
||||
// Map all potential addresses
|
||||
// - A11 and A8 are not connected to RIOT
|
||||
// - A10, A9 and A7 are the fixed part of the hotspot address
|
||||
// - A6 and A5 determine bank
|
||||
for(uInt16 a11 = 0; a11 <= 1; ++a11)
|
||||
for(uInt16 a8 = 0; a8 <= 1; ++a8)
|
||||
{
|
||||
const uInt16 addr = (a11 << 11) + (a8 << 8);
|
||||
|
||||
mySystem->setPageAccess(0x06a0 | addr, access);
|
||||
mySystem->setPageAccess(0x06c0 | addr, access);
|
||||
}
|
||||
// Install pages for the startup bank
|
||||
bank(startBank());
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
bool Cartridge0FA0::checkSwitchBank(uInt16 address, uInt8)
|
||||
{
|
||||
// Switch banks if necessary
|
||||
switch(address & 0x16e0)
|
||||
{
|
||||
case 0x06a0:
|
||||
// Set the current bank to the lower 4k bank
|
||||
bank(0);
|
||||
return true;
|
||||
|
||||
case 0x06c0:
|
||||
// Set the current bank to the upper 4k bank
|
||||
bank(1);
|
||||
return true;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
//// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
uInt8 Cartridge0FA0::peek(uInt16 address)
|
||||
{
|
||||
address &= myBankMask;
|
||||
|
||||
checkSwitchBank(address);
|
||||
|
||||
// Because of the way accessing is set up, we will only get here
|
||||
// when doing a TIA read
|
||||
return myHotSpotPageAccess.device->peek(address);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
bool Cartridge0FA0::poke(uInt16 address, uInt8 value)
|
||||
{
|
||||
address &= myBankMask;
|
||||
|
||||
checkSwitchBank(address);
|
||||
|
||||
// Because of the way accessing is set up, we will may get here by
|
||||
// doing a write to TIA or cart; we ignore the cart write
|
||||
if (!(address & 0x1000))
|
||||
{
|
||||
myHotSpotPageAccess.device->poke(address, value);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
|
@ -0,0 +1,127 @@
|
|||
//============================================================================
|
||||
//
|
||||
// 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-2022 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 CARTRIDGEBR_HXX
|
||||
#define CARTRIDGEBR_HXX
|
||||
|
||||
#include "bspf.hxx"
|
||||
#include "CartEnhanced.hxx"
|
||||
#include "System.hxx"
|
||||
#ifdef DEBUGGER_SUPPORT
|
||||
#include "Cart0FA0Widget.hxx"
|
||||
#endif
|
||||
|
||||
/**
|
||||
Cartridge class used for some brazilian 8K bankswitched games. There
|
||||
are two 4K banks, which are switched by accessing
|
||||
(address & $16A0) = $06a0 (bank 0) and = $06c0 (bank 1).
|
||||
Actual addresses used by these carts are e.g. $0FA0, $0FC0 and $EFC0.
|
||||
The code accepts further potential hotspot addresses.
|
||||
|
||||
@author Thomas Jentzsch
|
||||
*/
|
||||
class Cartridge0FA0 : public CartridgeEnhanced
|
||||
{
|
||||
friend class Cartridge0FA0Widget;
|
||||
|
||||
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)
|
||||
*/
|
||||
Cartridge0FA0(const ByteBuffer& image, size_t size, const string& md5,
|
||||
const Settings& settings);
|
||||
~Cartridge0FA0() override = default;
|
||||
|
||||
public:
|
||||
/**
|
||||
Install cartridge in the specified system. Invoked by the system
|
||||
when the cartridge is attached to it.
|
||||
|
||||
@param system The system the device should install itself in
|
||||
*/
|
||||
void install(System& system) override;
|
||||
|
||||
/**
|
||||
Get a descriptor for the device name (used in error checking).
|
||||
|
||||
@return The name of the object
|
||||
*/
|
||||
string name() const override {
|
||||
return "Cartridge0FA0";
|
||||
}
|
||||
|
||||
#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 Cartridge0FA0Widget(boss, lfont, nfont, x, y, w, h, *this);
|
||||
}
|
||||
#endif
|
||||
|
||||
public:
|
||||
/**
|
||||
Get the byte at the specified address.
|
||||
|
||||
@return The byte at the specified address
|
||||
*/
|
||||
uInt8 peek(uInt16 address) override;
|
||||
|
||||
/**
|
||||
Change the byte at the specified address to the given value
|
||||
|
||||
@param address The address where the value should be stored
|
||||
@param value The value to be stored at the address
|
||||
@return True if the poke changed the device address space, else false
|
||||
*/
|
||||
bool poke(uInt16 address, uInt8 value) override;
|
||||
|
||||
private:
|
||||
/**
|
||||
Checks if startup bank randomization is enabled. For this scheme,
|
||||
randomization is not supported (see above).
|
||||
*/
|
||||
bool randomStartBank() const override { return false; }
|
||||
|
||||
bool checkSwitchBank(uInt16 address, uInt8 value = 0) override;
|
||||
|
||||
uInt16 hotspot() const override { return 0x06a0; }
|
||||
|
||||
uInt16 getStartBank() const override { return 1; }
|
||||
|
||||
private:
|
||||
// Previous Device's page access
|
||||
System::PageAccess myHotSpotPageAccess;
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
Cartridge0FA0() = delete;
|
||||
Cartridge0FA0(const Cartridge0FA0&) = delete;
|
||||
Cartridge0FA0(Cartridge0FA0&&) = delete;
|
||||
Cartridge0FA0& operator=(const Cartridge0FA0&) = delete;
|
||||
Cartridge0FA0& operator=(Cartridge0FA0&&) = delete;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -0,0 +1,53 @@
|
|||
//============================================================================
|
||||
//
|
||||
// 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-2022 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 "Cart0FA0.hxx"
|
||||
#include "Cart0FA0Widget.hxx"
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
Cartridge0FA0Widget::Cartridge0FA0Widget(
|
||||
GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont,
|
||||
int x, int y, int w, int h, Cartridge0FA0& cart)
|
||||
: CartridgeEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart)
|
||||
{
|
||||
myHotspotDelta = 0x20;
|
||||
initialize();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string Cartridge0FA0Widget::description()
|
||||
{
|
||||
ostringstream info;
|
||||
|
||||
info << "8K BR cartridge, two 4K banks\n"
|
||||
<< CartridgeEnhancedWidget::description();
|
||||
|
||||
return info.str();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string Cartridge0FA0Widget::hotspotStr(int bank, int, bool prefix)
|
||||
{
|
||||
ostringstream info;
|
||||
const uInt16 hotspot = myCart.hotspot() + bank * myHotspotDelta;
|
||||
|
||||
info << "(" << (prefix ? "hotspot " : "")
|
||||
<< "$" << Common::Base::HEX1 << hotspot
|
||||
<< ", $" << (hotspot | 0xf80) << ")";
|
||||
|
||||
return info.str();
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
//============================================================================
|
||||
//
|
||||
// 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-2022 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 CARTRIDGEBR_WIDGET_HXX
|
||||
#define CARTRIDGEBR_WIDGET_HXX
|
||||
|
||||
class Cartridge0FA0;
|
||||
|
||||
#include "CartEnhancedWidget.hxx"
|
||||
|
||||
class Cartridge0FA0Widget : public CartridgeEnhancedWidget
|
||||
{
|
||||
public:
|
||||
Cartridge0FA0Widget(GuiObject* boss, const GUI::Font& lfont,
|
||||
const GUI::Font& nfont,
|
||||
int x, int y, int w, int h,
|
||||
Cartridge0FA0& cart);
|
||||
~Cartridge0FA0Widget() override = default;
|
||||
|
||||
private:
|
||||
string manufacturer() override { return "Mania"; }
|
||||
|
||||
string description() override;
|
||||
|
||||
string hotspotStr(int bank, int seg, bool prefix = false) override;
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
Cartridge0FA0Widget() = delete;
|
||||
Cartridge0FA0Widget(const Cartridge0FA0Widget&) = delete;
|
||||
Cartridge0FA0Widget(Cartridge0FA0Widget&&) = delete;
|
||||
Cartridge0FA0Widget& operator=(const Cartridge0FA0Widget&) = delete;
|
||||
Cartridge0FA0Widget& operator=(Cartridge0FA0Widget&&) = delete;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -18,6 +18,7 @@
|
|||
#include "bspf.hxx"
|
||||
#include "Cart.hxx"
|
||||
#include "Cart0840.hxx"
|
||||
#include "Cart0FA0.hxx"
|
||||
#include "Cart2K.hxx"
|
||||
#include "Cart3E.hxx"
|
||||
#include "Cart3EX.hxx"
|
||||
|
@ -245,7 +246,7 @@ CartCreator::createFromMultiCart(const ByteBuffer& image, size_t& size,
|
|||
type = Bankswitch::Type::_2K;
|
||||
else if(size == 4_KB)
|
||||
type = Bankswitch::Type::_4K;
|
||||
else if(size == 8_KB || size == 16_KB || size == 32_KB || size == 64_KB)
|
||||
else if(size == 8_KB || size == 16_KB || size == 32_KB || size == 64_KB || size == 128_KB)
|
||||
type = CartDetector::autodetectType(slice, size);
|
||||
else /* default */
|
||||
type = Bankswitch::Type::_4K;
|
||||
|
@ -263,6 +264,8 @@ CartCreator::createFromImage(const ByteBuffer& image, size_t size, Bankswitch::T
|
|||
{
|
||||
case Bankswitch::Type::_0840:
|
||||
return make_unique<Cartridge0840>(image, size, md5, settings);
|
||||
case Bankswitch::Type::_0FA0:
|
||||
return make_unique<Cartridge0FA0>(image, size, md5, settings);
|
||||
case Bankswitch::Type::_2K:
|
||||
return make_unique<Cartridge2K>(image, size, md5, settings);
|
||||
case Bankswitch::Type::_3E:
|
||||
|
|
|
@ -75,6 +75,8 @@ Bankswitch::Type CartDetector::autodetectType(const ByteBuffer& image, size_t si
|
|||
type = Bankswitch::Type::_3F;
|
||||
else if(isProbablyUA(image, size))
|
||||
type = Bankswitch::Type::_UA;
|
||||
else if(isProbably0FA0(image, size))
|
||||
type = Bankswitch::Type::_0FA0;
|
||||
else if(isProbablyFE(image, size) && !f8)
|
||||
type = Bankswitch::Type::_FE;
|
||||
else if(isProbably0840(image, size))
|
||||
|
@ -344,6 +346,25 @@ bool CartDetector::isProbably0840(const ByteBuffer& image, size_t size)
|
|||
return false;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
bool CartDetector::isProbably0FA0(const ByteBuffer& image, size_t size)
|
||||
{
|
||||
// Other Brazilian (Atari Mania) ROM's bankswitching switches to bank 1 by
|
||||
// accessing address 0xFC0 using 'BIT $FC0', 'BIT $FC0' or 'STA $FC0'
|
||||
// Also a game (Motocross) using 'BIT $EFC0' has been found
|
||||
static constexpr uInt8 signature[4][3] = {
|
||||
{ 0x2C, 0xC0, 0x0F }, // BIT $FC0 (H.E.R.O., Kung-Fu Master)
|
||||
{ 0x8D, 0xC0, 0x0F }, // STA $FC0 (Pole Position, Subterranea)
|
||||
{ 0xAD, 0xC0, 0x0F }, // LDA $FC0 (Front Line, Zaxxon)
|
||||
{ 0x2C, 0xC0, 0xEF } // BIT $EFC0 (Motocross)
|
||||
};
|
||||
for(uInt32 i = 0; i < 4; ++i)
|
||||
if(searchForBytes(image, size, signature[i], 3))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
bool CartDetector::isProbably3E(const ByteBuffer& image, size_t size)
|
||||
{
|
||||
|
@ -755,25 +776,18 @@ bool CartDetector::isProbablyTVBoy(const ByteBuffer& image, size_t size)
|
|||
bool CartDetector::isProbablyUA(const ByteBuffer& image, size_t size)
|
||||
{
|
||||
// UA cart bankswitching switches to bank 1 by accessing address 0x240
|
||||
// using 'STA $240' or 'LDA $240'
|
||||
// Similar Brazilian (Digivison) cart bankswitching switches to bank 1 by accessing address 0x2C0
|
||||
// using 'STA $240' or 'LDA $240'.
|
||||
// Brazilian (Digivison) cart bankswitching switches to bank 1 by accessing address 0x2C0
|
||||
// using 'BIT $2C0', 'STA $2C0' or 'LDA $2C0'
|
||||
// Other Brazilian (Atari Mania) ROM's bankswitching switches to bank 1 by accessing address 0xFC0
|
||||
// using 'BIT $FA0', 'BIT $FC0' or 'STA $FC0'
|
||||
// Also a game (Motocross) using 'BIT $EFC0' has been found
|
||||
static constexpr uInt8 signature[10][3] = {
|
||||
static constexpr uInt8 signature[6][3] = {
|
||||
{ 0x8D, 0x40, 0x02 }, // STA $240 (Funky Fish, Pleiades)
|
||||
{ 0xAD, 0x40, 0x02 }, // LDA $240 (???)
|
||||
{ 0xBD, 0x1F, 0x02 }, // LDA $21F,X (Gingerbread Man)
|
||||
{ 0x2C, 0xC0, 0x02 }, // BIT $2C0 (Time Pilot)
|
||||
{ 0x8D, 0xC0, 0x02 }, // STA $2C0 (Fathom, Vanguard)
|
||||
{ 0xAD, 0xC0, 0x02 }, // LDA $2C0 (Mickey)
|
||||
{ 0x2C, 0xC0, 0x0F }, // BIT $FC0 (H.E.R.O., Kung-Fu Master)
|
||||
{ 0x8D, 0xC0, 0x0F }, // STA $FC0 (Pole Position, Subterranea)
|
||||
{ 0xAD, 0xC0, 0x0F }, // LDA $FC0 (Front Line, Zaxxon)
|
||||
{ 0x2C, 0xC0, 0xEF } // BIT $EFC0 (Motocross)
|
||||
};
|
||||
for(uInt32 i = 0; i < 10; ++i)
|
||||
for(uInt32 i = 0; i < 6; ++i)
|
||||
if(searchForBytes(image, size, signature[i], 3))
|
||||
return true;
|
||||
|
||||
|
|
|
@ -91,6 +91,11 @@ class CartDetector
|
|||
*/
|
||||
static bool isProbably0840(const ByteBuffer& image, size_t size);
|
||||
|
||||
/**
|
||||
Returns true if the image is probably a BRazilian bankswitching cartridge
|
||||
*/
|
||||
static bool isProbably0FA0(const ByteBuffer& image, size_t size);
|
||||
|
||||
/**
|
||||
Returns true if the image is probably a 3E bankswitching cartridge
|
||||
*/
|
||||
|
|
|
@ -43,7 +43,7 @@ void CartridgeUA::install(System& system)
|
|||
// - A11, A10 and A8 are not connected to RIOT
|
||||
// - A9 is the fixed part of the hotspot address
|
||||
// - A7 is used by Brazilian carts
|
||||
// - A5 and A4 determine bank
|
||||
// - A6 and A5 determine bank
|
||||
for(uInt16 a11 = 0; a11 <= 1; ++a11)
|
||||
for(uInt16 a10 = 0; a10 <= 1; ++a10)
|
||||
for(uInt16 a8 = 0; a8 <= 1; ++a8)
|
||||
|
|
|
@ -29,8 +29,7 @@
|
|||
Cartridge class used for UA Limited's 8K bankswitched games. There
|
||||
are two 4K banks, which are switched by accessing $0220 (bank 0) and
|
||||
$0240 (bank 1). Similar addresses are used by Brazilian carts, e.g.
|
||||
$02A0, $02C0 and $0FA0, $0FC0. The code accepts further potential
|
||||
hotspot addresses.
|
||||
$02A0 and $02C0. The code accepts further potential hotspot addresses.
|
||||
|
||||
@author Bradford W. Mott, Thomas Jentzsch
|
||||
*/
|
||||
|
|
|
@ -10,6 +10,7 @@ MODULE_OBJS := \
|
|||
src/emucore/CartDetector.o \
|
||||
src/emucore/CartEnhanced.o \
|
||||
src/emucore/Cart0840.o \
|
||||
src/emucore/Cart0FA0.o \
|
||||
src/emucore/Cart2K.o \
|
||||
src/emucore/Cart3E.o \
|
||||
src/emucore/Cart3EPlus.o \
|
||||
|
|
|
@ -49,6 +49,7 @@ SOURCES_CXX := \
|
|||
$(CORE_DIR)/emucore/CartDetector.cxx \
|
||||
$(CORE_DIR)/emucore/CartEnhanced.cxx \
|
||||
$(CORE_DIR)/emucore/Cart0840.cxx \
|
||||
$(CORE_DIR)/emucore/Cart0FA0.cxx \
|
||||
$(CORE_DIR)/emucore/Cart2K.cxx \
|
||||
$(CORE_DIR)/emucore/Cart3E.cxx \
|
||||
$(CORE_DIR)/emucore/Cart3EPlus.cxx \
|
||||
|
|
|
@ -225,6 +225,7 @@
|
|||
<ClCompile Include="..\emucore\Booster.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart0840.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart0FA0.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart2K.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart3E.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart3F.cxx" />
|
||||
|
@ -385,6 +386,7 @@
|
|||
<ClInclude Include="..\emucore\Booster.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart0840.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart0FA0.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart2K.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart3E.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart3F.hxx" />
|
||||
|
|
|
@ -857,6 +857,8 @@
|
|||
<ClCompile Include="..\emucore\Cart3EX.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart4KSC.cxx" />
|
||||
<ClCompile Include="..\emucore\CartARM.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart0FA0.cxx" />
|
||||
<ClCompile Include="..\emucore\Cart0FA0Widget.cxx" />
|
||||
<ClCompile Include="..\emucore\CartCreator.cxx" />
|
||||
<ClCompile Include="..\emucore\CartE7.cxx" />
|
||||
<ClCompile Include="..\emucore\CartEnhanced.cxx" />
|
||||
|
@ -2048,6 +2050,7 @@
|
|||
<ClInclude Include="..\emucore\Cart3EX.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart4KSC.hxx" />
|
||||
<ClInclude Include="..\emucore\CartARM.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart0FA0.hxx" />
|
||||
<ClInclude Include="..\emucore\CartCreator.hxx" />
|
||||
<ClInclude Include="..\emucore\CartE7.hxx" />
|
||||
<ClInclude Include="..\emucore\CartEnhanced.hxx" />
|
||||
|
@ -2064,6 +2067,7 @@
|
|||
<ClInclude Include="..\emucore\CartFC.hxx" />
|
||||
<ClInclude Include="..\emucore\CartMDM.hxx" />
|
||||
<ClInclude Include="..\emucore\CartMVC.hxx" />
|
||||
<ClInclude Include="..\emucore\Cart0FA0Widget.hxx" />
|
||||
<ClInclude Include="..\emucore\CartTVBoy.hxx" />
|
||||
<ClInclude Include="..\emucore\CartWD.hxx" />
|
||||
<ClInclude Include="..\emucore\CompuMate.hxx" />
|
||||
|
|
|
@ -1131,6 +1131,12 @@
|
|||
<ClCompile Include="..\gui\NavigationWidget.cxx">
|
||||
<Filter>Source Files\gui</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\emucore\Cart0FA0.cxx">
|
||||
<Filter>Source Files\emucore</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\emucore\Cart0FA0Widget.cxx">
|
||||
<Filter>Source Files\debugger</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\common\bspf.hxx">
|
||||
|
@ -2342,6 +2348,12 @@
|
|||
<ClInclude Include="..\emucore\ConsoleTiming.hxx">
|
||||
<Filter>Header Files\emucore</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\emucore\Cart0FA0.hxx">
|
||||
<Filter>Header Files\emucore</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\emucore\Cart0FA0Widget.hxx">
|
||||
<Filter>Header Files\debugger</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="stella.ico">
|
||||
|
|
Loading…
Reference in New Issue