summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/mame.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/mame.cpp')
-rw-r--r--src/frontend/mame/mame.cpp129
1 files changed, 95 insertions, 34 deletions
diff --git a/src/frontend/mame/mame.cpp b/src/frontend/mame/mame.cpp
index b996bae1dc0..a44bd19814f 100644
--- a/src/frontend/mame/mame.cpp
+++ b/src/frontend/mame/mame.cpp
@@ -19,11 +19,14 @@
#include "cheat.h"
#include "clifront.h"
#include "emuopts.h"
+#include "fileio.h"
#include "luaengine.h"
#include "mameopts.h"
#include "pluginopts.h"
+#include "rendlay.h"
#include "validity.h"
+#include "corestr.h"
#include "xmlfile.h"
#include "osdepend.h"
@@ -71,6 +74,7 @@ mame_machine_manager::mame_machine_manager(emu_options &options,osd_interface &o
mame_machine_manager::~mame_machine_manager()
{
+ m_autoboot_script.reset();
m_lua.reset();
s_manager = nullptr;
}
@@ -139,10 +143,7 @@ void mame_machine_manager::start_luaengine()
std::string pluginpath;
while (iter.next(pluginpath))
{
- // user may specify environment variables; subsitute them
- osd_subst_env(pluginpath, pluginpath);
-
- // and then scan the directory recursively
+ // scan the directory recursively
m_plugins->scan_directory(pluginpath, true);
}
@@ -150,7 +151,7 @@ void mame_machine_manager::start_luaengine()
// parse the file
// attempt to open the output file
emu_file file(options().ini_path(), OPEN_FLAG_READ);
- if (file.open("plugin.ini") == osd_file::error::NONE)
+ if (!file.open("plugin.ini"))
{
try
{
@@ -166,18 +167,18 @@ void mame_machine_manager::start_luaengine()
// process includes
for (const std::string &incl : split(options().plugin(), ','))
{
- plugin *p = m_plugins->find(incl);
+ plugin_options::plugin *p = m_plugins->find(incl);
if (!p)
- fatalerror("Fatal error: Could not load plugin: %s\n", incl.c_str());
+ fatalerror("Fatal error: Could not load plugin: %s\n", incl);
p->m_start = true;
}
// process excludes
for (const std::string &excl : split(options().no_plugin(), ','))
{
- plugin *p = m_plugins->find(excl);
+ plugin_options::plugin *p = m_plugins->find(excl);
if (!p)
- fatalerror("Fatal error: Unknown plugin: %s\n", excl.c_str());
+ fatalerror("Fatal error: Unknown plugin: %s\n", excl);
p->m_start = false;
}
}
@@ -185,7 +186,7 @@ void mame_machine_manager::start_luaengine()
// we have a special way to open the console plugin
if (options().console())
{
- plugin *p = m_plugins->find(OPTION_CONSOLE);
+ plugin_options::plugin *p = m_plugins->find(OPTION_CONSOLE);
if (!p)
fatalerror("Fatal error: Console plugin not found.\n");
@@ -196,12 +197,32 @@ void mame_machine_manager::start_luaengine()
{
emu_file file(options().plugins_path(), OPEN_FLAG_READ);
- osd_file::error filerr = file.open("boot.lua");
- if (filerr == osd_file::error::NONE)
+ std::error_condition const filerr = file.open("boot.lua");
+ if (!filerr)
{
- std::string exppath;
- osd_subst_env(exppath, std::string(file.fullpath()));
- m_lua->load_script(exppath.c_str());
+ const std::string exppath = file.fullpath();
+ auto &l(*lua());
+ auto load_result = l.load_script(exppath);
+ if (!load_result.valid())
+ {
+ sol::error err = load_result;
+ sol::load_status status = load_result.status();
+ fatalerror("Error plugin bootstrap script %s: %s error\n%s\n",
+ exppath,
+ sol::to_string(status),
+ err.what());
+ }
+ sol::protected_function func = load_result;
+ sol::protected_function_result call_result = l.invoke(func);
+ if (!call_result.valid())
+ {
+ sol::error err = call_result;
+ sol::call_status status = call_result.status();
+ fatalerror("Error running plugin bootstrap script %s: %s error\n%s\n",
+ options().autoboot_script(),
+ sol::to_string(status),
+ err.what());
+ }
}
}
}
@@ -243,7 +264,7 @@ int mame_machine_manager::execute()
m_options.revert(OPTION_PRIORITY_INI);
std::ostringstream errors;
- mame_options::parse_standard_inis(m_options, errors);
+ mame_options::parse_standard_inis(m_options, errors, system);
}
// otherwise, perform validity checks before anything else
@@ -277,7 +298,10 @@ int mame_machine_manager::execute()
else
{
if (machine.exit_pending())
+ {
m_options.set_system_name("");
+ m_options.set_value(OPTION_BIOS, "", OPTION_PRIORITY_CMDLINE);
+ }
}
if (machine.exit_pending() && (!started_empty || is_empty))
@@ -292,21 +316,35 @@ int mame_machine_manager::execute()
TIMER_CALLBACK_MEMBER(mame_machine_manager::autoboot_callback)
{
- if (strlen(options().autoboot_script())!=0) {
- mame_machine_manager::instance()->lua()->load_script(options().autoboot_script());
+ if (*options().autoboot_script())
+ {
+ assert(m_autoboot_script);
+ sol::protected_function func = *m_autoboot_script;
+ sol::protected_function_result result = lua()->invoke(func);
+ if (!result.valid())
+ {
+ sol::error err = result;
+ sol::call_status status = result.status();
+ fatalerror("Error running autoboot script %s: %s error\n%s\n",
+ options().autoboot_script(),
+ sol::to_string(status),
+ err.what());
+ }
}
- else if (strlen(options().autoboot_command())!=0) {
- std::string cmd = std::string(options().autoboot_command());
+ else if (*options().autoboot_command())
+ {
+ std::string cmd(options().autoboot_command());
strreplace(cmd, "'", "\\'");
std::string val = std::string("emu.keypost('").append(cmd).append("')");
- mame_machine_manager::instance()->lua()->load_string(val.c_str());
+ auto &l(*lua());
+ l.invoke(l.load_string(val).get<sol::protected_function>());
}
}
void mame_machine_manager::reset()
{
// setup autoboot if needed
- m_autoboot_timer->adjust(attotime(options().autoboot_delay(),0),0);
+ m_autoboot_timer->adjust(attotime(options().autoboot_delay(), 0), 0);
}
ui_manager* mame_machine_manager::create_ui(running_machine& machine)
@@ -316,8 +354,6 @@ ui_manager* mame_machine_manager::create_ui(running_machine& machine)
machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(&mame_machine_manager::reset, this));
- m_ui->set_startup_text("Initializing...", true);
-
return m_ui.get();
}
@@ -334,7 +370,7 @@ void mame_machine_manager::before_load_settings(running_machine& machine)
m_lua->on_machine_before_load_settings();
}
-void mame_machine_manager::create_custom(running_machine& machine)
+void mame_machine_manager::create_custom(running_machine &machine)
{
// start the inifile manager
m_inifile = std::make_unique<inifile_manager>(m_ui->options());
@@ -344,6 +380,25 @@ void mame_machine_manager::create_custom(running_machine& machine)
// start favorite manager
m_favorite = std::make_unique<favorite_manager>(m_ui->options());
+
+ // attempt to load the autoboot script if configured
+ m_autoboot_script.reset();
+ if (*options().autoboot_script())
+ {
+ auto result = lua()->load_script(options().autoboot_script());
+ if (!result.valid())
+ {
+ sol::error err = result;
+ sol::load_status status = result.status();
+ fatalerror("Error loading autoboot script %s: %s error\n%s\n",
+ options().autoboot_script(),
+ sol::to_string(status),
+ err.what());
+ }
+ m_autoboot_script.reset(new sol::load_result(std::move(result)));
+ sol::protected_function func = *m_autoboot_script;
+ sol::set_environment(lua()->make_environment(), func);
+ }
}
void mame_machine_manager::load_cheatfiles(running_machine& machine)
@@ -363,7 +418,7 @@ std::vector<std::reference_wrapper<const std::string>> mame_machine_manager::mis
assert(m_machine);
// make sure that any required image has a mounted file
- for (device_image_interface &image : image_interface_iterator(m_machine->root_device()))
+ for (device_image_interface &image : image_interface_enumerator(m_machine->root_device()))
{
if (image.must_be_loaded())
{
@@ -404,9 +459,9 @@ int emulator_info::start_frontend(emu_options &options, osd_interface &osd, int
return start_frontend(options, osd, args);
}
-void emulator_info::draw_user_interface(running_machine& machine)
+bool emulator_info::draw_user_interface(running_machine& machine)
{
- mame_machine_manager::instance()->ui().update_and_render(machine.render().ui_container());
+ return mame_machine_manager::instance()->ui().update_and_render(machine.render().ui_container());
}
void emulator_info::periodic_check()
@@ -424,14 +479,20 @@ void emulator_info::sound_hook()
return mame_machine_manager::instance()->lua()->on_sound_update();
}
-void emulator_info::layout_file_cb(util::xml::data_node const &layout)
+void emulator_info::layout_script_cb(layout_file &file, const char *script)
{
- util::xml::data_node const *const mamelayout = layout.get_child("mamelayout");
- if (mamelayout)
+ // TODO: come up with a better way to pass multiple arguments to plugin
+ //mame_machine_manager::instance()->lua()->call_plugin_set("layout", std::make_tuple(&file, script->get_value()));
+ auto &lua(mame_machine_manager::instance()->lua()->sol());
+ sol::object obj = lua.registry()["cb_layout"];
+ if (obj.is<sol::protected_function>())
{
- util::xml::data_node const *const script = mamelayout->get_child("script");
- if (script)
- mame_machine_manager::instance()->lua()->call_plugin_set("layout", script->get_value());
+ auto res = obj.as<sol::protected_function>()(sol::make_reference(lua, &file), sol::make_reference(lua, script));
+ if (!res.valid())
+ {
+ sol::error err = res;
+ osd_printf_error("[LUA ERROR] in call_plugin: %s\n", err.what());
+ }
}
}