diff --git a/src/frontend/FrontendUtil.h b/src/frontend/FrontendUtil.h index a297c70c..7337e6fa 100644 --- a/src/frontend/FrontendUtil.h +++ b/src/frontend/FrontendUtil.h @@ -66,6 +66,8 @@ extern char ROMPath [ROMSlot_MAX][1024]; extern char SRAMPath[ROMSlot_MAX][1024]; extern bool SavestateLoaded; +// Stores type of nds rom i.e. nds/srl/dsi. Should be updated everytime an NDS rom is loaded from an archive +extern char NDSROMExtension[4]; // initialize the ROM handling utility void Init_ROM(); @@ -79,7 +81,7 @@ int LoadBIOS(); // load a ROM file to the specified cart slot // note: loading a ROM to the NDS slot resets emulation int LoadROM(const char* file, int slot); -int LoadROM(const QByteArray *romdata, QString archivefilename, QString romfilename, int slot); +int LoadROM(const u8 *romdata, u32 romlength, const char *archivefilename, const char *romfilename, const char *sramfilename, int slot); // unload the ROM loaded in the specified cart slot // simulating ejection of the cartridge diff --git a/src/frontend/Util_ROM.cpp b/src/frontend/Util_ROM.cpp index 709d2dfb..21568017 100644 --- a/src/frontend/Util_ROM.cpp +++ b/src/frontend/Util_ROM.cpp @@ -19,10 +19,7 @@ #include #include -#include -#include - -#include "main.h" +#include "ArchiveUtil.h" #include "FrontendUtil.h" #include "Config.h" #include "SharedConfig.h" @@ -41,6 +38,8 @@ char ROMPath [ROMSlot_MAX][1024]; char SRAMPath [ROMSlot_MAX][1024]; char PrevSRAMPath[ROMSlot_MAX][1024]; // for savestate 'undo load' +char NDSROMExtension[4]; + bool SavestateLoaded; ARCodeFile* CheatFile; @@ -287,7 +286,7 @@ int LoadBIOS() return Load_OK; } -int LoadROM(const QByteArray *romdata, QString archivefilename, QString romfilename, int slot) +int LoadROM(const u8 *romdata, u32 romlength, const char *archivefilename, const char *romfilename, const char *sramfilename, int slot) { int res; bool directboot = Config::DirectBoot != 0; @@ -332,13 +331,12 @@ int LoadROM(const QByteArray *romdata, QString archivefilename, QString romfilen strncpy(oldpath, ROMPath[slot], 1024); strncpy(oldsram, SRAMPath[slot], 1024); - QString sramFile = QFileInfo(archivefilename).absolutePath() + QDir::separator() + QFileInfo(romfilename).completeBaseName() + ".sav"; - strncpy(SRAMPath[slot], QDir::cleanPath(sramFile).toStdString().c_str(), 1024); - strncpy(ROMPath[slot], archivefilename.toStdString().c_str(), 1024); + strncpy(SRAMPath[slot], sramfilename, 1024); + strncpy(ROMPath[slot], archivefilename, 1024); NDS::SetConsoleType(Config::ConsoleType); - if (slot == ROMSlot_NDS && NDS::LoadROM((const u8*)romdata->constData(), romdata->size(), SRAMPath[slot], directboot)) + if (slot == ROMSlot_NDS && NDS::LoadROM(romdata, romlength, SRAMPath[slot], directboot)) { SavestateLoaded = false; @@ -351,7 +349,7 @@ int LoadROM(const QByteArray *romdata, QString archivefilename, QString romfilen strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety return Load_OK; } - else if (slot == ROMSlot_GBA && NDS::LoadGBAROM((const u8*)romdata->constData(), romdata->size(), romfilename.toStdString().c_str(), SRAMPath[slot])) + else if (slot == ROMSlot_GBA && NDS::LoadGBAROM(romdata, romlength, romfilename, SRAMPath[slot])) { SavestateLoaded = false; // checkme?? @@ -505,8 +503,10 @@ int Reset() } else { - QString fileName(ROMPath[ROMSlot_NDS]); - if(fileName.endsWith(".nds") || fileName.endsWith(".srl") || fileName.endsWith(".dsi")) + char ext[5] = {0}; int _len = strlen(ROMPath[ROMSlot_NDS]); + strncpy(ext, ROMPath[ROMSlot_NDS] + _len - 4, 4); + + if(!strncmp(ext, ".nds", 4) || !strncmp(ext, ".srl", 4) || !strncmp(ext, ".dsi", 4)) { SetupSRAMPath(0); if (!NDS::LoadROM(ROMPath[ROMSlot_NDS], SRAMPath[ROMSlot_NDS], directboot)) @@ -514,23 +514,35 @@ int Reset() } else { - QByteArray romBuffer; - QString romFileName = MainWindow::pickAndExtractFileFromArchive(fileName, &romBuffer); - if(romFileName.isEmpty()) - return Load_ROMLoadError; - QString sramFile = QFileInfo(fileName).absolutePath() + QDir::separator() + QFileInfo(romFileName).completeBaseName() + ".sav"; - strncpy(SRAMPath[0], QDir::cleanPath(sramFile).toStdString().c_str(), 1024); - if(!NDS::LoadROM((const u8*)romBuffer.constData(), romBuffer.size(), SRAMPath[ROMSlot_NDS], directboot)) + u8 *romdata = nullptr; u32 romlen; + char romfilename[1024] = {0}, sramfilename[1024]; + strncpy(sramfilename, SRAMPath[ROMSlot_NDS], 1024); // Use existing SRAMPath + + int pos = strlen(sramfilename) - 1; + while(pos > 0 && sramfilename[pos] != '/' && sramfilename[pos] != '\\') + --pos; + + strncpy(romfilename, &sramfilename[pos + 1], 1024); + strncpy(&romfilename[strlen(romfilename) - 3], NDSROMExtension, 3); // extension could be nds, srl or dsi + printf("RESET loading from archive : %s\n", romfilename); + romlen = Archive::ExtractFileFromArchive(ROMPath[ROMSlot_NDS], romfilename, &romdata); + if(!romdata) return Load_ROMLoadError; + bool ok = NDS::LoadROM(romdata, romlen, sramfilename, directboot); + delete romdata; + if(!ok) + return Load_ROMLoadError; } } if (ROMPath[ROMSlot_GBA][0] != '\0') { - QString fileName(ROMPath[ROMSlot_GBA]); - if(fileName.endsWith(".gba")) + char ext[5] = {0}; int _len = strlen(ROMPath[ROMSlot_GBA]); + strncpy(ext, ROMPath[ROMSlot_NDS] + _len - 4, 4); + + if(!strncmp(ext, ".gba", 4)) { SetupSRAMPath(1); if (!NDS::LoadGBAROM(ROMPath[ROMSlot_GBA], SRAMPath[ROMSlot_GBA])) @@ -538,13 +550,24 @@ int Reset() } else { - QByteArray romBuffer; - QString romFileName = MainWindow::pickAndExtractFileFromArchive(fileName, &romBuffer); - if(romFileName.isEmpty()) + u8 *romdata = nullptr; u32 romlen; + char romfilename[1024] = {0}, sramfilename[1024]; + strncpy(sramfilename, SRAMPath[ROMSlot_GBA], 1024); // Use existing SRAMPath + + int pos = strlen(sramfilename) - 1; + while(pos > 0 && sramfilename[pos] != '/' && sramfilename[pos] != '\\') + --pos; + + strncpy(romfilename, &sramfilename[pos + 1], 1024); + strncpy(&romfilename[strlen(romfilename) - 3], "gba", 3); + printf("RESET loading from archive : %s\n", romfilename); + romlen = Archive::ExtractFileFromArchive(ROMPath[ROMSlot_GBA], romfilename, &romdata); + if(!romdata) return Load_ROMLoadError; - QString sramFile = QFileInfo(fileName).absolutePath() + QDir::separator() + QFileInfo(romFileName).completeBaseName() + ".sav"; - strncpy(SRAMPath[1], QDir::cleanPath(sramFile).toStdString().c_str(), 1024); - if(!NDS::LoadGBAROM((const u8*)romBuffer.constData(), romBuffer.size(), romFileName.toStdString().c_str(), SRAMPath[ROMSlot_GBA])) + + bool ok = NDS::LoadGBAROM(romdata, romlen, romfilename, SRAMPath[ROMSlot_GBA]); + delete romdata; + if(!ok) return Load_ROMLoadError; } @@ -571,8 +594,10 @@ void GetSavestateName(int slot, char* filename, int len) else { char *rompath; - QString _filename(ROMPath[ROMSlot_NDS]); - if(_filename.endsWith(".nds") || _filename.endsWith(".srl") || _filename.endsWith(".dsi")) + char ext[5] = {0}; int _len = strlen(ROMPath[ROMSlot_NDS]); + strncpy(ext, ROMPath[ROMSlot_NDS] + _len - 4, 4); + + if(!strncmp(ext, ".nds", 4) || !strncmp(ext, ".srl", 4) || !strncmp(ext, ".dsi", 4)) rompath = ROMPath[ROMSlot_NDS]; else rompath = SRAMPath[ROMSlot_NDS]; // If archive, construct ssname from sram file diff --git a/src/frontend/qt_sdl/ArchiveUtil.cpp b/src/frontend/qt_sdl/ArchiveUtil.cpp index 470e035a..c1f2fc17 100644 --- a/src/frontend/qt_sdl/ArchiveUtil.cpp +++ b/src/frontend/qt_sdl/ArchiveUtil.cpp @@ -92,5 +92,21 @@ QVector ExtractFileFromArchive(const char* path, const char* wantedFile } +u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdata) +{ + QByteArray romBuffer; + QVector extractResult = ExtractFileFromArchive(path, wantedFile, &romBuffer); + + if(extractResult[0] == "Err") + { + return 0; + } + + u32 len = romBuffer.size(); + *romdata = new u8[romBuffer.size()]; + memcpy(*romdata, romBuffer.data(), len); + + return len; +} } diff --git a/src/frontend/qt_sdl/ArchiveUtil.h b/src/frontend/qt_sdl/ArchiveUtil.h index 40d5d36f..3095f07b 100644 --- a/src/frontend/qt_sdl/ArchiveUtil.h +++ b/src/frontend/qt_sdl/ArchiveUtil.h @@ -19,6 +19,7 @@ namespace Archive QVector ListArchive(const char* path); QVector ExtractFileFromArchive(const char* path, const char* wantedFile, QByteArray *romBuffer); +u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdata); } diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index ede0bd48..38607882 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -1458,7 +1458,14 @@ void MainWindow::dropEvent(QDropEvent* event) else { slot = (romFileName.endsWith(".gba") ? 1 : 0); - res = Frontend::LoadROM(&romBuffer, _filename, romFileName, slot); + QString sramFileName = QFileInfo(_filename).absolutePath() + QDir::separator() + QFileInfo(romFileName).completeBaseName() + ".sav"; + + if(slot == 0) + strncpy(Frontend::NDSROMExtension, QFileInfo(romFileName).suffix().toStdString().c_str(), 4); + + res = Frontend::LoadROM((const u8*)romBuffer.constData(), romBuffer.size(), + _filename, romFileName.toStdString().c_str(), sramFileName.toStdString().c_str(), + slot); } } @@ -1533,16 +1540,25 @@ void MainWindow::loadROM(QByteArray *romData, QString archiveFileName, QString r // Strip entire archive name and get folder path strncpy(Config::LastROMFolder, QFileInfo(archiveFileName).absolutePath().toStdString().c_str(), 1024); + QString sramFileName = QFileInfo(archiveFileName).absolutePath() + QDir::separator() + QFileInfo(romFileName).completeBaseName() + ".sav"; + int slot; int res; if (romFileName.endsWith("gba")) { slot = 1; - res = Frontend::LoadROM(romData, archiveFileName, romFileName, Frontend::ROMSlot_GBA); + res = Frontend::LoadROM((const u8*)romData->constData(), romData->size(), + archiveFileName.toStdString().c_str(), + romFileName.toStdString().c_str(), sramFileName.toStdString().c_str(), + Frontend::ROMSlot_GBA); } else { + strncpy(Frontend::NDSROMExtension, QFileInfo(romFileName).suffix().toStdString().c_str(), 4); slot = 0; - res = Frontend::LoadROM(romData, archiveFileName, romFileName, Frontend::ROMSlot_NDS); + res = Frontend::LoadROM((const u8*)romData->constData(), romData->size(), + archiveFileName.toStdString().c_str(), + romFileName.toStdString().c_str(), sramFileName.toStdString().c_str(), + Frontend::ROMSlot_NDS); } if (res != Frontend::Load_OK) diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index 3db3bd23..6353a486 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -177,8 +177,6 @@ public: bool hasOGL; QOpenGLContext* getOGLContext(); - static QString pickAndExtractFileFromArchive(QString archiveFileName, QByteArray *romBuffer); - protected: void resizeEvent(QResizeEvent* event) override; @@ -247,6 +245,8 @@ private: void loadROM(QString filename); void loadROM(QByteArray *romData, QString archiveFileName, QString romFileName); + QString pickAndExtractFileFromArchive(QString archiveFileName, QByteArray *romBuffer); + void createScreenPanel(); QString loadErrorStr(int error);