Merge branch 'rr1-maint'
This commit is contained in:
commit
67da5fdf39
7 changed files with 73 additions and 83 deletions
|
@ -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);
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
17
manual.txt
17
manual.txt
|
@ -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.
|
||||
|
||||
|
|
|
@ -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()));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
//------------------------------------------------------------
|
||||
|
|
Loading…
Add table
Reference in a new issue