mirror of
https://github.com/holub/mame
synced 2025-04-20 23:42:22 +03:00
plugins/cheatfind: more gui work (nw)
This commit is contained in:
parent
5f6e20d6a6
commit
1550a25fde
@ -1,6 +1,6 @@
|
||||
-- license:BSD-3-Clause
|
||||
-- copyright-holders:Carl
|
||||
-- This is a library of functions to be used at the Lua console as cf.getspaces() etc...
|
||||
-- This includes a library of functions to be used at the Lua console as cf.getspaces() etc...
|
||||
local exports = {}
|
||||
exports.name = "cheatfind"
|
||||
exports.version = "0.0.1"
|
||||
@ -60,14 +60,16 @@ function cheatfind.startplugin()
|
||||
return data
|
||||
end
|
||||
|
||||
-- compare a data block to the current state
|
||||
function cheat.comp(olddata, oper, val)
|
||||
local newdata = cheat.save(olddata.dev, olddata.start, olddata.size, olddata.space)
|
||||
-- compare two data blocks
|
||||
function cheat.comp(olddata, newdata, oper, val)
|
||||
local ret = {}
|
||||
if olddata.start ~= newdata.start or olddata.size ~= newdata.size then
|
||||
return {}
|
||||
end
|
||||
if not val then
|
||||
val = 0
|
||||
end
|
||||
if oper == "+" or oper == "inc" then
|
||||
if oper == "+" or oper == "inc" or oper == "<" or oper == "lt" then
|
||||
for i = 1, olddata.size do
|
||||
local old = string.unpack("B", olddata.block, i)
|
||||
local new = string.unpack("B", newdata.block, i)
|
||||
@ -79,7 +81,7 @@ function cheatfind.startplugin()
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif oper == "-" or oper == "dec" then
|
||||
elseif oper == "-" or oper == "dec" or oper == ">" or oper == "gt" then
|
||||
for i = 1, olddata.size do
|
||||
local old = string.unpack("B", olddata.block, i)
|
||||
local new = string.unpack("B", newdata.block, i)
|
||||
@ -91,25 +93,52 @@ function cheatfind.startplugin()
|
||||
end
|
||||
end
|
||||
end
|
||||
elseif oper == "=" or oper == "eq" then
|
||||
for i = 1, olddata.size do
|
||||
local old = string.unpack("B", olddata.block, i)
|
||||
local new = string.unpack("B", newdata.block, i)
|
||||
if old == new then
|
||||
ret[#ret + 1] = { addr = olddata.start + i,
|
||||
oldval = old,
|
||||
newval = new}
|
||||
end
|
||||
end
|
||||
end
|
||||
return ret
|
||||
end
|
||||
|
||||
-- compare a data block to the current state
|
||||
function cheat.compcur(olddata, oper, val)
|
||||
local newdata = cheat.save(olddata.dev, olddata.start, olddata.size, olddata.space)
|
||||
return cheat.comp(olddata, newdata, oper, val)
|
||||
end
|
||||
|
||||
_G.cf = cheat
|
||||
|
||||
local devtable = {}
|
||||
local devsel = 1
|
||||
local optable = { "+", "-" }
|
||||
local optable = { "<", ">", "=" }
|
||||
local opsel = 1
|
||||
local change = 0
|
||||
local value = 0
|
||||
local leftop = 1
|
||||
local rightop = 0
|
||||
local matches = {}
|
||||
local matchsel = 1
|
||||
local menu_blocks = {}
|
||||
local midx = { region = 1, init = 2, save = 3, op = 5, val = 6, lop = 7, rop = 8, comp = 9, match = 11 }
|
||||
|
||||
local function start()
|
||||
devtable = {}
|
||||
menu_blocks = {}
|
||||
devsel = 1
|
||||
opsel = 1
|
||||
value = 0
|
||||
leftop = 1
|
||||
rightop = 0
|
||||
matches = {}
|
||||
local table = cheat.getspaces()
|
||||
matchsel = 1
|
||||
menu_blocks = {}
|
||||
|
||||
table = cheat.getspaces()
|
||||
for tag, list in pairs(table) do
|
||||
if list.program then
|
||||
local ram = {}
|
||||
@ -133,50 +162,74 @@ function cheatfind.startplugin()
|
||||
|
||||
local function menu_populate()
|
||||
local menu = {}
|
||||
menu[1] = {}
|
||||
menu[1][1] = "Region"
|
||||
menu[1][2] = devtable[devsel].tag
|
||||
menu[midx.region] = { "CPU or RAM", devtable[devsel].tag, "" }
|
||||
if #devtable == 1 then
|
||||
menu[1][3] = 0
|
||||
menu[midx.region][3] = 0
|
||||
elseif devsel == 1 then
|
||||
menu[1][3] = "r"
|
||||
menu[midx.region][3] = "r"
|
||||
elseif devsel == #devtable then
|
||||
menu[1][3] = "l"
|
||||
menu[midx.region][3] = "l"
|
||||
else
|
||||
menu[1][3] = "lr"
|
||||
menu[midx.region][3] = "lr"
|
||||
end
|
||||
menu[2] = { "Init", "", 0 }
|
||||
menu[midx.init] = { "Init", "", 0 }
|
||||
if next(menu_blocks) then
|
||||
menu[3] = { "---", "", "off" }
|
||||
menu[4] = {}
|
||||
menu[4][1] = "Operator"
|
||||
menu[4][2] = optable[opsel]
|
||||
menu[midx.save] = { "Save current", "", 0 }
|
||||
menu[midx.save + 1] = { "---", "", "off" }
|
||||
menu[midx.op] = { "Operator", optable[opsel], "" }
|
||||
if opsel == 1 then
|
||||
menu[4][3] = "r"
|
||||
menu[midx.op][3] = "r"
|
||||
elseif opsel == #optable then
|
||||
menu[4][3] = "l"
|
||||
menu[midx.op][3] = "l"
|
||||
else
|
||||
menu[4][3] = "lr"
|
||||
menu[midx.op][3] = "lr"
|
||||
end
|
||||
menu[5] = {}
|
||||
menu[5][1] = "Change"
|
||||
menu[5][2] = change
|
||||
if change == 0 then
|
||||
menu[5][2] = "Any"
|
||||
menu[5][3] = "r"
|
||||
elseif change == 100 then --?
|
||||
menu[5][3] = "l"
|
||||
menu[midx.val] = { "Value", value, "" }
|
||||
if value == 0 then
|
||||
menu[midx.val][2] = "Any"
|
||||
menu[midx.val][3] = "r"
|
||||
elseif value == 100 then --?
|
||||
menu[midx.val][3] = "l"
|
||||
else
|
||||
menu[5][3] = "lr"
|
||||
menu[midx.val][3] = "lr"
|
||||
end
|
||||
menu[6] = { "Compare", "", 0 }
|
||||
menu[7] = { "---", "", "off" }
|
||||
for num, list in ipairs(matches) do
|
||||
for num2, match in ipairs(list) do
|
||||
menu[midx.lop] = { "Left operand", leftop, "" }
|
||||
if #menu_blocks == 1 then
|
||||
menu[midx.lop][3] = 0
|
||||
elseif leftop == 1 then
|
||||
menu[midx.lop][3] = "r"
|
||||
elseif leftop == #menu_blocks then
|
||||
menu[midx.lop][3] = "l"
|
||||
else
|
||||
menu[midx.lop][3] = "lr"
|
||||
end
|
||||
menu[midx.rop] = { "Right operand", leftop, "" }
|
||||
if rightop == 0 then
|
||||
menu[midx.rop][2] = "Current"
|
||||
menu[midx.rop][3] = "r"
|
||||
elseif rightop == #menu_blocks then
|
||||
menu[midx.rop][3] = "l"
|
||||
else
|
||||
menu[midx.rop][3] = "lr"
|
||||
end
|
||||
menu[midx.comp] = { "Compare", "", 0 }
|
||||
if next(matches) then
|
||||
menu[midx.comp + 1] = { "---", "", "off" }
|
||||
menu[midx.match] = { "Match block", matchsel, "" }
|
||||
if #matches == 1 then
|
||||
menu[midx.match][3] = 0
|
||||
elseif matchsel == 1 then
|
||||
menu[midx.match][3] = "r"
|
||||
elseif matchsel == #matches then
|
||||
menu[midx.match][3] = "l"
|
||||
else
|
||||
menu[midx.match][3] = "lr"
|
||||
end
|
||||
for num2, match in ipairs(matches[matchsel]) do
|
||||
if #menu > 50 then
|
||||
break
|
||||
end
|
||||
menu[#menu + 1] = { string.format("%x %x %x", match.addr, match.oldval, match.newval), "", 0 }
|
||||
menu[#menu + 1] = { string.format("%08x %02x %02x", match.addr, match.oldval, match.newval), "", 0 }
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -184,7 +237,7 @@ function cheatfind.startplugin()
|
||||
end
|
||||
|
||||
local function menu_callback(index, event)
|
||||
if index == 1 then
|
||||
if index == midx.region then
|
||||
if event == "left" then
|
||||
if devsel ~= 1 then
|
||||
devsel = devsel - 1
|
||||
@ -196,17 +249,34 @@ function cheatfind.startplugin()
|
||||
return true
|
||||
end
|
||||
end
|
||||
elseif index == 2 then
|
||||
elseif index == midx.init then
|
||||
if event == "select" then
|
||||
menu_blocks = {}
|
||||
menu_blocks = {{}}
|
||||
matches = {}
|
||||
for num, region in ipairs(devtable[devsel].ram) do
|
||||
menu_blocks[num] = cheat.save(devtable[devsel].space, region.offset, region.size)
|
||||
menu_blocks[1][num] = cheat.save(devtable[devsel].space, region.offset, region.size)
|
||||
end
|
||||
manager:machine():popmessage("Data cleared and current state saved")
|
||||
return true
|
||||
end
|
||||
elseif index == 4 then
|
||||
if event == "left" then
|
||||
elseif index == midx.save then
|
||||
if event == "select" then
|
||||
for num, region in ipairs(devtable[devsel].ram) do
|
||||
menu_blocks[#menu_blocks][num] = cheat.save(devtable[devsel].space, region.offset, region.size)
|
||||
end
|
||||
manager:machine():popmessage("Current state saved")
|
||||
return false
|
||||
end
|
||||
elseif index == midx.op then
|
||||
if event == "up" or event == "down" or event == "comment" then
|
||||
if optable[opsel] == "<" then
|
||||
manager:machine():popmessage("Left less than right, value is difference")
|
||||
elseif optable[opsel] == ">" then
|
||||
manager:machine():popmessage("Left greater than right, value is difference")
|
||||
elseif optable[opsel] == "=" then
|
||||
manager:machine():popmessage("Left equal to right, value is ignored")
|
||||
end
|
||||
elseif event == "left" then
|
||||
if opsel ~= 1 then
|
||||
opsel = opsel - 1
|
||||
return true
|
||||
@ -217,27 +287,68 @@ function cheatfind.startplugin()
|
||||
return true
|
||||
end
|
||||
end
|
||||
elseif index == 5 then
|
||||
elseif index == midx.val then
|
||||
if event == "left" then
|
||||
if change ~= 0 then
|
||||
change = change - 1
|
||||
if value ~= 0 then
|
||||
value = value - 1
|
||||
return true
|
||||
end
|
||||
elseif event == "right" then
|
||||
if change ~= 100 then
|
||||
change = change + 1
|
||||
if value ~= 100 then
|
||||
value = value + 1
|
||||
return true
|
||||
end
|
||||
end
|
||||
elseif index == 6 then
|
||||
elseif index == midx.lop then
|
||||
if event == "left" then
|
||||
if leftop ~= 1 then
|
||||
leftop = leftop - 1
|
||||
return true
|
||||
end
|
||||
elseif event == "right" then
|
||||
if leftop ~= #menu_blocks then
|
||||
leftop = leftop + 1
|
||||
return true
|
||||
end
|
||||
end
|
||||
elseif index == midx.rop then
|
||||
if event == "left" then
|
||||
if rightop ~= 0 then
|
||||
rightop = rightop - 1
|
||||
return true
|
||||
end
|
||||
elseif event == "right" then
|
||||
if rightop ~= #menu_blocks then
|
||||
rightop = rightop + 1
|
||||
return true
|
||||
end
|
||||
end
|
||||
elseif index == midx.comp then
|
||||
if event == "select" then
|
||||
matches = {}
|
||||
for num, block in ipairs(menu_blocks) do
|
||||
matches[#matches + 1] = cheat.comp(block, optable[opsel], change)
|
||||
for num = 1, #menu_blocks[1] do
|
||||
if rightop == 0 then
|
||||
matches[#matches + 1] = cheat.compcur(menu_blocks[leftop][num], optable[opsel], value)
|
||||
else
|
||||
matches[#matches + 1] = cheat.comp(menu_blocks[leftop][num], menu_blocks[rightop][num],
|
||||
optable[opsel], value)
|
||||
end
|
||||
end
|
||||
return true
|
||||
end
|
||||
elseif index > 7 then
|
||||
elseif index == midx.match then
|
||||
if event == "left" then
|
||||
if matchsel ~= 1 then
|
||||
matchsel = matchsel - 1
|
||||
return true
|
||||
end
|
||||
elseif event == "right" then
|
||||
if matchsel ~= #matches then
|
||||
matchsel = matchsel + 1
|
||||
return true
|
||||
end
|
||||
end
|
||||
elseif index > midx.match then
|
||||
if event == "select" then
|
||||
-- write out a script?
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user