aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/NDS.cpp10
-rw-r--r--src/NDS.h2
-rw-r--r--src/NDSCart.cpp15
-rw-r--r--src/libui_sdl/main.cpp40
4 files changed, 41 insertions, 26 deletions
diff --git a/src/NDS.cpp b/src/NDS.cpp
index d25c1ff..d4f6594 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -352,14 +352,18 @@ void Stop()
SPU::Stop();
}
-void LoadROM(const char* path, bool direct)
+bool LoadROM(const char* path, bool direct)
{
- Reset();
-
if (NDSCart::LoadROM(path, direct))
+ {
Running = true;
+ return true;
+ }
else
+ {
printf("Failed to load ROM %s\n", path);
+ return false;
+ }
}
void LoadBIOS()
diff --git a/src/NDS.h b/src/NDS.h
index 204c67d..6b76451 100644
--- a/src/NDS.h
+++ b/src/NDS.h
@@ -106,7 +106,7 @@ void DeInit();
void Reset();
void Stop();
-void LoadROM(const char* path, bool direct);
+bool LoadROM(const char* path, bool direct);
void LoadBIOS();
void SetupDirectBoot();
diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp
index 216b3fb..3d480f3 100644
--- a/src/NDSCart.cpp
+++ b/src/NDSCart.cpp
@@ -817,15 +817,14 @@ bool LoadROM(const char* path, bool direct)
// TODO: streaming mode? for really big ROMs or systems with limited RAM
// for now we're lazy
- if (CartROM) delete[] CartROM;
-
FILE* f = fopen(path, "rb");
if (!f)
{
- printf("Failed to open ROM file %s\n", path);
return false;
}
+ NDS::Reset();
+
fseek(f, 0, SEEK_END);
u32 len = (u32)ftell(f);
@@ -845,6 +844,11 @@ bool LoadROM(const char* path, bool direct)
fclose(f);
//CartROM = f;
+ // generate a ROM ID
+ // note: most games don't check the actual value
+ // it just has to stay the same throughout gameplay
+ CartID = 0x00001FC2;
+
if (direct)
{
NDS::SetupDirectBoot();
@@ -853,11 +857,6 @@ bool LoadROM(const char* path, bool direct)
CartInserted = true;
- // generate a ROM ID
- // note: most games don't check the actual value
- // it just has to stay the same throughout gameplay
- CartID = 0x00001FC2;
-
u32 arm9base = *(u32*)&CartROM[0x20];
if (arm9base < 0x8000)
{
diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp
index dceef64..c7f6120 100644
--- a/src/libui_sdl/main.cpp
+++ b/src/libui_sdl/main.cpp
@@ -400,6 +400,27 @@ void Stop(bool internal)
uiAreaQueueRedrawAll(MainDrawArea);
}
+void TryLoadROM(char* file, int prevstatus)
+{
+ char oldpath[1024];
+ strncpy(oldpath, ROMPath, 1024);
+
+ strncpy(ROMPath, file, 1023);
+ ROMPath[1023] = '\0';
+
+ if (NDS::LoadROM(ROMPath, Config::DirectBoot))
+ Run();
+ 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);
+ EmuRunning = prevstatus;
+ }
+}
+
int OnCloseWindow(uiWindow* window, void* blarg)
{
@@ -410,6 +431,7 @@ int OnCloseWindow(uiWindow* window, void* blarg)
void OnDropFile(uiWindow* window, char* file, void* blarg)
{
char* ext = &file[strlen(file)-3];
+ int prevstatus = EmuRunning;
if (!strcasecmp(ext, "nds") || !strcasecmp(ext, "srl"))
{
@@ -419,11 +441,7 @@ void OnDropFile(uiWindow* window, char* file, void* blarg)
while (EmuStatus != 2);
}
- strncpy(ROMPath, file, 1023);
- ROMPath[1023] = '\0';
-
- NDS::LoadROM(ROMPath, Config::DirectBoot);
- Run();
+ TryLoadROM(file, prevstatus);
}
}
@@ -456,14 +474,8 @@ void OnOpenFile(uiMenuItem* item, uiWindow* window, void* blarg)
return;
}
- strncpy(ROMPath, file, 1023);
- ROMPath[1023] = '\0';
+ TryLoadROM(file, prevstatus);
uiFreeText(file);
- // TODO: change libui to store strings in stack-allocated buffers?
- // so we don't have to free it after use
-
- NDS::LoadROM(ROMPath, Config::DirectBoot);
- Run();
}
void OnRun(uiMenuItem* item, uiWindow* window, void* blarg)
@@ -685,8 +697,8 @@ int main(int argc, char** argv)
strncpy(ROMPath, file, 1023);
ROMPath[1023] = '\0';
- NDS::LoadROM(ROMPath, Config::DirectBoot);
- Run();
+ if (NDS::LoadROM(ROMPath, Config::DirectBoot))
+ Run();
}
}