Support for hard resets and make some stuff movie settings
This commit is contained in:
parent
0b45d38af1
commit
b928596e09
9 changed files with 96 additions and 27 deletions
|
@ -90,7 +90,7 @@ struct core_core_params
|
|||
void (*runtosave)();
|
||||
bool (*get_pflag)();
|
||||
void (*set_pflag)(bool pflag);
|
||||
void (*request_reset)(long delay);
|
||||
void (*request_reset)(long delay, bool hard);
|
||||
port_type** port_types;
|
||||
framebuffer_raw& (*draw_cover)();
|
||||
std::string (*get_core_shortname)();
|
||||
|
@ -161,7 +161,7 @@ struct core_core
|
|||
void runtosave();
|
||||
bool get_pflag();
|
||||
void set_pflag(bool pflag);
|
||||
void request_reset(long delay);
|
||||
void request_reset(long delay, bool hard);
|
||||
framebuffer_raw& draw_cover();
|
||||
port_type** get_port_types() { return port_types; }
|
||||
std::string get_core_shortname();
|
||||
|
@ -188,7 +188,7 @@ private:
|
|||
void (*_runtosave)();
|
||||
bool (*_get_pflag)();
|
||||
void (*_set_pflag)(bool pflag);
|
||||
void (*_request_reset)(long delay);
|
||||
void (*_request_reset)(long delay, bool hard);
|
||||
port_type** port_types;
|
||||
framebuffer_raw& (*_draw_cover)();
|
||||
std::string (*_get_core_shortname)();
|
||||
|
@ -246,7 +246,7 @@ public:
|
|||
void runtosave() { core->runtosave(); }
|
||||
bool get_pflag() { return core->get_pflag(); }
|
||||
void set_pflag(bool pflag) { core->set_pflag(pflag); }
|
||||
void request_reset(long delay) { core->request_reset(delay); }
|
||||
void request_reset(long delay, bool hard) { core->request_reset(delay, hard); }
|
||||
framebuffer_raw& draw_cover() { return core->draw_cover(); }
|
||||
private:
|
||||
core_type(const core_type&);
|
||||
|
|
|
@ -534,14 +534,31 @@ namespace
|
|||
messages << "Emulator core does not support resets" << std::endl;
|
||||
return;
|
||||
}
|
||||
if(our_rom->rtype->get_reset_support() < 2 && x != "") {
|
||||
if((our_rom->rtype->get_reset_support() & 3) < 2 && x != "") {
|
||||
messages << "Emulator core does not support delayed resets" << std::endl;
|
||||
return;
|
||||
}
|
||||
if(x == "")
|
||||
our_rom->rtype->request_reset(0);
|
||||
our_rom->rtype->request_reset(0, false);
|
||||
else
|
||||
our_rom->rtype->request_reset(parse_value<uint32_t>(x));
|
||||
our_rom->rtype->request_reset(parse_value<uint32_t>(x), false);
|
||||
});
|
||||
|
||||
function_ptr_command<const std::string&> hreset_c(lsnes_cmd, "reset-hard", "Reset the system",
|
||||
"Syntax: reset-hard\nReset-hard <delay>\nHard resets the system in beginning of the next frame.\n",
|
||||
[](const std::string& x) throw(std::bad_alloc, std::runtime_error) {
|
||||
if((our_rom->rtype->get_reset_support() & 4) == 0) {
|
||||
messages << "Emulator core does not support hard resets" << std::endl;
|
||||
return;
|
||||
}
|
||||
if((our_rom->rtype->get_reset_support() & 3) < 2 && x != "") {
|
||||
messages << "Emulator core does not support delayed hard resets" << std::endl;
|
||||
return;
|
||||
}
|
||||
if(x == "")
|
||||
our_rom->rtype->request_reset(0, true);
|
||||
else
|
||||
our_rom->rtype->request_reset(parse_value<uint32_t>(x), true);
|
||||
});
|
||||
|
||||
function_ptr_command<arg_filename> load_c(lsnes_cmd, "load", "Load savestate (current mode)",
|
||||
|
|
|
@ -130,7 +130,7 @@ namespace
|
|||
//Set poll flag.
|
||||
[](bool pflag) -> void {},
|
||||
//Request reset.
|
||||
[](long delay) -> void {},
|
||||
[](long delay, bool hard) -> void {},
|
||||
//Port types.
|
||||
port_types,
|
||||
//Cover page.
|
||||
|
|
|
@ -62,9 +62,10 @@
|
|||
namespace
|
||||
{
|
||||
bool p1disable = false;
|
||||
bool do_hreset_flag = false;
|
||||
long do_reset_flag = -1;
|
||||
boolean_setting allow_inconsistent_saves(lsnes_set, "allow-inconsistent-saves", false);
|
||||
boolean_setting save_every_frame(lsnes_set, "save-every-frame", false);
|
||||
bool support_hreset = false;
|
||||
bool save_every_frame = false;
|
||||
bool have_saved_this_frame = false;
|
||||
int16_t blanksound[1070] = {0};
|
||||
int16_t soundbuf[8192] = {0};
|
||||
|
@ -100,6 +101,9 @@ namespace
|
|||
core_setting_group bsnes_settings;
|
||||
core_setting setting_port1(bsnes_settings, "port1", "Port 1 Type", "gamepad");
|
||||
core_setting setting_port2(bsnes_settings, "port2", "Port 2 Type", "none");
|
||||
core_setting setting_hardreset(bsnes_settings, "hardreset", "Support hard resets", "0");
|
||||
core_setting setting_saveevery(bsnes_settings, "saveevery", "Emulate saving each frame", "0");
|
||||
core_setting setting_randinit(bsnes_settings, "radominit", "Random initial state", "0");
|
||||
core_setting_value setting_port1_none(setting_port1, "none", "None", 0);
|
||||
core_setting_value setting_port2_none(setting_port2, "none", "None", 0);
|
||||
core_setting_value setting_port2_gamepad(setting_port2, "gamepad", "Gamepad", 1);
|
||||
|
@ -115,6 +119,12 @@ namespace
|
|||
core_setting_value setting_port2_superscope(setting_port2, "superscope", "Super Scope", 8);
|
||||
core_setting_value setting_port2_justifier(setting_port2, "justifier", "Justifier", 6);
|
||||
core_setting_value setting_port2_justifiers(setting_port2, "justifiers", "2 Justifiers", 7);
|
||||
core_setting_value setting_hardreset_0(setting_hardreset, "0", "False", 0);
|
||||
core_setting_value setting_hardreset_1(setting_hardreset, "1", "True", 1);
|
||||
core_setting_value setting_saveevery_0(setting_saveevery, "0", "False", 0);
|
||||
core_setting_value setting_saveevery_1(setting_saveevery, "1", "True", 1);
|
||||
core_setting_value setting_randinit_0(setting_randinit, "0", "False", 0);
|
||||
core_setting_value setting_randinit_1(setting_randinit, "1", "True", 1);
|
||||
|
||||
////////////////// PORTS COMMON ///////////////////
|
||||
port_type* index_to_ptype[] = {
|
||||
|
@ -181,11 +191,16 @@ namespace
|
|||
bsnes_settings.fill_defaults(_settings);
|
||||
signed type1 = setting_port1.ivalue_to_index(_settings[setting_port1.iname]);
|
||||
signed type2 = setting_port2.ivalue_to_index(_settings[setting_port2.iname]);
|
||||
signed hreset = setting_hardreset.ivalue_to_index(_settings[setting_hardreset.iname]);
|
||||
signed esave = setting_saveevery.ivalue_to_index(_settings[setting_saveevery.iname]);
|
||||
signed irandom = setting_randinit.ivalue_to_index(_settings[setting_randinit.iname]);
|
||||
|
||||
basic_init();
|
||||
snes_term();
|
||||
snes_unload_cartridge();
|
||||
SNES::config.random = false;
|
||||
SNES::config.random = (irandom != 0);
|
||||
save_every_frame = (esave != 0);
|
||||
support_hreset = (hreset != 0);
|
||||
SNES::config.expansion_port = SNES::System::ExpansionPortDevice::None;
|
||||
bool r = fun(img);
|
||||
if(r) {
|
||||
|
@ -226,13 +241,17 @@ namespace
|
|||
bsnes_settings.fill_defaults(_settings);
|
||||
signed type1 = setting_port1.ivalue_to_index(_settings[setting_port1.iname]);
|
||||
signed type2 = setting_port2.ivalue_to_index(_settings[setting_port2.iname]);
|
||||
signed hreset = setting_hardreset.ivalue_to_index(_settings[setting_hardreset.iname]);
|
||||
controller_set r;
|
||||
if(hreset)
|
||||
r.ports.push_back(&psystem_hreset);
|
||||
else
|
||||
r.ports.push_back(&psystem);
|
||||
r.ports.push_back(index_to_ptype[type1]);
|
||||
r.ports.push_back(index_to_ptype[type2]);
|
||||
unsigned p1controllers = r.ports[1]->controller_info->controller_count;
|
||||
unsigned p2controllers = r.ports[2]->controller_info->controller_count;
|
||||
for(unsigned i = 0; i < 4; i++)
|
||||
for(unsigned i = 0; i < (hreset ? 5 : 4); i++)
|
||||
r.portindex.indices.push_back(t(0, 0, i, false));
|
||||
push_port_indices(r.portindex.indices, 1, *r.ports[1]);
|
||||
push_port_indices(r.portindex.indices, 2, *r.ports[2]);
|
||||
|
@ -255,9 +274,9 @@ namespace
|
|||
}
|
||||
|
||||
#ifdef BSNES_HAS_DEBUGGER
|
||||
#define BSNES_RESET_LEVEL 2
|
||||
#define BSNES_RESET_LEVEL 6
|
||||
#else
|
||||
#define BSNES_RESET_LEVEL 1
|
||||
#define BSNES_RESET_LEVEL 5
|
||||
#endif
|
||||
|
||||
class my_interface : public SNES::Interface
|
||||
|
@ -727,6 +746,9 @@ namespace
|
|||
return;
|
||||
bool was_delay_reset = false;
|
||||
int16_t reset = ecore_callbacks->set_input(0, 0, 1, (do_reset_flag >= 0) ? 1 : 0);
|
||||
int16_t hreset = 0;
|
||||
if(support_hreset)
|
||||
hreset = ecore_callbacks->set_input(0, 0, 4, do_hreset_flag ? 1 : 0);
|
||||
if(reset) {
|
||||
long hi = ecore_callbacks->set_input(0, 0, 2, do_reset_flag / 10000);
|
||||
long lo = ecore_callbacks->set_input(0, 0, 3, do_reset_flag % 10000);
|
||||
|
@ -756,18 +778,30 @@ again:
|
|||
do_reset_flag = -1;
|
||||
messages << "SNES reset (forced at " << delayreset_cycles_run << ")"
|
||||
<< std::endl;
|
||||
if(hreset)
|
||||
SNES::system.power();
|
||||
else
|
||||
SNES::system.reset();
|
||||
return;
|
||||
}
|
||||
if(hreset)
|
||||
SNES::system.power();
|
||||
else
|
||||
SNES::system.reset();
|
||||
messages << "SNES reset (delayed " << delayreset_cycles_run << ")"
|
||||
<< std::endl;
|
||||
#else
|
||||
messages << "Delayresets not supported on this bsnes version "
|
||||
"(needs v084 or v085)" << std::endl;
|
||||
if(hreset)
|
||||
SNES::system.power();
|
||||
else
|
||||
SNES::system.reset();
|
||||
#endif
|
||||
} else if(delay == 0) {
|
||||
if(hreset)
|
||||
SNES::system.power();
|
||||
else
|
||||
SNES::system.reset();
|
||||
messages << "SNES reset" << std::endl;
|
||||
}
|
||||
|
@ -797,7 +831,6 @@ again2:
|
|||
if(!internal_rom)
|
||||
return;
|
||||
stepping_into_save = true;
|
||||
if(!allow_inconsistent_saves)
|
||||
SNES::system.runtosave();
|
||||
have_saved_this_frame = true;
|
||||
stepping_into_save = false;
|
||||
|
@ -809,7 +842,7 @@ again2:
|
|||
SNES::cpu.controller_flag = pflag;
|
||||
},
|
||||
//Request reset.
|
||||
[](long delay) -> void { do_reset_flag = delay; },
|
||||
[](long delay, bool hard) -> void { do_reset_flag = delay; do_hreset_flag = hard; },
|
||||
//Port types.
|
||||
port_types,
|
||||
//Cover page.
|
||||
|
|
|
@ -74,6 +74,16 @@ system_controller = {
|
|||
}
|
||||
};
|
||||
|
||||
system_controller_hreset = {
|
||||
["name"] = "(system)", ["class"] = "(system)", ["buttons"] = {
|
||||
{shadow, "F"},
|
||||
{shadow, "R"},
|
||||
{shadow_axis},
|
||||
{shadow_axis},
|
||||
{shadow, "H"}
|
||||
}
|
||||
};
|
||||
|
||||
ports = {
|
||||
{
|
||||
["symbol"] = "gamepad", ["iname"] = "gamepad", ["hname"] = "gamepad", ["controllers"] = {
|
||||
|
@ -125,5 +135,9 @@ ports = {
|
|||
["symbol"] = "psystem", ["iname"] = "system", ["hname"] = "system", ["controllers"] = {
|
||||
system_controller
|
||||
}, ["legal"] = {0}
|
||||
},{
|
||||
["symbol"] = "psystem_hreset", ["iname"] = "system", ["hname"] = "system", ["controllers"] = {
|
||||
system_controller_hreset
|
||||
}, ["legal"] = {0}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -439,7 +439,7 @@ namespace
|
|||
//Set poll flag.
|
||||
[](bool _pflag) -> void { pflag = _pflag; },
|
||||
//Request reset.
|
||||
[](long delay) -> void { do_reset_flag = true; },
|
||||
[](long delay, bool hard) -> void { do_reset_flag = true; },
|
||||
//Port types.
|
||||
port_types,
|
||||
//Cover page.
|
||||
|
|
|
@ -489,10 +489,10 @@ void core_core::set_pflag(bool pflag)
|
|||
return _set_pflag(pflag);
|
||||
}
|
||||
|
||||
void core_core::request_reset(long delay)
|
||||
void core_core::request_reset(long delay, bool hard)
|
||||
{
|
||||
if(_request_reset)
|
||||
_request_reset(delay);
|
||||
_request_reset(delay, hard);
|
||||
}
|
||||
|
||||
framebuffer_raw& core_core::draw_cover()
|
||||
|
|
|
@ -56,7 +56,7 @@ bool core_setting::is_boolean() const throw()
|
|||
return false;
|
||||
std::string a = values[0]->iname;
|
||||
std::string b = values[1]->iname;
|
||||
if(a < b)
|
||||
if(a > b)
|
||||
std::swap(a, b);
|
||||
return (a == "0" && b == "1");
|
||||
}
|
||||
|
|
|
@ -47,6 +47,7 @@ enum
|
|||
wxID_SUBFRAMEADVANCE,
|
||||
wxID_NEXTPOLL,
|
||||
wxID_ERESET,
|
||||
wxID_EHRESET,
|
||||
wxID_AUDIO_ENABLED,
|
||||
wxID_AUDIODEV_FIRST,
|
||||
wxID_AUDIODEV_LAST = wxID_AUDIODEV_FIRST + 255,
|
||||
|
@ -877,6 +878,7 @@ wxwin_mainwindow::wxwin_mainwindow()
|
|||
menu_entry(wxID_SUBFRAMEADVANCE, wxT("Step subframe"));
|
||||
menu_entry(wxID_NEXTPOLL, wxT("Step poll"));
|
||||
menu_entry(wxID_ERESET, wxT("Reset"));
|
||||
menu_entry(wxID_EHRESET, wxT("Power cycle"));
|
||||
|
||||
menu_start(wxT("Movie"));
|
||||
menu_entry_check(wxID_READONLY_MODE, wxT("Readonly mode"));
|
||||
|
@ -1045,6 +1047,9 @@ void wxwin_mainwindow::handle_menu_click_cancelable(wxCommandEvent& e)
|
|||
case wxID_ERESET:
|
||||
platform::queue("reset");
|
||||
return;
|
||||
case wxID_EHRESET:
|
||||
platform::queue("reset-hard");
|
||||
return;
|
||||
case wxID_EXIT:
|
||||
platform::queue("quit-emulator");
|
||||
return;
|
||||
|
|
Loading…
Add table
Reference in a new issue