Try to autodetect headered ROMs
This commit is contained in:
parent
2c9baffce1
commit
5e60e41ef5
6 changed files with 23 additions and 65 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);
|
||||
|
||||
/**
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue