Quick example of lua cheat finder scripting.

If you are having problems finding or using cheats for an Emulator (particularly MAME/MESS) or have found a trick that you wish to share this is the place to do it. But please read the Cheat FAQ first.
Post Reply
crazyc
Posts: 28
Joined: Sat Apr 30, 2016 4:49 pm

Quick example of lua cheat finder scripting.

Post by crazyc » Sat May 07, 2016 5:02 am

Here's a quick script to illustrate scripting the lua cheat finder. It watches for the "Coin 1" press and shows all ram bytes that increase by one. Might help in finding the credit value. Use with autoboot_script like "mame.exe asteroid -plugin cheatfind -window -autoboot_script credit_find.lua". The cheat finder plugin must be enabled.

Code: Select all

local matches = {}
local maincpuram = {}
local current = {}
local coin
local last

local space_table = cf.getspaces()
for tag, list in pairs(space_table) do
	if tag == ":maincpu" and 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
			maincpuram = { tag = tag, space = list.program, ram = ram }
		end
	end
end
for num, region in ipairs(maincpuram.ram) do
	matches[num] = {}
	current[num] = cf.save(maincpuram.space, region.offset, region.size)
end
for tag, port in pairs(manager:machine():ioport().ports) do
	if port.fields["Coin 1"] then
		coin = { port = port, field = port.fields["Coin 1"] }
		last = coin.port:read()
		break
	end
end

local function check()
	if ((coin.port:read() & coin.field.mask) ~ coin.field.defvalue) ~= 0 then
		if coin.port:read() == last then
			return
		end
		for num, region in ipairs(maincpuram.ram) do
			local old = current[num]
			current[num] = cf.save(maincpuram.space, region.offset, region.size)
			if not next(matches[num]) then
				matches[num] = cf.comp(current[num], old, "gt", "B", 1, false)
			else
				matches[num] = cf.compnext(current[num], old, matches[num], "gt", "B", 1, false)
			end
			for num, match in ipairs(matches[num]) do
				print(string.format("%08x %02x %02x", match.addr, match.oldval, match.newval))
			end
		end
	end
	last = coin.port:read()
end

if coin then
	emu.register_frame(check)
else
	print("Coin 1 not found")
end

Post Reply