summaryrefslogtreecommitdiffstatshomepage
path: root/src/frontend/mame/luaengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/frontend/mame/luaengine.cpp')
-rw-r--r--src/frontend/mame/luaengine.cpp27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/frontend/mame/luaengine.cpp b/src/frontend/mame/luaengine.cpp
index e8fe2f2fcb4..b5405f9722d 100644
--- a/src/frontend/mame/luaengine.cpp
+++ b/src/frontend/mame/luaengine.cpp
@@ -1279,6 +1279,8 @@ void lua_engine::initialize()
* machine:soft_reset() - soft reset emulation
* machine:save(filename) - save state to filename
* machine:load(filename) - load state from filename
+ * machine:buffer_save() - return save state buffer as binary string
+ * machine:buffer_load(str) - load state from binary string buffer. returns true on success, otherwise nil
* machine:popmessage(str) - print str as popup
* machine:popmessage() - clear displayed popup message
* machine:logerror(str) - print str to log
@@ -1311,6 +1313,31 @@ void lua_engine::initialize()
machine_type.set("soft_reset", &running_machine::schedule_soft_reset);
machine_type.set("save", &running_machine::schedule_save);
machine_type.set("load", &running_machine::schedule_load);
+ machine_type.set("buffer_save", [](running_machine &m, sol::this_state s) {
+ lua_State *L = s;
+ luaL_Buffer buff;
+ int size = ram_state::get_size(m.save());
+ u8 *ptr = (u8 *)luaL_buffinitsize(L, &buff, size);
+ save_error error = m.save().write_buffer(ptr, size);
+ if (error == STATERR_NONE)
+ {
+ luaL_pushresultsize(&buff, size);
+ return sol::make_reference(L, sol::stack_reference(L, -1));
+ }
+ luaL_error(L, "State save error.");
+ return sol::make_reference(L, nullptr);
+ });
+ machine_type.set("buffer_load", [](running_machine &m, sol::this_state s, std::string str) {
+ lua_State *L = s;
+ save_error error = m.save().read_buffer((u8 *)str.data(), str.size());
+ if (error == STATERR_NONE)
+ return true;
+ else
+ {
+ luaL_error(L,"State load error.");
+ return false;
+ }
+ });
machine_type.set("system", &running_machine::system);
machine_type.set("video", &running_machine::video);
machine_type.set("sound", &running_machine::sound);