1 #ifndef _romimage__hpp__included__
2 #define _romimage__hpp__included__
5 #include "core/rom-small.hpp"
6 #include "interface/romtype.hpp"
7 #include "library/fileimage.hpp"
8 #include "library/threads.hpp"
14 std::vector
<core_type
*> cores
;
15 //Selected core (default core on call).
18 //Filename selected (on entry, filename hint).
19 bool has_slot
[ROM_SLOT_COUNT
];
20 bool guessed
[ROM_SLOT_COUNT
];
21 std::string filename
[ROM_SLOT_COUNT
];
22 std::string hash
[ROM_SLOT_COUNT
];
23 std::string hashxml
[ROM_SLOT_COUNT
];
29 * A collection of files making up a ROM image.
39 * Take in ROM filename (or a bundle) and load it to memory.
41 * parameter file: The file to load
42 * parameter tmpprefer: The core name to prefer.
43 * throws std::bad_alloc: Not enough memory.
44 * throws std::runtime_error: Loading ROM file failed.
46 rom_image(const std::string
& file
, const std::string
& tmpprefer
= "") throw(std::bad_alloc
,
49 * Take a ROM and load it.
51 rom_image(const std::string
& file
, const std::string
& core
, const std::string
& type
,
52 const std::string
& region
);
54 * Load a multi-file ROM.
56 rom_image(const std::string file
[ROM_SLOT_COUNT
], const std::string
& core
, const std::string
& type
,
57 const std::string
& region
);
59 * Take in ROM filename and load it to memory with specified type.
61 * parameter file: The file to load
62 * parameter ctype: The core type to use.
63 * throws std::bad_alloc: Not enough memory.
64 * throws std::runtime_error: Loading ROM file failed.
66 rom_image(const std::string
& file
, core_type
& ctype
) throw(std::bad_alloc
, std::runtime_error
);
74 core_type
& get_type() { return *rtype
; }
78 core_region
& get_region() { return *orig_region
; }
80 * Do region setup. Changes orig_region to specified if NULL.
82 void setup_region(core_region
& reg
);
86 fileimage::image
& get_image(size_t index
, bool xml
)
88 if(index
< ROM_SLOT_COUNT
) {
97 * Get filename of ROM pack, if any.
99 const std::string
& get_pack_filename() { return load_filename
; }
101 * Get MSU-1 base fileaname.
103 const std::string
& get_msu1_base() { return msu1_base
; }
107 bool is_of_type(core_type
& type
) { return (rtype
== &type
); }
111 * parameter filename: The file to probe.
112 * retruns: True if gamepak, false if not.
113 * throws std::runtime_error: No such file.
115 static bool is_gamepak(const std::string
& filename
) throw(std::bad_alloc
, std::runtime_error
);
117 std::list
<core_region
*> get_regions() { return rtype
->get_regions(); }
118 const std::string
& get_hname() { return rtype
->get_hname(); }
120 rom_image(const rom_image
&);
121 rom_image
& operator=(const rom_image
&);
123 void account_images();
125 static fileimage::image null_img
;
127 fileimage::image romimg
[ROM_SLOT_COUNT
];
128 //Loaded ROM XML (markup) images.
129 fileimage::image romxml
[ROM_SLOT_COUNT
];
130 //MSU-1 base filename.
131 std::string msu1_base
;
133 std::string load_filename
;
138 //Region ROM was loaded as.
139 core_region
* orig_region
;
141 threads::lock usage_lock
;
143 void get() { threads::alock
l(usage_lock
); usage_count
++; }
144 bool put() { threads::alock
l(usage_lock
); return !--usage_count
; }
145 friend class rom_image_handle
;
146 //Handle bundle load case.
147 void load_bundle(const std::string
& file
, std::istream
& spec
, const std::string
& tmpprefer
)
148 throw(std::bad_alloc
, std::runtime_error
);
150 memtracker::autorelease tracker
;
154 * A handle for ROM imageset.
156 class rom_image_handle
160 * Create a handle to NULL imageset.
167 * Create a new handle with refcount 1. The specified ROM imageset has to be allocated using new.
169 rom_image_handle(rom_image
* _img
)
172 img
->usage_count
= 1;
175 * Copy-construct a handle.
177 rom_image_handle(const rom_image_handle
& h
)
185 rom_image_handle
& operator=(const rom_image_handle
& h
)
187 if(img
== h
.img
) return *this;
203 rom_image
& operator*()
210 rom_image
* operator->()
215 static rom_image null_img
;
216 mutable rom_image
* img
;
217 void get() const { if(img
!= &null_img
) img
->get(); }
218 void put() const { if(img
!= &null_img
&& img
->put()) delete img
; }
222 void record_filehash(const std::string
& file
, uint64_t prefix
, const std::string
& hash
);
223 void set_hasher_callback(std::function
<void(uint64_t, uint64_t)> cb
);
224 rom_image_handle
construct_rom(const std::string
& movie_filename
, const std::vector
<std::string
>& cmdline
);
226 //Map of preferred cores for each extension and type.
227 extern std::map
<std::string
, core_type
*> preferred_core
;
229 extern fileimage::hash lsnes_image_hasher
;