Well after endless bitching moaning and complaining to the devers I I took up the challenge myself to start writing a cheat finder. It turned out to be easier then expected. Currently it only works on non mapped roms (if you are lucky it will work on mapped roms aswell)
Anyway the code
########################################################### # openMSX TCL cheat finder version 0.2 # # (c) copyright 2005 Patrick van Arkel all rights reserved # # Credits # - Maarten ter Huurne for giving me hints and tips # - Wouter for giving me an initial script # (I took a different approach though :) # # Currently supported # - searchval [value] search with value # init with memcomp [value] # # - comparision search # Init with compcheat # * bigger # * smaller # * equal # * notequal # ########################################################### # set an array outside the procedures # this will be used inside the procedures set memcomp(0) 0 # to init the whole process make a snapshot and look for a value # if a value is not found at that address the value will be set to 999 # the number of 999 has been chosen because an 8-bit value can be 255 max proc cheatstart { cheatval } { global memcomp for { set i 0 } { $i <= 65535 } { incr i } { set memcomp($i) [debug read memory $i] if {$memcomp($i) == $cheatval} {puts "addr $i : has value $memcomp($i)"} if {$memcomp($i) != $cheatval} {set memcomp($i) 999} } return True } # the 2nd step of the search fucntion. This will use the inital snapshot # to look for values. If a value isn't found the value is again set to 999 # repeat this function until a value is found. proc searchval { cheatval } { global memcomp set temp memcomp for { set i 0 } { $i <= 65535 } { incr i } { if {$memcomp($i) != 999 } { if {[debug read memory $i] == $cheatval} {puts "addr $i : has value [debug read memory $i]"} if {[debug read memory $i] != $cheatval} {set memcomp($i) 999} } } } # to use the cheat use this in the console # debug write memory [address] [value] # # the address can be inputed hexdecimal like # debug write memory 0x0256 0x99 # # or decimal like # debug write memory 21056 99 # # or a combination of the above # ----------------------------------------------- # Compare search bigger / smaller / equal # ----------------------------------------------- # comparision init (snapshot) proc compcheat {} { global memcomp for { set i 0 } { $i <= 65535 } { incr i } { set memcomp($i) [debug read memory $i] } return True } #search bigger proc bigger {} { global memcomp for { set i 0 } { $i <= 65535 } { incr i } { if {$memcomp($i) != 999 } { if {[debug read memory $i] > $memcomp($i)} { puts "addr $i : has value [debug read memory $i] was $memcomp($i)" set memcomp($i) [debug read memory $i] } else { set memcomp($i) 999 } } } } # search smaller proc smaller {} { global memcomp for { set i 0 } { $i <= 65535 } { incr i } { if {$memcomp($i) != 999 } { if {[debug read memory $i] < $memcomp($i)} { puts "addr $i : has value [debug read memory $i] was $memcomp($i)" set memcomp($i) [debug read memory $i] } else { set memcomp($i) 999 } } } } # search equal proc equal {} { global memcomp for { set i 0 } { $i <= 65535 } { incr i } { if {$memcomp($i) != 999 } { if {[debug read memory $i] == $memcomp($i)} { puts "addr $i : has value [debug read memory $i] was $memcomp($i)" set memcomp($i) [debug read memory $i] } else { set memcomp($i) 999 } } } } # search NOT equal proc notequal {} { global memcomp for { set i 0 } { $i <= 65535 } { incr i } { if {$memcomp($i) != 999 } { if {[debug read memory $i] != $memcomp($i)} { puts "addr $i : has value [debug read memory $i] was $memcomp($i)" set memcomp($i) [debug read memory $i] } else { set memcomp($i) 999 } } } }
I will write a few scripts more for comparsion lookup (this is for values that are hard to guess like life bars and such)
The best part maybe (for the blueMSX team that is) is that it is compatible with that emulator So Gaze has some help with finding cheats
A few cheats:
Thexder 1 pos 62164 value 255 (255% life) pos 62166 value 255 (255% max energy) Golvelius 1 pos 57417 value 255 (gold 2550) pos 57405 value 255 (life bar has 255 hits) Galaga pos 57358 value 99 (99 life) Zanac 1 pos 57610 value 255 (254 life +1 on the screen itself) Metal gear 1 pos 50485 value 0x99 (99 rations) pos 50433 value 0xff (a lot of handgun ammo) bubble bobble pos 56054 value 255 (255 x life) pos 63363 value stage (which stage to warp to next decr stage with 1 for the right stage) Usas pos 49753 value 255 (a load of money) Aleste pos 49168 value 98 (99 x life) Ashguine 2 pos 49174 value 255 (255 life containers) pos 49186 value 99 (99 keys) Familice Parodic pos 57347 value 0x99 (98x life) Mon Mon Monster pos 57400 value 99 (99 life containers) pos 57388 value 0x99 (99 rocks) Maze Of Galious pos 0xE051 value 1 (max exp Aphrodite thanks BiFi) pos 0xE055 value 1 (max exp Popolon thanks BiFi) pos 57414 value 255 (arrows) pos 57416 value 255 (coins) pos 57418 value 255 (keys) pos 57430 value 255 (max vit Popolon) pos 57426 value 255 (max vit Aphrodite ) Vampire killer pos 50197 value 32 (Simon has a full powerbar) Super Laydock Mission Striker Pos 58099 value 255 (255 life containers) Girly block pos 57392 value 255 (power bar full)
Anyway here are a few screenshots which I just made
It needs some fine tuning and stuff, but the main stuff already works ;)
Login or register to post comments