diff options
| -rw-r--r-- | src/NDS.cpp | 10 | ||||
| -rw-r--r-- | src/NDS.h | 2 | ||||
| -rw-r--r-- | src/NDSCart.cpp | 15 | ||||
| -rw-r--r-- | src/libui_sdl/main.cpp | 40 | 
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() @@ -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();          }      }  |