From c98b981813a272851f414e0521e2ea795f2a37b2 Mon Sep 17 00:00:00 2001 From: Madhav Kanbur Date: Mon, 11 Jan 2021 21:45:24 +0530 Subject: [PATCH] Extract gba roms to memory Signed-off-by: Madhav Kanbur --- src/GBACart.cpp | 14 ++++++++++++++ src/GBACart.h | 1 + src/NDS.cpp | 13 +++++++++++++ src/NDS.h | 1 + src/frontend/Util_ROM.cpp | 4 ++-- src/frontend/qt_sdl/main.cpp | 11 ++++------- 6 files changed, 35 insertions(+), 9 deletions(-) diff --git a/src/GBACart.cpp b/src/GBACart.cpp index 8baf2f71..1e153398 100644 --- a/src/GBACart.cpp +++ b/src/GBACart.cpp @@ -677,6 +677,20 @@ bool LoadROM(const char* path, const char* sram) return true; } +bool LoadROM(const u8* romdata, u32 filelength, const char *sram) +{ + CartROMSize = 0x200; + while (CartROMSize < filelength) + CartROMSize <<= 1; + + CartROM = new u8[CartROMSize]; + memcpy(CartROM, romdata, filelength); + + LoadROMCommon(sram); + + return true; +} + void RelocateSave(const char* path, bool write) { // derp herp diff --git a/src/GBACart.h b/src/GBACart.h index 96a05b8b..f976e6d5 100644 --- a/src/GBACart.h +++ b/src/GBACart.h @@ -66,6 +66,7 @@ void Eject(); void DoSavestate(Savestate* file); bool LoadROM(const char* path, const char* sram); +bool LoadROM(const u8* romdata, u32 filelength, const char *sram); void RelocateSave(const char* path, bool write); void WriteGPIO(u32 addr, u16 val); diff --git a/src/NDS.cpp b/src/NDS.cpp index df1ac9f2..6a3363d4 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -864,6 +864,19 @@ bool LoadGBAROM(const char* path, const char* sram) } } +bool LoadGBAROM(const u8* romdata, u32 filelength, const char *filename, const char *sram) +{ + if (GBACart::LoadROM(romdata, filelength, sram)) + { + return true; + } + else + { + printf("Failed to load ROM %s from archive\n", filename); + return false; + } +} + void LoadBIOS() { Reset(); diff --git a/src/NDS.h b/src/NDS.h index 3a8875a9..3d236475 100644 --- a/src/NDS.h +++ b/src/NDS.h @@ -195,6 +195,7 @@ void SetConsoleType(int type); bool LoadROM(const char* path, const char* sram, bool direct); bool LoadROM(const u8* romdata, u32 filelength, const char *sram, bool direct); bool LoadGBAROM(const char* path, const char* sram); +bool LoadGBAROM(const u8* romdata, u32 filelength, const char *filename, const char *sram); void LoadBIOS(); void SetupDirectBoot(); void RelocateSave(const char* path, bool write); diff --git a/src/frontend/Util_ROM.cpp b/src/frontend/Util_ROM.cpp index 46b96d1c..68cc7013 100644 --- a/src/frontend/Util_ROM.cpp +++ b/src/frontend/Util_ROM.cpp @@ -350,13 +350,13 @@ 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(ROMPath[slot], SRAMPath[slot])) + else if (slot == ROMSlot_GBA && NDS::LoadGBAROM((const u8*)romdata->constData(), romdata->size(), romfilename.toStdString().c_str(), SRAMPath[slot])) { SavestateLoaded = false; // checkme?? strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety return Load_OK; - }*/ + } else { strncpy(ROMPath[slot], oldpath, 1024); diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index f1bf5f4b..736ed506 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -1507,20 +1507,17 @@ void MainWindow::loadROM(QByteArray *romData, QString archiveFileName, QString r strncpy(Config::LastROMFolder, QFileInfo(archiveFileName).absolutePath().toStdString().c_str(), 1024); int slot; int res; - /*if (!strcasecmp(ext, "gba")) + if (romFileName.endsWith("gba")) { slot = 1; - res = Frontend::LoadROM(file, Frontend::ROMSlot_GBA); + res = Frontend::LoadROM(romData, archiveFileName, romFileName, Frontend::ROMSlot_GBA); } else { slot = 0; - res = Frontend::LoadROM(file, Frontend::ROMSlot_NDS); - }*/ + res = Frontend::LoadROM(romData, archiveFileName, romFileName, Frontend::ROMSlot_NDS); + } - // TODO: GBA support here! - slot = 0; - res = Frontend::LoadROM(romData, archiveFileName, romFileName, Frontend::ROMSlot_NDS); if (res != Frontend::Load_OK) { QMessageBox::critical(this,