Cart: Ignore copier headers if they exist

This commit is contained in:
Sour 2019-03-11 00:37:31 -04:00
parent f4ad787721
commit 0d70e9be28
2 changed files with 35 additions and 7 deletions

View file

@ -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));

View file

@ -42,7 +42,8 @@ namespace CartFlags
HiRom = 2, HiRom = 2,
FastRom = 4, FastRom = 4,
ExLoRom = 8, ExLoRom = 8,
ExHiRom = 16 ExHiRom = 16,
CopierHeader = 32
}; };
} }