summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2016-04-08 22:30:32 -0500
committer cracyc <cracyc@users.noreply.github.com>2016-04-08 22:30:32 -0500
commit74d1fbbdb96399b8f49ff8393b4c9fe2af9e2ff3 (patch)
treee947a7c169edacfa23daca107bc98de7bd23adca
parent7047f18fdf2685819b3d3383bbebfa3f67ec22ae (diff)
plugins/cheatfind: start adding basic menu (nw)
-rw-r--r--plugins/cheat/init.lua11
-rw-r--r--plugins/cheatfind/init.lua156
-rw-r--r--src/emu/luaengine.cpp74
-rw-r--r--src/emu/luaengine.h2
4 files changed, 232 insertions, 11 deletions
diff --git a/plugins/cheat/init.lua b/plugins/cheat/init.lua
index a096869ce20..72b1ba83e9f 100644
--- a/plugins/cheat/init.lua
+++ b/plugins/cheat/init.lua
@@ -148,7 +148,8 @@ function cheat.startplugin()
draw_box = draw_box,
tobcd = tobcd,
frombcd = frombcd,
- pairs = pairs }
+ pairs = pairs,
+ ipairs = ipairs }
cheat.enabled = false
-- verify scripts are valid first
if not cheat.script then
@@ -250,7 +251,7 @@ function cheat.startplugin()
local function menu_populate()
local menu = {}
- for num, cheat in pairs(cheats) do
+ for num, cheat in ipairs(cheats) do
menu[num] = {}
menu[num][1] = cheat.desc
if not cheat.parameter then
@@ -415,13 +416,13 @@ function cheat.startplugin()
emu.register_start(function()
cheats = load_cheats()
- for num, cheat in pairs(cheats) do
+ for num, cheat in ipairs(cheats) do
parse_cheat(cheat)
end
end)
emu.register_frame(function()
- for num, cheat in pairs(cheats) do
+ for num, cheat in ipairs(cheats) do
if cheat.enabled and cheat.script.run then
cheat.script.run()
end
@@ -430,7 +431,7 @@ function cheat.startplugin()
emu.register_frame_done(function()
line = 0
- for num, draw in pairs(output) do
+ for num, draw in ipairs(output) do
if draw.type == "text" then
if not draw.color then
draw.scr:draw_text(draw.x, draw.y, draw.str)
diff --git a/plugins/cheatfind/init.lua b/plugins/cheatfind/init.lua
index a4334b67aba..582bf86e8aa 100644
--- a/plugins/cheatfind/init.lua
+++ b/plugins/cheatfind/init.lua
@@ -32,9 +32,12 @@ function cheatfind.startplugin()
local ram = {}
for tag, device in pairs(manager:machine().devices) do
if device:shortname() == "ram" then
- ram[tag] = device
+ ram[tag] = {}
+ ram[tag].dev = device
+ ram[tag].size = emu.item(device.items["0/m_size"]:read(0))
end
end
+ return ram
end
-- save data block
@@ -91,8 +94,157 @@ function cheatfind.startplugin()
end
return ret
end
-
+
_G.cf = cheat
+
+ local devtable = {}
+ local devsel = 1
+ local optable = { "+", "-" }
+ local opsel = 1
+ local change = 0
+ local matches = {}
+ local menu_blocks = {}
+
+ local function start()
+ devtable = {}
+ menu_blocks = {}
+ matches = {}
+ local table = cheat.getspaces()
+ for tag, list in pairs(table) do
+ if list.program then
+ local ram = {}
+ for num, entry in pairs(list.program.map) do
+ if entry.writetype == "ram" then
+ ram[#ram + 1] = { offset = entry.offset, size = entry.endoff - entry.offset }
+ end
+ end
+ if next(ram) then
+ devtable[#devtable + 1] = { tag = tag, space = list.program, ram = ram }
+ end
+ end
+ end
+ table = cheat.getram()
+ for tag, ram in pairs(table) do
+ devtable[#devtable + 1] = { tag = tag, space = ram.dev, ram = { offset = 0, size = ram.size } }
+ end
+ end
+
+ emu.register_start(start)
+
+ local function menu_populate()
+ local menu = {}
+ menu[1] = {}
+ menu[1][1] = "Region"
+ menu[1][2] = devtable[devsel].tag
+ if #devtable == 1 then
+ menu[1][3] = 0
+ elseif devsel == 1 then
+ menu[1][3] = 2
+ elseif devsel == #devtable then
+ menu[1][3] = 1
+ else
+ menu[1][3] = 3
+ end
+ menu[2] = { "Init", "", 0 }
+ if next(menu_blocks) then
+ menu[3] = { "---", "", 32 }
+ menu[4] = {}
+ menu[4][1] = "Operator"
+ menu[4][2] = optable[opsel]
+ if opsel == 1 then
+ menu[4][3] = 2
+ elseif opsel == #optable then
+ menu[4][3] = 1
+ else
+ menu[4][3] = 3
+ end
+ menu[5] = {}
+ menu[5][1] = "Change"
+ menu[5][2] = change
+ if change == 0 then
+ menu[5][2] = "Any"
+ menu[5][3] = 2
+ elseif change == 100 then --?
+ menu[5][3] = 1
+ else
+ menu[5][3] = 3
+ end
+ menu[6] = { "Compare", "", 0 }
+ menu[7] = { "---", "", 32 }
+ for num, list in ipairs(matches) do
+ for num2, match in ipairs(list) do
+ if #menu > 50 then
+ break
+ end
+ menu[#menu + 1] = { string.format("%x %x %x", match.addr, match.oldval, match.newval), "", 0 }
+ end
+ end
+ end
+ return menu
+ end
+
+ local function menu_callback(index, event)
+ if index == 1 then
+ if event == "left" then
+ if devsel ~= 1 then
+ devsel = devsel - 1
+ return true
+ end
+ elseif event == "right" then
+ if devsel ~= #devtable then
+ devsel = devsel + 1
+ return true
+ end
+ end
+ elseif index == 2 then
+ if event == "select" then
+ menu_blocks = {}
+ matches = {}
+ for num, region in ipairs(devtable[devsel].ram) do
+ menu_blocks[num] = cheat.save(devtable[devsel].space, region.offset, region.size)
+ end
+ return true
+ end
+ elseif index == 4 then
+ if event == "left" then
+ if opsel ~= 1 then
+ opsel = opsel - 1
+ return true
+ end
+ elseif event == "right" then
+ if opsel ~= #optable then
+ opsel = opsel + 1
+ return true
+ end
+ end
+ elseif index == 5 then
+ if event == "left" then
+ if change ~= 0 then
+ change = change - 1
+ return true
+ end
+ elseif event == "right" then
+ if change ~= 100 then
+ change = change + 1
+ return true
+ end
+ end
+ elseif index == 6 then
+ if event == "select" then
+ matches = {}
+ for num, block in ipairs(menu_blocks) do
+ matches[#matches + 1] = cheat.comp(block, optable[opsel], change)
+ end
+ return true
+ end
+ elseif index > 7 then
+ if event == "select" then
+ -- write out a script?
+ end
+ end
+ return false
+ end
+ emu.register_menu(menu_callback, menu_populate, "Cheat Finder")
end
return exports
diff --git a/src/emu/luaengine.cpp b/src/emu/luaengine.cpp
index 640f1bc9874..a5cd130fb81 100644
--- a/src/emu/luaengine.cpp
+++ b/src/emu/luaengine.cpp
@@ -156,8 +156,49 @@ struct Stack <osd_file::error>
lua_pushstring(L, strerror.c_str());
}
};
+template <>
+struct Stack <map_handler_type>
+{
+ static void push(lua_State *L, map_handler_type error)
+ {
+ std::string type;
+ switch(error)
+ {
+ case AMH_NONE:
+ type = "none";
+ break;
+ case AMH_RAM:
+ type = "ram";
+ break;
+ case AMH_ROM:
+ type = "rom";
+ break;
+ case AMH_NOP:
+ type = "nop";
+ break;
+ case AMH_UNMAP:
+ type = "unmap";
+ break;
+ case AMH_DEVICE_DELEGATE:
+ type = "delegate";
+ break;
+ case AMH_PORT:
+ type = "port";
+ break;
+ case AMH_BANK:
+ type = "bank";
+ break;
+ case AMH_DEVICE_SUBMAP:
+ type = "submap";
+ break;
+ default:
+ type = "unknown";
+ break;
+ }
+ lua_pushstring(L, type.c_str());
+ }
+};
}
-
/* mark in error messages for incomplete statements */
#define EOFMARK "<eof>"
#define marklen (sizeof(EOFMARK)/sizeof(char) - 1)
@@ -960,7 +1001,7 @@ int lua_engine::lua_addr_space::l_mem_write(lua_State *L)
UINT8 lua_engine::read_direct_byte(address_space &space, offs_t addr)
{
- UINT8 *base = (UINT8 *)space.get_read_ptr(addr);
+ UINT8 *base = (UINT8 *)space.get_read_ptr(space.address_to_byte(addr));
if(base)
return base[addr];
else
@@ -1001,7 +1042,7 @@ int lua_engine::lua_addr_space::l_direct_mem_read(lua_State *L)
void lua_engine::write_direct_byte(address_space &space, offs_t addr, UINT8 byte)
{
- UINT8 *base = (UINT8 *)space.get_read_ptr(addr);
+ UINT8 *base = (UINT8 *)space.get_read_ptr(space.address_to_byte(addr));
if(base)
base[addr] = byte;
}
@@ -1099,6 +1140,24 @@ int lua_engine::lua_memory_region::l_region_write(lua_State *L)
return 0;
}
+luabridge::LuaRef lua_engine::l_addr_space_map(const address_space *space)
+{
+ lua_State *L = luaThis->m_lua_state;
+ luabridge::LuaRef map = luabridge::LuaRef::newTable(L);
+
+ int i = 1;
+ for (address_map_entry &entry : space->map()->m_entrylist)
+ {
+ luabridge::LuaRef mapentry = luabridge::LuaRef::newTable(L);
+ mapentry["offset"] = space->address_to_byte(entry.m_addrstart) & space->bytemask();
+ mapentry["endoff"] = space->address_to_byte(entry.m_addrend) & space->bytemask();
+ mapentry["readtype"] = entry.m_read.m_type;
+ mapentry["writetype"] = entry.m_write.m_type;
+ map[i++] = mapentry;
+ }
+ return map;
+}
+
int lua_engine::lua_options_entry::l_entry_value(lua_State *L)
{
core_options::entry *e = luabridge::Stack<core_options::entry *>::get(L, 1);
@@ -1691,7 +1750,13 @@ std::vector<lua_engine::menu_item> &lua_engine::menu_populate(std::string &menu)
lua_pop(m_lua_state, 1);
return menu_list;
}
- lua_pcall(m_lua_state, 0, 1, 0);
+ if(int error = lua_pcall(m_lua_state, 0, 1, 0))
+ {
+ if(error == 2)
+ printf("%s\n", lua_tostring(m_lua_state, -1));
+ lua_pop(m_lua_state, 1);
+ return menu_list;
+ }
if(!lua_istable(m_lua_state, -1))
{
lua_pop(m_lua_state, 1);
@@ -2149,6 +2214,7 @@ void lua_engine::initialize()
.endClass()
.deriveClass <address_space, lua_addr_space> ("addr_space")
.addFunction("name", &address_space::name)
+ .addProperty <luabridge::LuaRef, void> ("map", &lua_engine::l_addr_space_map)
.endClass()
.beginClass <render_target> ("target")
.addFunction ("width", &render_target::width)
diff --git a/src/emu/luaengine.h b/src/emu/luaengine.h
index 7fefb73d0e3..69247a84cdf 100644
--- a/src/emu/luaengine.h
+++ b/src/emu/luaengine.h
@@ -161,6 +161,8 @@ private:
template<typename T> int l_direct_mem_read(lua_State *L);
template<typename T> int l_direct_mem_write(lua_State *L);
};
+ static luabridge::LuaRef l_addr_space_map(const address_space *as);
+
static luabridge::LuaRef l_machine_get_screens(const running_machine *r);
struct lua_screen {
int l_height(lua_State *L);