NEC DSP: Try to load the firmware from the rom file, if it exists

This commit is contained in:
Sour 2019-10-26 17:47:57 -04:00
parent a5f1d4f5ad
commit bd6295d931
5 changed files with 37 additions and 12 deletions

View file

@ -188,6 +188,8 @@ void BaseCartridge::LoadRom()
_coprocessorRamSize = 0x10000;
}
LoadEmbeddedFirmware();
_saveRamSize = _cartInfo.SramSize > 0 ? 1024 * (1 << _cartInfo.SramSize) : 0;
_saveRam = new uint8_t[_saveRamSize];
_console->GetSettings()->InitializeRam(_saveRam, _saveRamSize);
@ -367,9 +369,26 @@ void BaseCartridge::RegisterHandlers(MemoryMappings &mm)
}
}
void BaseCartridge::LoadEmbeddedFirmware()
{
//Attempt to detect/load the firmware from the end of the rom file, if it exists
if((_coprocessorType >= CoprocessorType::DSP1 && _coprocessorType <= CoprocessorType::DSP4) || (_coprocessorType >= CoprocessorType::ST010 && _coprocessorType <= CoprocessorType::ST011)) {
uint32_t firmwareSize = 0;
if((_prgRomSize & 0x7FFF) == 0x2000) {
firmwareSize = 0x2000;
} else if((_prgRomSize & 0xFFFF) == 0xD000) {
firmwareSize = 0xD000;
}
_embeddedFirmware.resize(firmwareSize);
memcpy(_embeddedFirmware.data(), _prgRom + (_prgRomSize - firmwareSize), firmwareSize);
_prgRomSize -= firmwareSize;
}
}
void BaseCartridge::InitCoprocessor()
{
_coprocessor.reset(NecDsp::InitCoprocessor(_coprocessorType, _console));
_coprocessor.reset(NecDsp::InitCoprocessor(_coprocessorType, _console, _embeddedFirmware));
_necDsp = dynamic_cast<NecDsp*>(_coprocessor.get());
if(_coprocessorType == CoprocessorType::SA1) {

View file

@ -44,6 +44,7 @@ private:
uint32_t _coprocessorRamSize = 0;
shared_ptr<SpcFileData> _spcData;
vector<uint8_t> _embeddedFirmware;
void LoadBattery();
@ -59,6 +60,7 @@ private:
void LoadRom();
void LoadSpc();
void InitCoprocessor();
void LoadEmbeddedFirmware();
string GetCartName();
string GetGameCode();

View file

@ -36,9 +36,13 @@ private:
return false;
}
public:
static bool LoadDspFirmware(Console *console, CoprocessorType coprocessorType, string combinedFilename, string splitFilenameProgram, string splitFilenameData, vector<uint8_t> &programRom, vector<uint8_t> &dataRom, uint32_t programSize = 0x1800, uint32_t dataSize = 0x800)
static bool LoadDspFirmware(Console *console, CoprocessorType coprocessorType, string combinedFilename, string splitFilenameProgram, string splitFilenameData, vector<uint8_t> &programRom, vector<uint8_t> &dataRom, vector<uint8_t> &embeddedFirware, uint32_t programSize = 0x1800, uint32_t dataSize = 0x800)
{
if(AttemptLoadDspFirmware(combinedFilename, splitFilenameProgram, splitFilenameData, programRom, dataRom, programSize, dataSize)) {
if(embeddedFirware.size() == programSize + dataSize) {
programRom.insert(programRom.end(), embeddedFirware.begin(), embeddedFirware.begin() + programSize);
dataRom.insert(dataRom.end(), embeddedFirware.begin() + programSize, embeddedFirware.end());
return true;
} else if(AttemptLoadDspFirmware(combinedFilename, splitFilenameProgram, splitFilenameData, programRom, dataRom, programSize, dataSize)) {
return true;
}

View file

@ -77,19 +77,19 @@ NecDsp::NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programR
}
}
NecDsp* NecDsp::InitCoprocessor(CoprocessorType type, Console *console)
NecDsp* NecDsp::InitCoprocessor(CoprocessorType type, Console *console, vector<uint8_t> &embeddedFirware)
{
bool firmwareLoaded = false;
vector<uint8_t> programRom;
vector<uint8_t> dataRom;
switch(type) {
case CoprocessorType::DSP1: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp1.rom", "dsp1.program.rom", "dsp1.data.rom", programRom, dataRom); break;
case CoprocessorType::DSP1B: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp1b.rom", "dsp1b.program.rom", "dsp1b.data.rom", programRom, dataRom); break;
case CoprocessorType::DSP2: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp2.rom", "dsp2.program.rom", "dsp2.data.rom", programRom, dataRom); break;
case CoprocessorType::DSP3: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp3.rom", "dsp3.program.rom", "dsp3.data.rom", programRom, dataRom); break;
case CoprocessorType::DSP4: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp4.rom", "dsp4.program.rom", "dsp4.data.rom", programRom, dataRom); break;
case CoprocessorType::ST010: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "st010.rom", "st010.program.rom", "st010.data.rom", programRom, dataRom, 0xC000, 0x1000); break;
case CoprocessorType::ST011: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "st011.rom", "st011.program.rom", "st011.data.rom", programRom, dataRom, 0xC000, 0x1000); break;
case CoprocessorType::DSP1: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp1.rom", "dsp1.program.rom", "dsp1.data.rom", programRom, dataRom, embeddedFirware); break;
case CoprocessorType::DSP1B: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp1b.rom", "dsp1b.program.rom", "dsp1b.data.rom", programRom, dataRom, embeddedFirware); break;
case CoprocessorType::DSP2: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp2.rom", "dsp2.program.rom", "dsp2.data.rom", programRom, dataRom, embeddedFirware); break;
case CoprocessorType::DSP3: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp3.rom", "dsp3.program.rom", "dsp3.data.rom", programRom, dataRom, embeddedFirware); break;
case CoprocessorType::DSP4: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "dsp4.rom", "dsp4.program.rom", "dsp4.data.rom", programRom, dataRom, embeddedFirware); break;
case CoprocessorType::ST010: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "st010.rom", "st010.program.rom", "st010.data.rom", programRom, dataRom, embeddedFirware, 0xC000, 0x1000); break;
case CoprocessorType::ST011: firmwareLoaded = FirmwareHelper::LoadDspFirmware(console, type, "st011.rom", "st011.program.rom", "st011.data.rom", programRom, dataRom, embeddedFirware, 0xC000, 0x1000); break;
default: break;
}

View file

@ -51,7 +51,7 @@ private:
NecDsp(CoprocessorType type, Console* console, vector<uint8_t> &programRom, vector<uint8_t> &dataRom);
public:
static NecDsp* InitCoprocessor(CoprocessorType type, Console* console);
static NecDsp* InitCoprocessor(CoprocessorType type, Console* console, vector<uint8_t> &embeddedFirmware);
void Reset() override;
void Run();