mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-26 07:39:56 -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 char SRAMPath[ROMSlot_MAX][1024];
|
||||||
extern bool SavestateLoaded;
|
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
|
// initialize the ROM handling utility
|
||||||
void Init_ROM();
|
void Init_ROM();
|
||||||
@ -79,7 +81,7 @@ int LoadBIOS();
|
|||||||
// load a ROM file to the specified cart slot
|
// load a ROM file to the specified cart slot
|
||||||
// note: loading a ROM to the NDS slot resets emulation
|
// note: loading a ROM to the NDS slot resets emulation
|
||||||
int LoadROM(const char* file, int slot);
|
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
|
// unload the ROM loaded in the specified cart slot
|
||||||
// simulating ejection of the cartridge
|
// simulating ejection of the cartridge
|
||||||
|
@ -19,10 +19,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include <QFileInfo>
|
#include "ArchiveUtil.h"
|
||||||
#include <QDir>
|
|
||||||
|
|
||||||
#include "main.h"
|
|
||||||
#include "FrontendUtil.h"
|
#include "FrontendUtil.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include "SharedConfig.h"
|
#include "SharedConfig.h"
|
||||||
@ -41,6 +38,8 @@ char ROMPath [ROMSlot_MAX][1024];
|
|||||||
char SRAMPath [ROMSlot_MAX][1024];
|
char SRAMPath [ROMSlot_MAX][1024];
|
||||||
char PrevSRAMPath[ROMSlot_MAX][1024]; // for savestate 'undo load'
|
char PrevSRAMPath[ROMSlot_MAX][1024]; // for savestate 'undo load'
|
||||||
|
|
||||||
|
char NDSROMExtension[4];
|
||||||
|
|
||||||
bool SavestateLoaded;
|
bool SavestateLoaded;
|
||||||
|
|
||||||
ARCodeFile* CheatFile;
|
ARCodeFile* CheatFile;
|
||||||
@ -287,7 +286,7 @@ int LoadBIOS()
|
|||||||
return Load_OK;
|
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;
|
int res;
|
||||||
bool directboot = Config::DirectBoot != 0;
|
bool directboot = Config::DirectBoot != 0;
|
||||||
@ -332,13 +331,12 @@ int LoadROM(const QByteArray *romdata, QString archivefilename, QString romfilen
|
|||||||
strncpy(oldpath, ROMPath[slot], 1024);
|
strncpy(oldpath, ROMPath[slot], 1024);
|
||||||
strncpy(oldsram, SRAMPath[slot], 1024);
|
strncpy(oldsram, SRAMPath[slot], 1024);
|
||||||
|
|
||||||
QString sramFile = QFileInfo(archivefilename).absolutePath() + QDir::separator() + QFileInfo(romfilename).completeBaseName() + ".sav";
|
strncpy(SRAMPath[slot], sramfilename, 1024);
|
||||||
strncpy(SRAMPath[slot], QDir::cleanPath(sramFile).toStdString().c_str(), 1024);
|
strncpy(ROMPath[slot], archivefilename, 1024);
|
||||||
strncpy(ROMPath[slot], archivefilename.toStdString().c_str(), 1024);
|
|
||||||
|
|
||||||
NDS::SetConsoleType(Config::ConsoleType);
|
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;
|
SavestateLoaded = false;
|
||||||
|
|
||||||
@ -351,7 +349,7 @@ int LoadROM(const QByteArray *romdata, QString archivefilename, QString romfilen
|
|||||||
strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety
|
strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety
|
||||||
return Load_OK;
|
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??
|
SavestateLoaded = false; // checkme??
|
||||||
|
|
||||||
@ -505,8 +503,10 @@ int Reset()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QString fileName(ROMPath[ROMSlot_NDS]);
|
char ext[5] = {0}; int _len = strlen(ROMPath[ROMSlot_NDS]);
|
||||||
if(fileName.endsWith(".nds") || fileName.endsWith(".srl") || fileName.endsWith(".dsi"))
|
strncpy(ext, ROMPath[ROMSlot_NDS] + _len - 4, 4);
|
||||||
|
|
||||||
|
if(!strncmp(ext, ".nds", 4) || !strncmp(ext, ".srl", 4) || !strncmp(ext, ".dsi", 4))
|
||||||
{
|
{
|
||||||
SetupSRAMPath(0);
|
SetupSRAMPath(0);
|
||||||
if (!NDS::LoadROM(ROMPath[ROMSlot_NDS], SRAMPath[ROMSlot_NDS], directboot))
|
if (!NDS::LoadROM(ROMPath[ROMSlot_NDS], SRAMPath[ROMSlot_NDS], directboot))
|
||||||
@ -514,23 +514,35 @@ int Reset()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QByteArray romBuffer;
|
u8 *romdata = nullptr; u32 romlen;
|
||||||
QString romFileName = MainWindow::pickAndExtractFileFromArchive(fileName, &romBuffer);
|
char romfilename[1024] = {0}, sramfilename[1024];
|
||||||
if(romFileName.isEmpty())
|
strncpy(sramfilename, SRAMPath[ROMSlot_NDS], 1024); // Use existing SRAMPath
|
||||||
return Load_ROMLoadError;
|
|
||||||
QString sramFile = QFileInfo(fileName).absolutePath() + QDir::separator() + QFileInfo(romFileName).completeBaseName() + ".sav";
|
int pos = strlen(sramfilename) - 1;
|
||||||
strncpy(SRAMPath[0], QDir::cleanPath(sramFile).toStdString().c_str(), 1024);
|
while(pos > 0 && sramfilename[pos] != '/' && sramfilename[pos] != '\\')
|
||||||
if(!NDS::LoadROM((const u8*)romBuffer.constData(), romBuffer.size(), SRAMPath[ROMSlot_NDS], directboot))
|
--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;
|
return Load_ROMLoadError;
|
||||||
|
|
||||||
|
bool ok = NDS::LoadROM(romdata, romlen, sramfilename, directboot);
|
||||||
|
delete romdata;
|
||||||
|
if(!ok)
|
||||||
|
return Load_ROMLoadError;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ROMPath[ROMSlot_GBA][0] != '\0')
|
if (ROMPath[ROMSlot_GBA][0] != '\0')
|
||||||
{
|
{
|
||||||
QString fileName(ROMPath[ROMSlot_GBA]);
|
char ext[5] = {0}; int _len = strlen(ROMPath[ROMSlot_GBA]);
|
||||||
if(fileName.endsWith(".gba"))
|
strncpy(ext, ROMPath[ROMSlot_NDS] + _len - 4, 4);
|
||||||
|
|
||||||
|
if(!strncmp(ext, ".gba", 4))
|
||||||
{
|
{
|
||||||
SetupSRAMPath(1);
|
SetupSRAMPath(1);
|
||||||
if (!NDS::LoadGBAROM(ROMPath[ROMSlot_GBA], SRAMPath[ROMSlot_GBA]))
|
if (!NDS::LoadGBAROM(ROMPath[ROMSlot_GBA], SRAMPath[ROMSlot_GBA]))
|
||||||
@ -538,13 +550,24 @@ int Reset()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QByteArray romBuffer;
|
u8 *romdata = nullptr; u32 romlen;
|
||||||
QString romFileName = MainWindow::pickAndExtractFileFromArchive(fileName, &romBuffer);
|
char romfilename[1024] = {0}, sramfilename[1024];
|
||||||
if(romFileName.isEmpty())
|
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;
|
return Load_ROMLoadError;
|
||||||
QString sramFile = QFileInfo(fileName).absolutePath() + QDir::separator() + QFileInfo(romFileName).completeBaseName() + ".sav";
|
|
||||||
strncpy(SRAMPath[1], QDir::cleanPath(sramFile).toStdString().c_str(), 1024);
|
bool ok = NDS::LoadGBAROM(romdata, romlen, romfilename, SRAMPath[ROMSlot_GBA]);
|
||||||
if(!NDS::LoadGBAROM((const u8*)romBuffer.constData(), romBuffer.size(), romFileName.toStdString().c_str(), SRAMPath[ROMSlot_GBA]))
|
delete romdata;
|
||||||
|
if(!ok)
|
||||||
return Load_ROMLoadError;
|
return Load_ROMLoadError;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -571,8 +594,10 @@ void GetSavestateName(int slot, char* filename, int len)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
char *rompath;
|
char *rompath;
|
||||||
QString _filename(ROMPath[ROMSlot_NDS]);
|
char ext[5] = {0}; int _len = strlen(ROMPath[ROMSlot_NDS]);
|
||||||
if(_filename.endsWith(".nds") || _filename.endsWith(".srl") || _filename.endsWith(".dsi"))
|
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];
|
rompath = ROMPath[ROMSlot_NDS];
|
||||||
else
|
else
|
||||||
rompath = SRAMPath[ROMSlot_NDS]; // If archive, construct ssname from sram file
|
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> ListArchive(const char* path);
|
||||||
QVector<QString> ExtractFileFromArchive(const char* path, const char* wantedFile, QByteArray *romBuffer);
|
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
|
else
|
||||||
{
|
{
|
||||||
slot = (romFileName.endsWith(".gba") ? 1 : 0);
|
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
|
// Strip entire archive name and get folder path
|
||||||
strncpy(Config::LastROMFolder, QFileInfo(archiveFileName).absolutePath().toStdString().c_str(), 1024);
|
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;
|
int slot; int res;
|
||||||
if (romFileName.endsWith("gba"))
|
if (romFileName.endsWith("gba"))
|
||||||
{
|
{
|
||||||
slot = 1;
|
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
|
else
|
||||||
{
|
{
|
||||||
|
strncpy(Frontend::NDSROMExtension, QFileInfo(romFileName).suffix().toStdString().c_str(), 4);
|
||||||
slot = 0;
|
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)
|
if (res != Frontend::Load_OK)
|
||||||
|
@ -177,8 +177,6 @@ public:
|
|||||||
bool hasOGL;
|
bool hasOGL;
|
||||||
QOpenGLContext* getOGLContext();
|
QOpenGLContext* getOGLContext();
|
||||||
|
|
||||||
static QString pickAndExtractFileFromArchive(QString archiveFileName, QByteArray *romBuffer);
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void resizeEvent(QResizeEvent* event) override;
|
void resizeEvent(QResizeEvent* event) override;
|
||||||
|
|
||||||
@ -247,6 +245,8 @@ private:
|
|||||||
void loadROM(QString filename);
|
void loadROM(QString filename);
|
||||||
void loadROM(QByteArray *romData, QString archiveFileName, QString romFileName);
|
void loadROM(QByteArray *romData, QString archiveFileName, QString romFileName);
|
||||||
|
|
||||||
|
QString pickAndExtractFileFromArchive(QString archiveFileName, QByteArray *romBuffer);
|
||||||
|
|
||||||
void createScreenPanel();
|
void createScreenPanel();
|
||||||
|
|
||||||
QString loadErrorStr(int error);
|
QString loadErrorStr(int error);
|
||||||
|
Reference in New Issue
Block a user