[Discussion] 60FPS patches for PSP games that run at 30FPS
|
03-17-2015, 10:20 AM
(This post was last modified: 03-17-2015 11:20 AM by LunaMoo.)
Post: #333
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Yup it's easy, with some experience you don't even have to search for it, just randomly stop the code execution a few times and if you recognize a function which can be used for frameskip, mess around with it and that's how I do it for most games. It works because in 30fps game only some functions repeat twice per frame like functions which do frameskip and the chance of random stopping into them is very high, but that's not a reliable method or anything to start from without having any experience.
So if a quick look doesn't lead me anywhere I just check some of the ways that games set 30 fps, most commonly it uses sceDisplayWaitVblankStartCB or sceKernelWakeupThread syscalls or similar so I set a breakpoint on those, check return address(RA button) after it breaks on it, then if it's under a branch I change it to always return false when it's using wakeup thread or true if it's the other one or modify the code in any other way that should result in always waking up or avoid waits which is that's how game does it's frameskip would result in 60fps. If it doesn't, I continue and check if the syscall is used elsewhere until I find it. Cheat engine can also be used if you totally have no experience with assembly or branch deciding to skip frame or not is not directly jumping into one of the commonly used syscalls. You do that by comparing memory, but that takes longer time and ultimately if you compare different places like fmv/menu/in-game it might lead to confusion like the 15fps cheat or absolutely nothing when it uses completely different code. Instead I would rather find a code which executes twice per frame meaning using disassembly again, and then compare memory when this code execution refreshes a frame and time it doesn't. That might seem harder since again disassembly scares some people or taking more time, but actually since nothing else usually changes during same frame, it would find the result very quickly maybe even give a single result after one search starting from unknown value and searching for changed value which is faster than doing xx scans between different savestates and more reliable at the same time. The result of such comparism could be a patch already, but IMO you should always check what function reads it and make an asm patch just to learn a bit more how games work and have an easier time and depend less on luck in the future, because really the key to have it easy is understanding, if you know how games work, this is very easy, if not then it's a timewaste. That pretty much sums all simple tricks I use to unlock 60fps quickly to see if the game works fine or requires more work at fixing stuff like speed, timers etc. which unfortunately most games do. Time for an example ~ I'll take a game which I didn't tried yet, The Warriors and try to patch it now doing few screenshots. So after running a game and opening disassembly(ctrl+D on windows) I click "Funcs" to find a list of named functions and see if there are any which I can try using, there's a sceDisplayWaitVblankStart which could be used for frameskip so let's start from setting a breakpoint on it. Then clicking RA button to return to function from where it was linked to. We can see there that there are few branches which should be checked, let's check the shortest that compares to zero and if it fails other ones. v1 register get's value 1 and 0 there when I set a breakpoint on that branch and as result skips every second frame, so since this branch actually goes back, let's just nop it. And check if it did anything: Yeah it did as simple as that, and who would have thought, it seems to also be one of those games which instantly work fine without messed up speed, so let's make a cw cheat from that: Code: _S ULUS-10213 And to explain all of this _S and _G lines aren't needed, but they help others find our cheats by google or whatever, so it's worth posting those:3 _L 0xE line isn't required either, I just add it to avoid repeating the write. As for the address you can see that in disassembly it's "08BB517C" while in CW cheat it's "03B517C"(we don't count first number in cw cheat since it's just a code type) that's because cw cheat 0 starts from 8800000 in psp, so we have to decrease the address from disassembly by 8800000 to get our cw cheat address. Disable code simply restores original code, I just copy it from disassembly after restarting game without cheat, or before even patching the address in the first place, it's always good to have althrough not required either. Anyway while potentially rare, there are still games which might be easily patched just like that and work without double speed. |
|||
« Next Oldest | Next Newest »
|