From bb481432841a2172b4611d193930dd0d8640f73c Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Fri, 11 Jan 2013 22:31:13 +0200 Subject: [PATCH] Handle conflicting sysregions --- include/core/moviefile.hpp | 3 ++- include/interface/romtype.hpp | 3 ++- src/core/memorymanip.cpp | 2 +- src/core/moviedata.cpp | 2 +- src/core/moviefile.cpp | 4 ++-- src/interface/romtype.cpp | 27 ++++++++++++++++++--------- src/platform/wxwidgets/main.cpp | 4 +++- src/util/lsnes-dumpavi.cpp | 2 +- 8 files changed, 30 insertions(+), 17 deletions(-) diff --git a/include/core/moviefile.hpp b/include/core/moviefile.hpp index 8fd70bbc..14e7f856 100644 --- a/include/core/moviefile.hpp +++ b/include/core/moviefile.hpp @@ -26,10 +26,11 @@ struct moviefile * This constructor loads a movie/savestate file and fills structure accordingly. * * parameter filename: The file to load. + * parameter romtype: Type of ROM. * throws std::bad_alloc: Not enough memory. * throws std::runtime_error: Can't load the movie file */ - moviefile(const std::string& filename) throw(std::bad_alloc, std::runtime_error); + moviefile(const std::string& filename, core_type& romtype) throw(std::bad_alloc, std::runtime_error); /** * Reads this movie structure and saves it into file. diff --git a/include/interface/romtype.hpp b/include/interface/romtype.hpp index b87c1162..50adec78 100644 --- a/include/interface/romtype.hpp +++ b/include/interface/romtype.hpp @@ -203,6 +203,7 @@ public: const std::string& get_hname(); const std::list& get_extensions(); bool is_known_extension(const std::string& ext); + core_sysregion& lookup_sysregion(const std::string& sysreg); std::string get_biosname(); unsigned get_id(); unsigned get_image_count(); @@ -267,7 +268,7 @@ struct core_sysregion { public: core_sysregion(const std::string& name, core_type& type, core_region& region); - static core_sysregion& lookup(const std::string& name); + ~core_sysregion() throw(); const std::string& get_name(); core_region& get_region(); core_type& get_type(); diff --git a/src/core/memorymanip.cpp b/src/core/memorymanip.cpp index c53a4318..303b5333 100644 --- a/src/core/memorymanip.cpp +++ b/src/core/memorymanip.cpp @@ -78,7 +78,7 @@ namespace void refresh_cart_mappings() throw(std::bad_alloc) { - if(!get_current_rom_info().first) + if(!our_rom || !our_rom->rtype) return; std::list cur_regions = lsnes_memory.get_regions(); std::list regions; diff --git a/src/core/moviedata.cpp b/src/core/moviedata.cpp index 1c3b92b6..b72cee46 100644 --- a/src/core/moviedata.cpp +++ b/src/core/moviedata.cpp @@ -442,7 +442,7 @@ bool do_load_state(const std::string& filename, int lmode) lua_callback_pre_load(filename2); struct moviefile mfile; try { - mfile = moviefile(filename2); + mfile = moviefile(filename2, *our_rom->rtype); } catch(std::bad_alloc& e) { OOM_panic(); } catch(std::exception& e) { diff --git a/src/core/moviefile.cpp b/src/core/moviefile.cpp index e426c417..a8af06bd 100644 --- a/src/core/moviefile.cpp +++ b/src/core/moviefile.cpp @@ -373,7 +373,7 @@ moviefile::moviefile() throw(std::bad_alloc) poll_flag = 0; } -moviefile::moviefile(const std::string& movie) throw(std::bad_alloc, std::runtime_error) +moviefile::moviefile(const std::string& movie, core_type& romtype) throw(std::bad_alloc, std::runtime_error) { poll_flag = false; start_paused = false; @@ -390,7 +390,7 @@ moviefile::moviefile(const std::string& movie) throw(std::bad_alloc, std::runtim throw std::runtime_error("Can't decode movie data"); read_linefile(r, "gametype", tmp); try { - gametype = &core_sysregion::lookup(tmp); + gametype = &romtype.lookup_sysregion(tmp); } catch(std::bad_alloc& e) { throw; } catch(std::exception& e) { diff --git a/src/interface/romtype.cpp b/src/interface/romtype.cpp index 4066b730..e4069805 100644 --- a/src/interface/romtype.cpp +++ b/src/interface/romtype.cpp @@ -21,9 +21,9 @@ namespace return x; } - std::map& sysregions() + std::multimap& sysregions() { - static std::map x; + static std::multimap x; return x; } @@ -281,15 +281,24 @@ std::set core_type::srams() core_sysregion::core_sysregion(const std::string& _name, core_type& _type, core_region& _region) : name(_name), type(_type), region(_region) { - sysregions()[_name] = this; + sysregions().insert(std::make_pair(_name, this)); } -core_sysregion& core_sysregion::lookup(const std::string& _name) +core_sysregion::~core_sysregion() throw() { - if(sysregions().count(_name)) - return *(sysregions()[_name]); - else - throw std::runtime_error("Bad system-region type"); + for(auto i = sysregions().begin(); i != sysregions().end(); i++) + if(i->second == this) { + sysregions().erase(i); + break; + } +} + +core_sysregion& core_type::lookup_sysregion(const std::string& sysreg) +{ + for(auto i : sysregions()) + if(i.first == sysreg && &i.second->get_type() == this) + return *i.second; + throw std::runtime_error("Bad system-region type"); } const std::string& core_sysregion::get_name() @@ -483,4 +492,4 @@ emucore_callbacks::~emucore_callbacks() throw() struct emucore_callbacks* ecore_callbacks; -bool new_core_flag = false; \ No newline at end of file +bool new_core_flag = false; diff --git a/src/platform/wxwidgets/main.cpp b/src/platform/wxwidgets/main.cpp index 91f78d42..af18f901 100644 --- a/src/platform/wxwidgets/main.cpp +++ b/src/platform/wxwidgets/main.cpp @@ -495,7 +495,9 @@ bool lsnes_app::OnInit() moviefile* mov = NULL; if(c_file != "") try { - mov = new moviefile(c_file); + if(!rom) + throw std::runtime_error("No ROM loaded"); + mov = new moviefile(c_file, *rom->rtype); if(c_rom != "") rom->load(mov->settings, mov->movie_rtc_second, mov->movie_rtc_subsecond); } catch(std::exception& e) { diff --git a/src/util/lsnes-dumpavi.cpp b/src/util/lsnes-dumpavi.cpp index b406e306..ed20468f 100644 --- a/src/util/lsnes-dumpavi.cpp +++ b/src/util/lsnes-dumpavi.cpp @@ -294,7 +294,7 @@ int main(int argc, char** argv) if(i->length() > 0 && (*i)[0] != '-') { try { tried = true; - movie = moviefile(*i); + movie = moviefile(*i, *r.rtype); loaded = true; } catch(std::bad_alloc& e) { OOM_panic(); -- 2.11.4.GIT