From ead741a06e693f6f793cde35f7a9978b2371175b Mon Sep 17 00:00:00 2001 From: cracyc Date: Wed, 6 Apr 2016 16:50:46 -0500 Subject: [PATCH] luaengine: add device_image_interface accessors and emu_file support --- src/emu/luaengine.cpp | 113 ++++++++++++++++++++++++++++++++++++++++++ src/emu/luaengine.h | 5 ++ 2 files changed, 118 insertions(+) diff --git a/src/emu/luaengine.cpp b/src/emu/luaengine.cpp index db60d0ce0b5..162fa3959de 100644 --- a/src/emu/luaengine.cpp +++ b/src/emu/luaengine.cpp @@ -112,6 +112,52 @@ int lua_engine::docall(int narg, int nres) return status; } +namespace luabridge +{ +template <> +struct Stack +{ + static void push(lua_State *L, osd_file::error error) + { + std::string strerror; + switch(error) + { + case osd_file::error::NONE: + lua_pushboolean(L, false); + return; + case osd_file::error::FAILURE: + strerror = "failure"; + break; + case osd_file::error::OUT_OF_MEMORY: + strerror = "out_of_memory"; + break; + case osd_file::error::NOT_FOUND: + strerror = "not_found"; + break; + case osd_file::error::ACCESS_DENIED: + strerror = "access_denied"; + break; + case osd_file::error::ALREADY_OPEN: + strerror = "already_open"; + break; + case osd_file::error::TOO_MANY_FILES: + strerror = "too_many_files"; + break; + case osd_file::error::INVALID_DATA: + strerror = "invalid_data"; + break; + case osd_file::error::INVALID_ACCESS: + strerror = "invalid_access"; + break; + default: + strerror = "unknown_error"; + break; + } + lua_pushstring(L, strerror.c_str()); + } +}; +} + /* mark in error messages for incomplete statements */ #define EOFMARK "" #define marklen (sizeof(EOFMARK)/sizeof(char) - 1) @@ -450,6 +496,25 @@ luabridge::LuaRef lua_engine::l_machine_get_devices(const running_machine *r) return devs_table; } +//------------------------------------------------- +// machine_get_images - return table of available image devices userdata +// -> manager:machine().images["flop1"] +//------------------------------------------------- + +luabridge::LuaRef lua_engine::l_machine_get_images(const running_machine *r) +{ + lua_State *L = luaThis->m_lua_state; + luabridge::LuaRef image_table = luabridge::LuaRef::newTable(L); + + image_interface_iterator iter(r->root_device()); + for (device_image_interface *image = iter.first(); image != nullptr; image = iter.next()) { + image_table[image->brief_instance_name()] = image; + image_table[image->instance_name()] = image; + } + + return image_table; +} + //------------------------------------------------- // memory_banks - return memory_banks // -> manager:machine():memory().banks["maincpu"] @@ -606,6 +671,9 @@ luabridge::LuaRef lua_engine::l_dev_get_memspaces(const device_t *d) lua_State *L = luaThis->m_lua_state; luabridge::LuaRef sp_table = luabridge::LuaRef::newTable(L); + if(!&dev->memory()) + return sp_table; + for (address_spacenum sp = AS_0; sp < ADDRESS_SPACES; ++sp) { if (dev->memory().has_space(sp)) { sp_table[dev->memory().space(sp).name()] = &(dev->memory().space(sp)); @@ -625,6 +693,10 @@ luabridge::LuaRef lua_engine::l_dev_get_states(const device_t *d) device_t *dev = const_cast(d); lua_State *L = luaThis->m_lua_state; luabridge::LuaRef st_table = luabridge::LuaRef::newTable(L); + + if(!&dev->state()) + return st_table; + for (device_state_entry &s : dev->state().state_entries()) { // XXX: refrain from exporting non-visible entries? @@ -1288,6 +1360,18 @@ int lua_engine::lua_screen::l_draw_text(lua_State *L) return 0; } +int lua_engine::lua_emu_file::l_emu_file_read(lua_State *L) +{ + emu_file *file = luabridge::Stack::get(L, 1); + luaL_argcheck(L, lua_isnumber(L, 2), 2, "length (integer) expected"); + int ret, len = lua_tonumber(L, 2); + luaL_Buffer buff; + char *ptr = luaL_buffinitsize(L, &buff, len); + ret = file->read(ptr, len); + luaL_pushresultsize(&buff, ret); + return 1; +} + void *lua_engine::checkparam(lua_State *L, int idx, const char *tname) { const char *name; @@ -1779,6 +1863,7 @@ void lua_engine::initialize() .addFunction ("options", &running_machine::options) .addProperty ("devices", &lua_engine::l_machine_get_devices) .addProperty ("screens", &lua_engine::l_machine_get_screens) + .addProperty ("images", &lua_engine::l_machine_get_images) .endClass () .beginClass ("game_driver") .addData ("source_file", &game_driver::source_file) @@ -1794,6 +1879,7 @@ void lua_engine::initialize() .addFunction ("name", &device_t::name) .addFunction ("shortname", &device_t::shortname) .addFunction ("tag", &device_t::tag) + .addFunction ("owner", &device_t::owner) .addProperty ("spaces", &lua_engine::l_dev_get_memspaces) .addProperty ("state", &lua_engine::l_dev_get_states) .endClass() @@ -2032,6 +2118,33 @@ void lua_engine::initialize() .deriveClass ("region") .addProperty ("size", &memory_region::bytes) .endClass() + .beginClass ("images") + .addFunction ("exists", &device_image_interface::exists) + .addFunction ("filename", &device_image_interface::filename) + .addFunction ("longname", &device_image_interface::longname) + .addFunction ("manufacturer", &device_image_interface::manufacturer) + .addFunction ("year", &device_image_interface::year) + .addFunction ("software_list_name", &device_image_interface::software_list_name) + .addFunction ("image_type_name", &device_image_interface::image_type_name) + .addFunction ("load", &device_image_interface::load) + .addFunction ("unload", &device_image_interface::unload) + .addFunction ("crc", &device_image_interface::crc) + .addProperty ("device", static_cast(&device_image_interface::device)) + .addProperty ("is_readable", &device_image_interface::is_readable) + .addProperty ("is_writeable", &device_image_interface::is_writeable) + .addProperty ("is_creatable", &device_image_interface::is_creatable) + .addProperty ("is_reset_on_load", &device_image_interface::is_reset_on_load) + .endClass() + .beginClass ("lua_file") + .addCFunction ("read", &lua_emu_file::l_emu_file_read) + .endClass() + .deriveClass ("file") + .addConstructor () + .addFunction ("open", static_cast(&emu_file::open)) + .addFunction ("seek", &emu_file::seek) + .addFunction ("size", &emu_file::size) + .endClass() + .endNamespace(); luabridge::push (m_lua_state, machine_manager::instance()); diff --git a/src/emu/luaengine.h b/src/emu/luaengine.h index bfd88b5dcc7..e96603ba806 100644 --- a/src/emu/luaengine.h +++ b/src/emu/luaengine.h @@ -140,6 +140,7 @@ private: // "emu.machine" namespace static luabridge::LuaRef l_machine_get_devices(const running_machine *r); + static luabridge::LuaRef l_machine_get_images(const running_machine *r); static luabridge::LuaRef l_ioport_get_ports(const ioport_manager *i); static luabridge::LuaRef l_render_get_targets(const render_manager *r); static luabridge::LuaRef l_ioports_port_get_fields(const ioport_port *i); @@ -197,6 +198,10 @@ private: template int l_region_write(lua_State *L); }; + struct lua_emu_file { + int l_emu_file_read(lua_State *L); + }; + void resume(void *L, INT32 param); void start(); static int luaopen_ioport(lua_State *L);