mirror of https://github.com/stella-emu/stella.git
added 0FA0 (Mania) bankswitching
modified UA bankswitching accordingly
This commit is contained in:
parent
3b9184ec5f
commit
544f662f1d
|
@ -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">
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue