NEC DSP: Try to load the firmware from the rom file, if it exists
This commit is contained in:
parent
a5f1d4f5ad
commit
bd6295d931
5 changed files with 37 additions and 12 deletions
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue