mirror of
https://github.com/melonDS-emu/melonDS.git
synced 2025-07-23 06:10:03 -06:00
Merge pull request #550 from rzumer/slot2
Support GBA game cartridges for DS connectivity
This commit is contained in:
@ -38,6 +38,7 @@
|
||||
#include "DlgWifiSettings.h"
|
||||
|
||||
#include "../NDS.h"
|
||||
#include "../GBACart.h"
|
||||
#include "../GPU.h"
|
||||
#include "../SPU.h"
|
||||
#include "../Wifi.h"
|
||||
@ -105,9 +106,9 @@ int EmuRunning;
|
||||
volatile int EmuStatus;
|
||||
|
||||
bool RunningSomething;
|
||||
char ROMPath[1024];
|
||||
char SRAMPath[1024];
|
||||
char PrevSRAMPath[1024]; // for savestate 'undo load'
|
||||
char ROMPath[2][1024];
|
||||
char SRAMPath[2][1024];
|
||||
char PrevSRAMPath[2][1024]; // for savestate 'undo load'
|
||||
|
||||
bool SavestateLoaded;
|
||||
|
||||
@ -184,7 +185,7 @@ void SetupScreenRects(int width, int height);
|
||||
void TogglePause(void* blarg);
|
||||
void Reset(void* blarg);
|
||||
|
||||
void SetupSRAMPath();
|
||||
void SetupSRAMPath(int slot);
|
||||
|
||||
void SaveState(int slot);
|
||||
void LoadState(int slot);
|
||||
@ -954,6 +955,24 @@ int EmuThreadFunc(void* burp)
|
||||
if (HotkeyPressed(HK_Pause)) uiQueueMain(TogglePause, NULL);
|
||||
if (HotkeyPressed(HK_Reset)) uiQueueMain(Reset, NULL);
|
||||
|
||||
if (GBACart::CartInserted && GBACart::HasSolarSensor)
|
||||
{
|
||||
if (HotkeyPressed(HK_SolarSensorDecrease))
|
||||
{
|
||||
if (GBACart_SolarSensor::LightLevel > 0) GBACart_SolarSensor::LightLevel--;
|
||||
char msg[64];
|
||||
sprintf(msg, "Solar sensor level set to %d", GBACart_SolarSensor::LightLevel);
|
||||
OSD::AddMessage(0, msg);
|
||||
}
|
||||
if (HotkeyPressed(HK_SolarSensorIncrease))
|
||||
{
|
||||
if (GBACart_SolarSensor::LightLevel < 10) GBACart_SolarSensor::LightLevel++;
|
||||
char msg[64];
|
||||
sprintf(msg, "Solar sensor level set to %d", GBACart_SolarSensor::LightLevel);
|
||||
OSD::AddMessage(0, msg);
|
||||
}
|
||||
}
|
||||
|
||||
if (EmuRunning == 1)
|
||||
{
|
||||
EmuStatus = 1;
|
||||
@ -1663,12 +1682,18 @@ void Reset(void* blarg)
|
||||
SavestateLoaded = false;
|
||||
uiMenuItemDisable(MenuItem_UndoStateLoad);
|
||||
|
||||
if (ROMPath[0] == '\0')
|
||||
if (ROMPath[0][0] == '\0')
|
||||
NDS::LoadBIOS();
|
||||
else
|
||||
{
|
||||
SetupSRAMPath();
|
||||
NDS::LoadROM(ROMPath, SRAMPath, Config::DirectBoot);
|
||||
SetupSRAMPath(0);
|
||||
NDS::LoadROM(ROMPath[0], SRAMPath[0], Config::DirectBoot);
|
||||
}
|
||||
|
||||
if (ROMPath[1][0] != '\0')
|
||||
{
|
||||
SetupSRAMPath(1);
|
||||
NDS::LoadGBAROM(ROMPath[1], SRAMPath[1]);
|
||||
}
|
||||
|
||||
Run();
|
||||
@ -1683,6 +1708,10 @@ void Stop(bool internal)
|
||||
while (EmuStatus != 2);
|
||||
RunningSomething = false;
|
||||
|
||||
// eject any inserted GBA cartridge
|
||||
GBACart::Eject();
|
||||
ROMPath[1][0] = '\0';
|
||||
|
||||
uiWindowSetTitle(MainWindow, "melonDS " MELONDS_VERSION);
|
||||
|
||||
for (int i = 0; i < 9; i++) uiMenuItemDisable(MenuItem_SaveStateSlot[i]);
|
||||
@ -1703,41 +1732,53 @@ void Stop(bool internal)
|
||||
OSD::AddMessage(0xFFC040, "Shutdown");
|
||||
}
|
||||
|
||||
void SetupSRAMPath()
|
||||
void SetupSRAMPath(int slot)
|
||||
{
|
||||
strncpy(SRAMPath, ROMPath, 1023);
|
||||
SRAMPath[1023] = '\0';
|
||||
strncpy(SRAMPath + strlen(ROMPath) - 3, "sav", 3);
|
||||
strncpy(SRAMPath[slot], ROMPath[slot], 1023);
|
||||
SRAMPath[slot][1023] = '\0';
|
||||
strncpy(SRAMPath[slot] + strlen(ROMPath[slot]) - 3, "sav", 3);
|
||||
}
|
||||
|
||||
void TryLoadROM(char* file, int prevstatus)
|
||||
void TryLoadROM(char* file, int slot, int prevstatus)
|
||||
{
|
||||
char oldpath[1024];
|
||||
char oldsram[1024];
|
||||
strncpy(oldpath, ROMPath, 1024);
|
||||
strncpy(oldsram, SRAMPath, 1024);
|
||||
strncpy(oldpath, ROMPath[slot], 1024);
|
||||
strncpy(oldsram, SRAMPath[slot], 1024);
|
||||
|
||||
strncpy(ROMPath, file, 1023);
|
||||
ROMPath[1023] = '\0';
|
||||
strncpy(ROMPath[slot], file, 1023);
|
||||
ROMPath[slot][1023] = '\0';
|
||||
|
||||
SetupSRAMPath();
|
||||
SetupSRAMPath(0);
|
||||
SetupSRAMPath(1);
|
||||
|
||||
if (NDS::LoadROM(ROMPath, SRAMPath, Config::DirectBoot))
|
||||
if (slot == 0 && NDS::LoadROM(ROMPath[slot], SRAMPath[slot], Config::DirectBoot))
|
||||
{
|
||||
SavestateLoaded = false;
|
||||
uiMenuItemDisable(MenuItem_UndoStateLoad);
|
||||
|
||||
strncpy(PrevSRAMPath, SRAMPath, 1024); // safety
|
||||
// Reload the inserted GBA cartridge (if any)
|
||||
if (ROMPath[1][0] != '\0') NDS::LoadGBAROM(ROMPath[1], SRAMPath[1]);
|
||||
|
||||
strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety
|
||||
Run();
|
||||
}
|
||||
else if (slot == 1 && NDS::LoadGBAROM(ROMPath[slot], SRAMPath[slot]))
|
||||
{
|
||||
SavestateLoaded = false;
|
||||
uiMenuItemDisable(MenuItem_UndoStateLoad);
|
||||
|
||||
strncpy(PrevSRAMPath[slot], SRAMPath[slot], 1024); // safety
|
||||
if (RunningSomething) Run(); // do not start just from a GBA cart
|
||||
}
|
||||
else
|
||||
{
|
||||
uiMsgBoxError(MainWindow,
|
||||
"Failed to load the ROM",
|
||||
"Make sure the file can be accessed and isn't opened in another application.");
|
||||
|
||||
strncpy(ROMPath, oldpath, 1024);
|
||||
strncpy(SRAMPath, oldsram, 1024);
|
||||
strncpy(ROMPath[slot], oldpath, 1024);
|
||||
strncpy(SRAMPath[slot], oldsram, 1024);
|
||||
EmuRunning = prevstatus;
|
||||
}
|
||||
}
|
||||
@ -1750,22 +1791,22 @@ void GetSavestateName(int slot, char* filename, int len)
|
||||
{
|
||||
int pos;
|
||||
|
||||
if (ROMPath[0] == '\0') // running firmware, no ROM
|
||||
if (ROMPath[0][0] == '\0') // running firmware, no ROM
|
||||
{
|
||||
strcpy(filename, "firmware");
|
||||
pos = 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
int l = strlen(ROMPath);
|
||||
int l = strlen(ROMPath[0]);
|
||||
pos = l;
|
||||
while (ROMPath[pos] != '.' && pos > 0) pos--;
|
||||
while (ROMPath[0][pos] != '.' && pos > 0) pos--;
|
||||
if (pos == 0) pos = l;
|
||||
|
||||
// avoid buffer overflow. shoddy
|
||||
if (pos > len-5) pos = len-5;
|
||||
|
||||
strncpy(&filename[0], ROMPath, pos);
|
||||
strncpy(&filename[0], ROMPath[0], pos);
|
||||
}
|
||||
strcpy(&filename[pos], ".ml");
|
||||
filename[pos+3] = '0'+slot;
|
||||
@ -1809,6 +1850,8 @@ void LoadState(int slot)
|
||||
return;
|
||||
}
|
||||
|
||||
u32 oldGBACartCRC = GBACart::CartCRC;
|
||||
|
||||
// backup
|
||||
Savestate* backup = new Savestate("timewarp.mln", true);
|
||||
NDS::DoSavestate(backup);
|
||||
@ -1833,21 +1876,36 @@ void LoadState(int slot)
|
||||
|
||||
if (!failed)
|
||||
{
|
||||
if (Config::SavestateRelocSRAM && ROMPath[0]!='\0')
|
||||
if (Config::SavestateRelocSRAM && ROMPath[0][0]!='\0')
|
||||
{
|
||||
strncpy(PrevSRAMPath, SRAMPath, 1024);
|
||||
strncpy(PrevSRAMPath[0], SRAMPath[0], 1024);
|
||||
|
||||
strncpy(SRAMPath, filename, 1019);
|
||||
int len = strlen(SRAMPath);
|
||||
strcpy(&SRAMPath[len], ".sav");
|
||||
SRAMPath[len+4] = '\0';
|
||||
strncpy(SRAMPath[0], filename, 1019);
|
||||
int len = strlen(SRAMPath[0]);
|
||||
strcpy(&SRAMPath[0][len], ".sav");
|
||||
SRAMPath[0][len+4] = '\0';
|
||||
|
||||
NDS::RelocateSave(SRAMPath, false);
|
||||
NDS::RelocateSave(SRAMPath[0], false);
|
||||
}
|
||||
|
||||
bool loadedPartialGBAROM = false;
|
||||
|
||||
// in case we have a GBA cart inserted, and the GBA ROM changes
|
||||
// due to having loaded a save state, we do not want to reload
|
||||
// the previous cartridge on reset, or commit writes to any
|
||||
// loaded save file. therefore, their paths are "nulled".
|
||||
if (GBACart::CartInserted && GBACart::CartCRC != oldGBACartCRC)
|
||||
{
|
||||
ROMPath[1][0] = '\0';
|
||||
SRAMPath[1][0] = '\0';
|
||||
loadedPartialGBAROM = true;
|
||||
}
|
||||
|
||||
char msg[64];
|
||||
if (slot > 0) sprintf(msg, "State loaded from slot %d", slot);
|
||||
else sprintf(msg, "State loaded from file");
|
||||
if (slot > 0) sprintf(msg, "State loaded from slot %d%s",
|
||||
slot, loadedPartialGBAROM ? " (GBA ROM header only)" : "");
|
||||
else sprintf(msg, "State loaded from file%s",
|
||||
loadedPartialGBAROM ? " (GBA ROM header only)" : "");
|
||||
OSD::AddMessage(0, msg);
|
||||
|
||||
SavestateLoaded = true;
|
||||
@ -1898,14 +1956,14 @@ void SaveState(int slot)
|
||||
if (slot > 0)
|
||||
uiMenuItemEnable(MenuItem_LoadStateSlot[slot-1]);
|
||||
|
||||
if (Config::SavestateRelocSRAM && ROMPath[0]!='\0')
|
||||
if (Config::SavestateRelocSRAM && ROMPath[0][0]!='\0')
|
||||
{
|
||||
strncpy(SRAMPath, filename, 1019);
|
||||
int len = strlen(SRAMPath);
|
||||
strcpy(&SRAMPath[len], ".sav");
|
||||
SRAMPath[len+4] = '\0';
|
||||
strncpy(SRAMPath[0], filename, 1019);
|
||||
int len = strlen(SRAMPath[0]);
|
||||
strcpy(&SRAMPath[0][len], ".sav");
|
||||
SRAMPath[0][len+4] = '\0';
|
||||
|
||||
NDS::RelocateSave(SRAMPath, true);
|
||||
NDS::RelocateSave(SRAMPath[0], true);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1932,10 +1990,10 @@ void UndoStateLoad()
|
||||
NDS::DoSavestate(backup);
|
||||
delete backup;
|
||||
|
||||
if (ROMPath[0]!='\0')
|
||||
if (ROMPath[0][0]!='\0')
|
||||
{
|
||||
strncpy(SRAMPath, PrevSRAMPath, 1024);
|
||||
NDS::RelocateSave(SRAMPath, false);
|
||||
strncpy(SRAMPath[0], PrevSRAMPath[0], 1024);
|
||||
NDS::RelocateSave(SRAMPath[0], false);
|
||||
}
|
||||
|
||||
OSD::AddMessage(0, "State load undone");
|
||||
@ -1979,7 +2037,11 @@ void OnDropFile(uiWindow* window, char* file, void* blarg)
|
||||
while (EmuStatus != 2);
|
||||
}
|
||||
|
||||
TryLoadROM(file, prevstatus);
|
||||
TryLoadROM(file, 0, prevstatus);
|
||||
}
|
||||
else if (!strcasecmp(ext, "gba"))
|
||||
{
|
||||
TryLoadROM(file, 1, prevstatus);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2010,7 +2072,7 @@ void OnOpenFile(uiMenuItem* item, uiWindow* window, void* blarg)
|
||||
EmuRunning = 2;
|
||||
while (EmuStatus != 2);
|
||||
|
||||
char* file = uiOpenFile(window, "DS ROM (*.nds)|*.nds;*.srl|Any file|*.*", Config::LastROMFolder);
|
||||
char* file = uiOpenFile(window, "DS ROM (*.nds)|*.nds;*.srl|GBA ROM (*.gba)|*.gba|Any file|*.*", Config::LastROMFolder);
|
||||
if (!file)
|
||||
{
|
||||
EmuRunning = prevstatus;
|
||||
@ -2021,8 +2083,17 @@ void OnOpenFile(uiMenuItem* item, uiWindow* window, void* blarg)
|
||||
while (file[pos] != '/' && file[pos] != '\\' && pos > 0) pos--;
|
||||
strncpy(Config::LastROMFolder, file, pos);
|
||||
Config::LastROMFolder[pos] = '\0';
|
||||
char* ext = &file[strlen(file)-3];
|
||||
|
||||
if (!strcasecmp(ext, "gba"))
|
||||
{
|
||||
TryLoadROM(file, 1, prevstatus);
|
||||
}
|
||||
else
|
||||
{
|
||||
TryLoadROM(file, 0, prevstatus);
|
||||
}
|
||||
|
||||
TryLoadROM(file, prevstatus);
|
||||
uiFreeText(file);
|
||||
}
|
||||
|
||||
@ -2047,8 +2118,14 @@ void OnRun(uiMenuItem* item, uiWindow* window, void* blarg)
|
||||
{
|
||||
if (!RunningSomething)
|
||||
{
|
||||
ROMPath[0] = '\0';
|
||||
ROMPath[0][0] = '\0';
|
||||
NDS::LoadBIOS();
|
||||
|
||||
if (ROMPath[1][0] != '\0')
|
||||
{
|
||||
SetupSRAMPath(1);
|
||||
NDS::LoadGBAROM(ROMPath[1], SRAMPath[1]);
|
||||
}
|
||||
}
|
||||
|
||||
Run();
|
||||
@ -2867,14 +2944,30 @@ int main(int argc, char** argv)
|
||||
|
||||
if (!strcasecmp(ext, "nds") || !strcasecmp(ext, "srl"))
|
||||
{
|
||||
strncpy(ROMPath, file, 1023);
|
||||
ROMPath[1023] = '\0';
|
||||
strncpy(ROMPath[0], file, 1023);
|
||||
ROMPath[0][1023] = '\0';
|
||||
|
||||
SetupSRAMPath();
|
||||
SetupSRAMPath(0);
|
||||
|
||||
if (NDS::LoadROM(ROMPath, SRAMPath, Config::DirectBoot))
|
||||
if (NDS::LoadROM(ROMPath[0], SRAMPath[0], Config::DirectBoot))
|
||||
Run();
|
||||
}
|
||||
|
||||
if (argc > 2)
|
||||
{
|
||||
file = argv[2];
|
||||
ext = &file[strlen(file)-3];
|
||||
|
||||
if (!strcasecmp(ext, "gba"))
|
||||
{
|
||||
strncpy(ROMPath[1], file, 1023);
|
||||
ROMPath[1][1023] = '\0';
|
||||
|
||||
SetupSRAMPath(1);
|
||||
|
||||
NDS::LoadGBAROM(ROMPath[1], SRAMPath[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uiMain();
|
||||
|
Reference in New Issue
Block a user