#ifndef _rom__hpp__included__ #define _rom__hpp__included__ #define ROM_SLOT_COUNT 27 #include #include #include #include #include "core/misc.hpp" #include "interface/romtype.hpp" #include "library/fileimage.hpp" //ROM request. struct rom_request { //List of core types. std::vector cores; //Selected core (default core on call). bool core_guessed; size_t selected; //Filename selected (on entry, filename hint). bool has_slot[ROM_SLOT_COUNT]; bool guessed[ROM_SLOT_COUNT]; std::string filename[ROM_SLOT_COUNT]; std::string hash[ROM_SLOT_COUNT]; std::string hashxml[ROM_SLOT_COUNT]; //Canceled flag. bool canceled; }; /** * ROM loaded into memory. */ struct loaded_rom { /** * Create blank ROM */ loaded_rom() throw(); /** * Take in ROM filename (or a bundle) and load it to memory. * * parameter file: The file to load * parameter tmpprefer: The core name to prefer. * throws std::bad_alloc: Not enough memory. * throws std::runtime_error: Loading ROM file failed. */ loaded_rom(const std::string& file, const std::string& tmpprefer = "") throw(std::bad_alloc, std::runtime_error); /** * Take a ROM and load it. */ loaded_rom(const std::string& file, const std::string& core, const std::string& type, const std::string& region); /** * Load a multi-file ROM. */ loaded_rom(const std::string file[ROM_SLOT_COUNT], const std::string& core, const std::string& type, const std::string& region); /** * Take in ROM filename and load it to memory with specified type. * * parameter file: The file to load * parameter ctype: The core type to use. * throws std::bad_alloc: Not enough memory. * throws std::runtime_error: Loading ROM file failed. */ loaded_rom(const std::string& file, core_type& ctype) throw(std::bad_alloc, std::runtime_error); /** * ROM type */ core_type* rtype; /** * ROM region (this is the currently active region). */ core_region* region; /** * ROM original region (this is the region ROM is loaded as). */ core_region* orig_region; /** * Loaded main ROM */ fileimage::image romimg[ROM_SLOT_COUNT]; /** * Loaded main ROM XML */ fileimage::image romxml[ROM_SLOT_COUNT]; /** * MSU-1 base. */ std::string msu1_base; /** * Load filename. */ std::string load_filename; /** * Switches the active cartridge to this cartridge. The compatiblity between selected region and original region * is checked. Region is updated after cartridge has been loaded. * * throws std::bad_alloc: Not enough memory * throws std::runtime_error: Switching cartridges failed. */ void load(std::map& settings, uint64_t rtc_sec, uint64_t rtc_subsec) throw(std::bad_alloc, std::runtime_error); /** * Saves core state into buffer. WARNING: This takes emulated time. * * returns: The saved state. * throws std::bad_alloc: Not enough memory. */ std::vector save_core_state(bool nochecksum = false) throw(std::bad_alloc, std::runtime_error); /** * Loads core state from buffer. * * parameter buf: The buffer containing the state. * throws std::runtime_error: Loading state failed. */ void load_core_state(const std::vector& buf, bool nochecksum = false) throw(std::runtime_error); /** * Is file a gamepak? * * parameter filename: The file to probe. * retruns: True if gamepak, false if not. * throws std::runtime_error: No such file. */ static bool is_gamepak(const std::string& filename) throw(std::bad_alloc, std::runtime_error); }; /** * Get major type and region of loaded ROM. * * returns: Tuple (ROM type, ROM region) of currently loaded ROM. */ std::pair get_current_rom_info() throw(); /** * Read SRAMs from command-line and and load the files. * * parameter cmdline: Command line * returns: The loaded SRAM contents. * throws std::bad_alloc: Out of memory. * throws std::runtime_error: Failed to load. */ std::map> load_sram_commandline(const std::vector& cmdline) throw(std::bad_alloc, std::runtime_error); /** * Set the hasher callback. */ void set_hasher_callback(std::function cb); struct romload_request { //Pack file to load. Overrides everything else. std::string packfile; //Single file to load to default slot. std::string singlefile; //Core and system. May be blank. std::string core; std::string system; std::string region; //Files to load. std::string files[ROM_SLOT_COUNT]; }; bool load_null_rom(); bool _load_new_rom(const romload_request& req); bool reload_active_rom(); regex_results get_argument(const std::vector& cmdline, const std::string& regexp); std::string get_requested_core(const std::vector& cmdline); loaded_rom construct_rom(const std::string& movie_filename, const std::vector& cmdline); void try_guess_roms(rom_request& req); void record_filehash(const std::string& file, uint64_t prefix, const std::string& hash); std::string try_to_guess_rom(const std::string& hint, const std::string& hash, const std::string& xhash, core_type& type, unsigned i); //Map of preferred cores for each extension and type. extern std::map preferred_core; //Main hasher extern fileimage::hash lsnes_image_hasher; #endif