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 support, as well as 'virtual' formats (such as showing the list
of files for 2in1/4in1/8in1/etc within the UI). 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 * Improved bankswitch autodetection for X07 ROMs (although there's only
two known ROMs in existence, so the detection probably isn't robust). 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 else if(size == 29*1024) // 29K
{ {
type = "DPC+"; 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 else if(size == 32*1024) // 32K
{ {
@ -444,6 +449,8 @@ string Cartridge::autodetectType(const uInt8* image, uInt32 size)
type = "DPC+"; type = "DPC+";
else if(isProbablyCTY(image, size)) else if(isProbablyCTY(image, size))
type = "CTY"; type = "CTY";
else if(isProbablyFA2(image, size))
type = "FA2";
else else
type = "F4"; type = "F4";
} }
@ -544,6 +551,21 @@ bool Cartridge::isProbablySC(const uInt8* image, uInt32 size)
return true; 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) bool Cartridge::isProbably0840(const uInt8* image, uInt32 size)
{ {
@ -707,6 +729,21 @@ bool Cartridge::isProbablyEF(const uInt8* image, uInt32 size)
return false; 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) 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); 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 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); 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 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), myRamAccessTimeout(0),
mySize(size) 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 // Allocate array for the ROM image
myImage = new uInt8[mySize]; myImage = new uInt8[mySize];