Merge branch 'rr1-maint'

This commit is contained in:
Ilari Liusvaara 2012-02-19 20:19:44 +02:00
commit 67da5fdf39
7 changed files with 73 additions and 83 deletions

View file

@ -221,10 +221,6 @@ struct rom_files
* Relative filename of main ROM file.
*/
std::string rom;
/**
* Main ROM is headered.
*/
bool rom_headered;
/**
* Relative filename of main ROM XML file.
*/
@ -233,10 +229,6 @@ struct rom_files
* Relative filename of slot A ROM file (non-SNES only).
*/
std::string slota;
/**
* SLOT A ROM is headered.
*/
bool slota_headered;
/**
* Relative filename of slot A XML file (non-SNES only).
*/
@ -245,10 +237,6 @@ struct rom_files
* Relative filename of slot B ROM file (Sufami Turbo only).
*/
std::string slotb;
/**
* SLOT B ROM is headered.
*/
bool slotb_headered;
/**
* Relative filename of slot B XML file (Sufami Turbo only).
*/
@ -273,11 +261,10 @@ struct loaded_slot
* parameter filename: The filename to read. If "", empty slot is constructed.
* parameter base: Base filename to interpret the filename against. If "", no base filename is used.
* parameter xml_flag: If set, always keep trailing NUL.
* parameter headered: If set and xml_flag is not set, strip the first 512 bytes.
* throws std::bad_alloc: Not enough memory.
* throws std::runtime_error: Can't load the data.
*/
loaded_slot(const std::string& filename, const std::string& base, bool xml_flag = false, bool headered = false)
loaded_slot(const std::string& filename, const std::string& base, bool xml_flag = false)
throw(std::bad_alloc, std::runtime_error);
/**

View file

@ -20,6 +20,8 @@ public:
void on_romtype_change(wxCommandEvent& e);
void on_quit(wxCommandEvent& e);
void on_open_rom(wxCommandEvent& e);
void on_apply_rom(wxCommandEvent& e);
void on_openapply_rom(wxCommandEvent& e, bool apply);
void on_ask_rom_filename(wxCommandEvent& e);
loaded_rom* our_rom;
private:
@ -28,7 +30,7 @@ private:
wxStaticText* rom_label[ROMSELECT_ROM_COUNT];
wxTextCtrl* rom_name[ROMSELECT_ROM_COUNT];
wxButton* rom_change[ROMSELECT_ROM_COUNT];
wxCheckBox* rom_headered[ROMSELECT_ROM_COUNT];
wxButton* apply_rom;
wxButton* open_rom;
wxButton* quit_button;
std::string current_rtype;

View file

@ -492,15 +492,6 @@ slot-b: Sufami Turbo Slot B ROM
Load <file> as specified ROM (SFC/BS/DMG/ST file format).
\end_layout
\begin_layout Subsubsection
--headered-<kind>=<file> (lsnes/SDL, lsnes-avidump)
\end_layout
\begin_layout Standard
Load <file> as specified ROM, stripping first 512 bytes.
Handy for loading SMC / FIG and such files.
\end_layout
\begin_layout Subsubsection
--<kind>-xml=<file> (lsnes/SDL, lsnes-avidump)
\end_layout

View file

@ -200,33 +200,28 @@ Building is via makefile, the following options are available:
Load <file> as specified ROM (SFC/BS/DMG/ST file format).
4.1.2 --headered-<kind>=<file> (lsnes/SDL, lsnes-avidump)
Load <file> as specified ROM, stripping first 512 bytes. Handy
for loading SMC / FIG and such files.
4.1.3 --<kind>-xml=<file> (lsnes/SDL, lsnes-avidump)
4.1.2 --<kind>-xml=<file> (lsnes/SDL, lsnes-avidump)
Override hardware detection for ROM, reading the values from
<file> (BSNES XML format).
4.1.4 --ips-<kind>=<file> (lsnes/SDL, lsnes-avidump)
4.1.3 --ips-<kind>=<file> (lsnes/SDL, lsnes-avidump)
Apply BPS/IPS patch <file> to ROM <kind>. If specified multiple
times, the patches are applied in order.
4.1.5 --ips-<kind>-xml=<file> (lsnes/SDL, lsnes-avidump)
4.1.4 --ips-<kind>-xml=<file> (lsnes/SDL, lsnes-avidump)
Apply BPS/IPS patch <file> to XML of ROM <kind>. If specified
multiple times, the patches are applied in order.
4.1.6 --ips-offset=<offset> (lsnes/SDL, lsnes-avidump)
4.1.5 --ips-offset=<offset> (lsnes/SDL, lsnes-avidump)
Set offset to apply to IPS patches. May be negative. Handy for
applying headered IPS patches (use offset of -512 for this). The
offset must be 0 for BPS patches.
4.1.7 --pal
4.1.6 --pal
Force ROM to be considered PAL-only.
@ -234,7 +229,7 @@ Force ROM to be considered PAL-only.
• Attempting to load NTSC movie file will error out.
4.1.8 --ntsc
4.1.7 --ntsc
Force ROM to be considered NTSC-only.

View file

@ -182,11 +182,14 @@ controller_frame movie_logic::update_controls(bool subframe) throw(std::bad_allo
namespace
{
enum advance_mode old_mode;
//Do pending load (automatically unpauses).
void mark_pending_load(const std::string& filename, int lmode)
{
loadmode = lmode;
pending_load = filename;
old_mode = amode;
amode = ADVANCE_LOAD;
platform::cancel_wait();
platform::set_paused(false);
@ -405,11 +408,9 @@ namespace
function_ptr_command<const std::string&> quit_emulator("quit-emulator", "Quit the emulator",
"Syntax: quit-emulator [/y]\nQuits emulator (/y => don't ask for confirmation).\n",
[](const std::string& args) throw(std::bad_alloc, std::runtime_error) {
if(args == "/y" || platform::modal_message("Really quit?", true)) {
amode = ADVANCE_QUIT;
platform::set_paused(false);
platform::cancel_wait();
}
amode = ADVANCE_QUIT;
platform::set_paused(false);
platform::cancel_wait();
});
function_ptr_command<> pause_emulator("pause-emulator", "(Un)pause the emulator",
@ -667,11 +668,9 @@ namespace
}
on_quit_prompt = true;
try {
if(platform::modal_message("Really quit?", true)) {
amode = ADVANCE_QUIT;
platform::set_paused(false);
platform::cancel_wait();
}
amode = ADVANCE_QUIT;
platform::set_paused(false);
platform::cancel_wait();
} catch(...) {
}
on_quit_prompt = false;
@ -830,7 +829,7 @@ void main_loop(struct loaded_rom& rom, struct moviefile& initial, bool load_has_
//print_controller_mappings();
platform::set_paused(false);
amode = ADVANCE_PAUSE;
amode = ADVANCE_AUTO;
uint64_t time_x = get_utime();
while(amode != ADVANCE_QUIT || !queued_saves.empty()) {
if(handle_corrupt()) {
@ -860,7 +859,10 @@ void main_loop(struct loaded_rom& rom, struct moviefile& initial, bool load_has_
r = handle_load();
if(r > 0 || system_corrupt) {
first_round = our_movie.is_savestate;
amode = ADVANCE_PAUSE;
if(system_corrupt)
amode = ADVANCE_PAUSE;
else
amode = old_mode;
just_did_loadstate = first_round;
continue;
} else if(r < 0) {
@ -872,9 +874,8 @@ void main_loop(struct loaded_rom& rom, struct moviefile& initial, bool load_has_
//If we just loadstated, we are up to date.
if(amode == ADVANCE_QUIT)
break;
amode = ADVANCE_PAUSE;
platform::cancel_wait();
platform::set_paused(true);
platform::set_paused(amode == ADVANCE_PAUSE);
platform::flush_command_queue();
//We already have done the reset this frame if we are going to do one at all.
movb.get_movie().set_controls(controls.get(movb.get_movie().get_current_frame()));

View file

@ -237,9 +237,10 @@ loaded_slot::loaded_slot() throw(std::bad_alloc)
valid = false;
}
loaded_slot::loaded_slot(const std::string& filename, const std::string& base, bool xml_flag, bool headered)
loaded_slot::loaded_slot(const std::string& filename, const std::string& base, bool xml_flag)
throw(std::bad_alloc, std::runtime_error)
{
bool headered = false;
xml = xml_flag;
if(filename == "") {
valid = false;
@ -247,6 +248,9 @@ loaded_slot::loaded_slot(const std::string& filename, const std::string& base, b
}
valid = true;
data = read_file_relative(filename, base);
if(!xml && data.size() % 1024 == 512)
//Assume headered.
headered = true;
if(headered && !xml) {
if(data.size() >= 512) {
memmove(&data[0], &data[512], data.size() - 512);
@ -298,28 +302,20 @@ rom_files::rom_files(const std::vector<std::string>& cmdline) throw(std::bad_all
rom = rom_xml = slota = slota_xml = slotb = slotb_xml = "";
std::string arr[sizeof(romtypes_to_recognize) / sizeof(romtypes_to_recognize[0])];
unsigned long flags = 0;
unsigned long headered_flags = 0;
for(size_t i = 0; i < sizeof(romtypes_to_recognize) / sizeof(romtypes_to_recognize[0]); i++) {
arr[i] = findoption(cmdline, romtypes_to_recognize[i]);
if(arr[i] != "")
flags |= (1L << i);
else {
arr[i] = findoption(cmdline, std::string("headered-") + romtypes_to_recognize[i]);
if(arr[i] != "") {
flags |= (1L << i);
headered_flags |= (1L << i);
}
}
}
rtype = recognize_platform(flags);
for(size_t i = 0; i < sizeof(romtypes_to_recognize) / sizeof(romtypes_to_recognize[0]); i++) {
if(arr[i] != "")
switch(recognize_commandline_rom(rtype, romtypes_to_recognize[i])) {
case 0: rom = arr[i]; rom_headered = ((headered_flags >> i) & 1); break;
case 0: rom = arr[i]; break;
case 1: rom_xml = arr[i]; break;
case 2: slota = arr[i]; slota_headered = ((headered_flags >> i) & 1); break;
case 2: slota = arr[i]; break;
case 3: slota_xml = arr[i]; break;
case 4: slotb = arr[i]; slotb_headered = ((headered_flags >> i) & 1); break;
case 4: slotb = arr[i]; break;
case 5: slotb_xml = arr[i]; break;
};
}
@ -387,11 +383,11 @@ loaded_rom::loaded_rom(const rom_files& files) throw(std::bad_alloc, std::runtim
<< name_subrom(files.rtype, 5) << std::endl;
rtype = files.rtype;
rom = loaded_slot(files.rom, files.base_file, false, files.rom_headered);
rom = loaded_slot(files.rom, files.base_file, false);
rom_xml = loaded_slot(files.rom_xml, files.base_file, true);
slota = loaded_slot(_slota, files.base_file, false, files.slota_headered);
slota = loaded_slot(_slota, files.base_file, false);
slota_xml = loaded_slot(_slota_xml, files.base_file, true);
slotb = loaded_slot(_slotb, files.base_file, false, files.slotb_headered);
slotb = loaded_slot(_slotb, files.base_file, false);
slotb_xml = loaded_slot(_slotb_xml, files.base_file, true);
orig_region = region = files.region;
}

View file

@ -53,6 +53,8 @@
#define WNAME_SGB_SLOTA_XML "BMG XML"
void patching_done(struct loaded_rom& rom, wxWindow* modwin);
namespace
{
class my_interfaced : public SNES::Interface
@ -63,22 +65,18 @@ namespace
}
} simple_interface;
void enable_slot(wxStaticText* label, wxTextCtrl* filename, wxButton* ask, wxCheckBox* hcb,
const std::string& newlabel)
void enable_slot(wxStaticText* label, wxTextCtrl* filename, wxButton* ask, const std::string& newlabel)
{
label->SetLabel(towxstring(newlabel));
filename->Enable();
ask->Enable();
if(hcb)
hcb->Enable();
}
void disable_slot(wxStaticText* label, wxTextCtrl* filename, wxButton* ask, wxCheckBox* hcb)
void disable_slot(wxStaticText* label, wxTextCtrl* filename, wxButton* ask)
{
label->SetLabel(wxT(""));
filename->Disable();
ask->Disable();
hcb->Disable();
}
std::string sram_name(const nall::string& _id, SNES::Cartridge::Slot slotname)
@ -285,29 +283,31 @@ wxwin_romselect::wxwin_romselect()
toplevel->Add(selects, 0, wxGROW);
//ROM filename selects
wxFlexGridSizer* romgrid = new wxFlexGridSizer(ROMSELECT_ROM_COUNT, 4, 0, 0);
wxFlexGridSizer* romgrid = new wxFlexGridSizer(ROMSELECT_ROM_COUNT, 3, 0, 0);
for(unsigned i = 0; i < ROMSELECT_ROM_COUNT; i++) {
romgrid->Add(rom_label[i] = new wxStaticText(this, wxID_ANY, wxT("")), 0, wxGROW);
romgrid->Add(rom_name[i] = new wxTextCtrl(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(500, -1)),
1, wxGROW);
romgrid->Add(rom_change[i] = new wxButton(this, ROM_SELECTS_BASE + i, wxT("...")), 0, wxGROW);
romgrid->Add(rom_headered[i] = new wxCheckBox(this, wxID_ANY, wxT("Headered")), 0, wxGROW);
rom_name[i]->Connect(wxEVT_COMMAND_TEXT_UPDATED,
wxCommandEventHandler(wxwin_romselect::on_filename_change), NULL, this);
rom_change[i]->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxwin_romselect::on_ask_rom_filename), NULL, this);
rom_headered[i]->Disable();
}
toplevel->Add(romgrid, 1, wxGROW);
//Button bar.
wxBoxSizer* buttons = new wxBoxSizer(wxHORIZONTAL);
buttons->AddStretchSpacer();
buttons->Add(apply_rom = new wxButton(this, wxID_ANY, wxT("Apply patches")), 0, wxALIGN_RIGHT);
buttons->Add(open_rom = new wxButton(this, wxID_OPEN, wxT("Open ROM")), 0, wxALIGN_RIGHT);
buttons->Add(quit_button = new wxButton(this, wxID_EXIT, wxT("Quit")), 0, wxALIGN_RIGHT);
apply_rom->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxwin_romselect::on_apply_rom), NULL, this);
open_rom->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxwin_romselect::on_open_rom), NULL, this);
open_rom->Disable();
apply_rom->Disable();
quit_button->Connect(wxEVT_COMMAND_BUTTON_CLICKED,
wxCommandEventHandler(wxwin_romselect::on_quit), NULL, this);
toplevel->Add(buttons, 1, wxGROW);
@ -343,10 +343,9 @@ void wxwin_romselect::set_rtype(std::string rtype)
wxString tmp[ROMSELECT_ROM_COUNT];
unsigned c = fill_rom_names(romtype_from_string(rtype), tmp);
for(unsigned i = 0; i < c; i++)
enable_slot(rom_label[i], rom_name[i], rom_change[i], (i & 1) ? NULL : rom_headered[i],
tostdstring(tmp[i]));
enable_slot(rom_label[i], rom_name[i], rom_change[i], tostdstring(tmp[i]));
for(unsigned i = c; i < ROMSELECT_ROM_COUNT; i++)
disable_slot(rom_label[i], rom_name[i], rom_change[i], rom_headered[i]);
disable_slot(rom_label[i], rom_name[i], rom_change[i]);
current_rtype = rtype;
Fit();
}
@ -372,6 +371,7 @@ void wxwin_romselect::on_filename_change(wxCommandEvent& e)
for(unsigned i = 0; i < ROMSELECT_ROM_COUNT; i++)
flags |= ((rom_name[i]->GetValue().Length() != 0) ? (1 << i) : 0);
open_rom->Enable(check_present_roms(rtype, flags));
apply_rom->Enable(check_present_roms(rtype, flags));
}
void wxwin_romselect::on_romtype_change(wxCommandEvent& e)
@ -386,6 +386,17 @@ void wxwin_romselect::on_quit(wxCommandEvent& e)
}
void wxwin_romselect::on_open_rom(wxCommandEvent& e)
{
on_openapply_rom(e, false);
}
void wxwin_romselect::on_apply_rom(wxCommandEvent& e)
{
on_openapply_rom(e, true);
}
void wxwin_romselect::on_openapply_rom(wxCommandEvent& e, bool apply)
{
rom_files rfiles;
rfiles.base_file = "";
@ -397,9 +408,6 @@ void wxwin_romselect::on_open_rom(wxCommandEvent& e)
rfiles.slota_xml = tostdstring(rom_name[3]->GetValue());
rfiles.slotb = tostdstring(rom_name[4]->GetValue());
rfiles.slotb_xml = tostdstring(rom_name[5]->GetValue());
rfiles.rom_headered = rom_headered[0]->GetValue();
rfiles.slota_headered = rom_headered[2]->GetValue();
rfiles.slotb_headered = rom_headered[4]->GetValue();
try {
our_rom = new loaded_rom(rfiles);
if(our_rom->slota.valid)
@ -412,8 +420,12 @@ void wxwin_romselect::on_open_rom(wxCommandEvent& e)
show_message_ok(this, "Error loading ROM", e.what(), wxICON_EXCLAMATION);
return;
}
wxwin_patch* projwin = new wxwin_patch(*our_rom);
projwin->Show();
if(apply) {
wxwin_patch* projwin = new wxwin_patch(*our_rom);
projwin->Show();
} else {
patching_done(*our_rom, this);
}
Destroy();
}
//---------------------------------------------------
@ -554,8 +566,9 @@ void wxwin_patch::on_quit(wxCommandEvent& e)
Close(true);
}
void wxwin_patch::on_done(wxCommandEvent& e)
void patching_done(struct loaded_rom& rom, wxWindow* modwin)
{
struct loaded_rom* our_rom = &rom;
try {
SNES::interface = &simple_interface;
if(our_rom->slota.valid)
@ -566,7 +579,7 @@ void wxwin_patch::on_done(wxCommandEvent& e)
our_rom_name = our_rom->rom.sha256;
our_rom->load();
} catch(std::exception& e) {
show_message_ok(this, "Error loading ROM", e.what(), wxICON_EXCLAMATION);
show_message_ok(modwin, "Error loading ROM", e.what(), wxICON_EXCLAMATION);
return;
}
messages << "Detected region: " << gtype::tostring(our_rom->rtype, our_rom->region) << std::endl;
@ -580,6 +593,11 @@ void wxwin_patch::on_done(wxCommandEvent& e)
messages << "--- End of Startup --- " << std::endl;
wxwin_project* projwin = new wxwin_project(*our_rom);
projwin->Show();
}
void wxwin_patch::on_done(wxCommandEvent& e)
{
patching_done(*our_rom, this);
Destroy();
}
//------------------------------------------------------------