Try to autodetect headered ROMs

This commit is contained in:
Ilari Liusvaara 2012-02-19 19:44:36 +02:00
parent 2c9baffce1
commit 5e60e41ef5
6 changed files with 23 additions and 65 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

@ -28,7 +28,6 @@ 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* 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

@ -236,9 +236,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;
@ -246,6 +247,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);
@ -297,28 +301,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;
};
}
@ -386,11 +382,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

@ -63,22 +63,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,18 +281,16 @@ 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);
@ -343,10 +337,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();
}
@ -397,9 +390,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)