Updated FA2 autodetection for Harmony ROMs (29/32K). Basically these

are detected and the ARM code discarded.


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2616 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2013-02-20 18:16:34 +00:00
parent 4610fd608d
commit b6ec874778
4 changed files with 58 additions and 1 deletions

View File

@ -44,6 +44,9 @@
support, as well as 'virtual' formats (such as showing the list
of files for 2in1/4in1/8in1/etc within the UI).
* Improved bankswitch autodetection for FA2 ROMs; 29K and 32K versions
(meant for Harmony cart) are now recognized.
* Improved bankswitch autodetection for X07 ROMs (although there's only
two known ROMs in existence, so the detection probably isn't robust).

View File

@ -430,7 +430,12 @@ string Cartridge::autodetectType(const uInt8* image, uInt32 size)
}
else if(size == 29*1024) // 29K
{
if(isProbablyDPCplus(image, size))
type = "DPC+";
else if(isProbablyARM(image, size))
type = "FA2";
else
type = "4K"; // probably a bad ROM
}
else if(size == 32*1024) // 32K
{
@ -444,6 +449,8 @@ string Cartridge::autodetectType(const uInt8* image, uInt32 size)
type = "DPC+";
else if(isProbablyCTY(image, size))
type = "CTY";
else if(isProbablyFA2(image, size))
type = "FA2";
else
type = "F4";
}
@ -544,6 +551,21 @@ bool Cartridge::isProbablySC(const uInt8* image, uInt32 size)
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Cartridge::isProbablyARM(const uInt8* image, uInt32 size)
{
// ARM code contains the following 'loader' patterns in the first 1K
// Thanks to Thomas Jentzsch of AtariAge for this advice
uInt8 signature[2][4] = {
{ 0xA0, 0xC1, 0x1F, 0xE0 },
{ 0x00, 0x80, 0x02, 0xE0 }
};
if(searchForBytes(image, 1024, signature[0], 4, 1))
return true;
else
return searchForBytes(image, 1024, signature[1], 4, 1);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Cartridge::isProbably0840(const uInt8* image, uInt32 size)
{
@ -707,6 +729,21 @@ bool Cartridge::isProbablyEF(const uInt8* image, uInt32 size)
return false;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Cartridge::isProbablyFA2(const uInt8* image, uInt32 size)
{
// This currently tests only the 32K version of FA2; the 24 and 28K
// versions are easy, in that they're the only possibility with those
// file sizes
// 32K version has all zeros in 29K-32K area
for(uInt32 i = 29*1024; i < 32*1024; ++i)
if(image[i] != 0)
return false;
return true;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool Cartridge::isProbablyFE(const uInt8* image, uInt32 size)
{

View File

@ -271,6 +271,11 @@ class Cartridge : public Device
*/
static bool isProbablySC(const uInt8* image, uInt32 size);
/**
Returns true if the image probably contains ARM code in the first 1K
*/
static bool isProbablyARM(const uInt8* image, uInt32 size);
/**
Returns true if the image is probably a 0840 bankswitching cartridge
*/
@ -326,6 +331,11 @@ class Cartridge : public Device
*/
static bool isProbablyF6(const uInt8* image, uInt32 size);
/**
Returns true if the image is probably an FA2 bankswitching cartridge
*/
static bool isProbablyFA2(const uInt8* image, uInt32 size);
/**
Returns true if the image is probably an FE bankswitching cartridge
*/

View File

@ -32,6 +32,13 @@ CartridgeFA2::CartridgeFA2(const uInt8* image, uInt32 size, const OSystem& osyst
myRamAccessTimeout(0),
mySize(size)
{
// 29/32K version of FA2 has valid data @ 1K - 29K
if(size >= 29 * 1024)
{
image += 1024;
mySize = 28 * 1024;
}
// Allocate array for the ROM image
myImage = new uInt8[mySize];