mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-25 07:10:00 -06:00
Remove QT stuff from Util_ROM
* Also, during reset, directly load file from archive (no rom picker) Signed-off-by: Madhav Kanbur <abcdjdj@gmail.com>
This commit is contained in:
@ -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
|
||||
|
@ -19,10 +19,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <QFileInfo>
|
||||
#include <QDir>
|
||||
|
||||
#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
|
||||
|
@ -92,5 +92,21 @@ QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile
|
||||
|
||||
}
|
||||
|
||||
u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdata)
|
||||
{
|
||||
QByteArray romBuffer;
|
||||
QVector<QString> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ namespace Archive
|
||||
|
||||
QVector<QString> ListArchive(const char* path);
|
||||
QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile, QByteArray *romBuffer);
|
||||
u32 ExtractFileFromArchive(const char* path, const char* wantedFile, u8 **romdata);
|
||||
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user