Support for hard resets and make some stuff movie settings

This commit is contained in:
Ilari Liusvaara 2013-01-27 13:57:33 +02:00
parent 0b45d38af1
commit b928596e09
9 changed files with 96 additions and 27 deletions

View file

@ -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&);

View file

@ -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)",

View file

@ -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.

View file

@ -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.

View file

@ -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}
}
};

View file

@ -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.

View file

@ -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()

View file

@ -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");
}

View file

@ -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;