Cart: Ignore copier headers if they exist
This commit is contained in:
parent
f4ad787721
commit
0d70e9be28
2 changed files with 35 additions and 7 deletions
|
@ -70,13 +70,13 @@ int32_t BaseCartridge::GetHeaderScore(uint32_t addr)
|
||||||
score += 8;
|
score += 8;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t resetVectorAddr = addr + 0x7FFC;
|
uint32_t resetVectorAddr = addr + 0x7FFC;
|
||||||
uint16_t resetVector = _prgRom[resetVectorAddr] | (_prgRom[resetVectorAddr + 1] << 8);
|
uint32_t resetVector = _prgRom[resetVectorAddr] | (_prgRom[resetVectorAddr + 1] << 8);
|
||||||
if(resetVector < 0x8000) {
|
if(resetVector < 0x8000) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t op = _prgRom[addr | (resetVector & 0x7FFF)];
|
uint8_t op = _prgRom[addr + (resetVector & 0x7FFF)];
|
||||||
if(op == 0x18 || op == 0x78 || op == 0x4C || op == 0x5C || op == 0x20 || op == 0x22 || op == 0x9C) {
|
if(op == 0x18 || op == 0x78 || op == 0x4C || op == 0x5C || op == 0x20 || op == 0x22 || op == 0x9C) {
|
||||||
//CLI, SEI, JMP, JML, JSR, JSl, STZ
|
//CLI, SEI, JMP, JML, JSR, JSl, STZ
|
||||||
score += 8;
|
score += 8;
|
||||||
|
@ -93,19 +93,42 @@ int32_t BaseCartridge::GetHeaderScore(uint32_t addr)
|
||||||
|
|
||||||
void BaseCartridge::Init()
|
void BaseCartridge::Init()
|
||||||
{
|
{
|
||||||
int32_t loRomScore = GetHeaderScore(0x0000);
|
//Find the best potential header among lorom/hirom + headerless/headered combinations
|
||||||
int32_t hiRomScore = GetHeaderScore(0x8000);
|
vector<uint32_t> baseAddresses = { 0, 0x200, 0x8000, 0x8200 };
|
||||||
|
int32_t bestScore = -1;
|
||||||
|
bool hasHeader = false;
|
||||||
|
bool isLoRom = true;
|
||||||
|
for(uint32_t baseAddress : baseAddresses) {
|
||||||
|
int32_t score = GetHeaderScore(baseAddress);
|
||||||
|
if(score > bestScore) {
|
||||||
|
bestScore = score;
|
||||||
|
isLoRom = (baseAddress & 0x8000) == 0;
|
||||||
|
hasHeader = (baseAddress & 0x200) != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t headerOffset = 0;
|
uint32_t headerOffset = 0;
|
||||||
uint32_t flags = 0;
|
uint32_t flags = 0;
|
||||||
if(loRomScore >= hiRomScore) {
|
if(isLoRom) {
|
||||||
|
if(hasHeader) {
|
||||||
|
flags |= CartFlags::CopierHeader;
|
||||||
|
}
|
||||||
flags |= CartFlags::LoRom;
|
flags |= CartFlags::LoRom;
|
||||||
headerOffset = 0x7FB0;
|
headerOffset = 0x7FB0;
|
||||||
} else {
|
} else {
|
||||||
|
if(hasHeader) {
|
||||||
|
flags |= CartFlags::CopierHeader;
|
||||||
|
}
|
||||||
flags |= CartFlags::HiRom;
|
flags |= CartFlags::HiRom;
|
||||||
headerOffset = 0xFFB0;
|
headerOffset = 0xFFB0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(flags & CartFlags::CopierHeader) {
|
||||||
|
//Remove the copier header
|
||||||
|
memmove(_prgRom, _prgRom + 512, _prgRomSize - 512);
|
||||||
|
_prgRomSize -= 512;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(&_cartInfo, _prgRom + headerOffset, sizeof(SnesCartInformation));
|
memcpy(&_cartInfo, _prgRom + headerOffset, sizeof(SnesCartInformation));
|
||||||
|
|
||||||
if((flags & CartFlags::HiRom) && (_cartInfo.MapMode & 0x27) == 0x25) {
|
if((flags & CartFlags::HiRom) && (_cartInfo.MapMode & 0x27) == 0x25) {
|
||||||
|
@ -243,6 +266,10 @@ void BaseCartridge::DisplayCartInfo()
|
||||||
MessageManager::Log("FastROM");
|
MessageManager::Log("FastROM");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(_flags & CartFlags::CopierHeader) {
|
||||||
|
MessageManager::Log("Copier header found.");
|
||||||
|
}
|
||||||
|
|
||||||
MessageManager::Log("Map Mode: $" + HexUtilities::ToHex(_cartInfo.MapMode));
|
MessageManager::Log("Map Mode: $" + HexUtilities::ToHex(_cartInfo.MapMode));
|
||||||
MessageManager::Log("Rom Type: $" + HexUtilities::ToHex(_cartInfo.RomType));
|
MessageManager::Log("Rom Type: $" + HexUtilities::ToHex(_cartInfo.RomType));
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,8 @@ namespace CartFlags
|
||||||
HiRom = 2,
|
HiRom = 2,
|
||||||
FastRom = 4,
|
FastRom = 4,
|
||||||
ExLoRom = 8,
|
ExLoRom = 8,
|
||||||
ExHiRom = 16
|
ExHiRom = 16,
|
||||||
|
CopierHeader = 32
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue