[Discussion] 60FPS patches for PSP games that run at 30FPS
|
03-17-2015, 06:01 AM
Post: #331
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
(03-17-2015 02:10 AM)LunaMoo Wrote: It is wrong, because 15 fps is an accidental result of treating in-game by code which should apply for fmv's only. So where do we start researching it? I would give it a try if i knew where to start. And maybe you could show us how you hacked Diva and those other games with frame limiting (please?) ? |
|||
03-17-2015, 07:29 AM
(This post was last modified: 03-17-2015 07:39 AM by cybercjt.)
Post: #332
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
(03-17-2015 06:01 AM)GamerzHell9137 Wrote:(03-17-2015 02:10 AM)LunaMoo Wrote: It is wrong, because 15 fps is an accidental result of treating in-game by code which should apply for fmv's only. Yea I'm a bit interested too, it seems like it's a bit easy for you to use the Disassembler to look for some codes... and if it's really that easy I might give it a try on other games. Chill and Go with the flow ~d[o_o]b~ @YT - youtube.com/user/SuperHack333/videos Specs: MDL: Dell G7 15 7590 (Laptop) OPS: Windows 10 Pro 64-bit CPU: Intel Core i7-9750h @ 2.60 Ghz ~ 4.50 Ghz GPU: Nvidia GTX 1660 Ti 6GB GDDR6 @ 1455 Mhz ~ 1590 Mhz RAM: Micron Tech. 8GB DDR4 @ 2666 Mhz (4x2) |
|||
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. |
|||
03-17-2015, 12:01 PM
(This post was last modified: 03-17-2015 12:56 PM by GamerzHell9137.)
Post: #334
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
I'm still confused....
1. CRTL+D ... Check Press funcs button .... Check Find sceDisplayWaitVblankStart ....... Check Click on it for a exclamation mark to appear ..... Check 2. Press RA button.... Check 3. Now, what's a branch? is that the blue line on the side that goes from the start to the end or all the things that are in the yellow field? There are some in other colors so that's why i'm asking. And that's all i get from the things you said lol. You said something about breakpoints, there is some button called breakpoint but dunno if i press it or not. I just get some things that's i'm not sure what to do with. EDIT: And how did you set that true in the 3rd pic? |
|||
03-17-2015, 02:28 PM
Post: #335
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Wall of text incoming...
I suck at explaining and skipped some more obvious details about ppsspp disassembly and mips to avoid even bigger walls of text, anyway when you double click on an opcode to make it red with an exclamation mark then you already set an execute breakpoint, you can remove breakpoint by clicking it again or pressing delete when it's highlited on breakpoint list at the bottom or just deactivate it by clicking the checked square there:3. Branches are just opcodes which allow you to do different things depending on their conditions are met or not. Basically all opcodes like beq, bne, bnel, bgez, bc1fl etc. and yeah in ppsspp disassembly they show an arrow on the side pointing the place where they'll branch when conditions are met. When the conditions are not met, it'll just continue to execute another line or line after it in case of "likely" branches. "b" is also a branch but it's basically beq zero,zero which is always true, so it's used as a short distance jump. I didn't set a branch on my screenshot to true, when you set a breakpoint on a branch or execute line by line and stop at branch it shows if conditions are met(true) or not(false), value of v0 as seen on the screenshot was 0x1 and bne means "branch if not equal" and so it's "true" since 1 is not 0 which this branch was comparing. Since that branch was running twice per frame and v0 was 1 only every second time, it was actually alternating between true and false skipping a frame whenever set to true. On your screenshot bnel v0,zero,0x08908D88 looks like it just checks if an address does exist or not in v0 register, so I think only iteresting branch there to check is bc1fl 0x08908cfc which compares f0 to f20(it does it at c.nge f0,f20) and returns somewhere above likely repeating all that code again. You could just right click on that branch choose assemble opcode and type in "nop" which will replace it with no opcode so basically remove it effectively making it work as it was always returning false;p. But it would probably be better to check first what values are stored in f0 and f20 when it compares them and see if it always returns true/false or alternate between the two. If it doesn't alternate it might not be frameskip, but if a game runs at different fps in different places this might as well check what is current mode and then apply skip or not in which case it would be nice checking. Or just do it the risky(stupid ~ but well - fast) way and just "nop" the "jal zz_sceDisplayWaitVblankStartCB" hoping that it unlock 60fps. Worst that can happen is game will freeze or crash, not a big deal with savestates and if it doesn't do anything there are probably other places where this syscall is called or it doesn't use it at all to skip frames;3. You should probably read some stuff about mips or at least check what opcodes do for example from this pdf or just google for something more specific. You don't need to memorize every opcode or anything like that, but it will help if you recognize what more common ones are doing so you can get the idea what's happening by just looking at it which is always nice. Also get used to ppsspp disassembly, it's small(and sometimes not soo stable;c), but powerfull tool. After finding your function from the list, you should click again on "regs" because values of registers is something interesting to stare at most of the time when you use breakpoints or stepping through some code. Registers also divide on GPR/FPU and VFPU, which can be accessed at regs list althrough VFPU actually have a completely separate window activated from vfpu button anyway since there are more of them. Some other thing, pressing "TAB"(on keyboard) when the main disassembly window that shows everything is active will switch the view from showing opcodes as hex and showing function names which can be usefull when searching things with ctrl+f/s or simply by prefference you choose one over the other. There are also memory breakpoints which you can set by right clicking in breakpoint list which are usefull when you find some variables by cheat engine and want to find what code is accessing it. http://forums.ppsspp.org/showthread.php?tid=6594 - Custom PPSSPP Shaders! http://forums.ppsspp.org/showthread.php?tid=3590&pid=117172#pid117172 - simple CE scripts to help creating CWCheats, https://github.com/LunaMoo/PPSSPP_workarounds - CWCheat workarounds. |
|||
03-17-2015, 03:28 PM
(This post was last modified: 03-17-2015 03:29 PM by GamerzHell9137.)
Post: #336
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
You got some mad brain skills LunaMoo. (Mean in a positive way lol)
So i did what you said and nop'ed 0x08908cfc and it actually changed the FPS to 60 but the game is double speed. Sound is same speed thou. Now about this part " But it would probably be better to check first what values are stored in f0 and f20 when it compares them and see if it always returns true/false or alternate between the two " Uhhh F's? Where are the F's? Can't see any F's here lol |
|||
03-17-2015, 04:23 PM
Post: #337
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Click "regs" to open register list, and then at the top of that list click FPU(it doesn't look like button, but it kind of is) there if you set a breakpoint where it compares the two you should see values on the list.
Also since as you say it's double speed, you would be really lucky if you find a place where you can see on the fpu register list one that has a value of 2.0 since some games simply double the speed by multiplying by 2 after skipping frames, could be using different value or do it completely differently, multiplying by 2.0 is just kind of common from my experience. But that's nothing sure and can be anywhere so I don't have any advice for that. It's as I said;p, unlocking 60 fps itself is usually very easy, but when game needs more to work properly that's where it has potential to get problematic and time consuming:|. http://forums.ppsspp.org/showthread.php?tid=6594 - Custom PPSSPP Shaders! http://forums.ppsspp.org/showthread.php?tid=3590&pid=117172#pid117172 - simple CE scripts to help creating CWCheats, https://github.com/LunaMoo/PPSSPP_workarounds - CWCheat workarounds. |
|||
03-17-2015, 06:13 PM
Post: #338
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
I see, well i can't really do anything if i don't know how it works. Thanks for trying to explain thou, i appreciate it
|
|||
03-18-2015, 02:17 AM
Post: #339
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Sad story:
After a while of not coming to this thread, I decided to visit it. And awesomesauce, so many new codes! Had to try some of them and they worked like a charm. Thanks to everyone's hard work. I later saw Luna's tutorial so I decided to have a go at it with the PSP SAO game. Some tiring hours later of NOPing stuff that resulted in Double Speed, variable frame cap and gameplay-speed being reduced to 90% for some reason, I found the correct adress. The game was running at 60fps and everything was working fine. But I ddidn't know how to make a CWCheat Cheat...so Genius Me decided to restart the emulation and the game went back to 30fps. >_<. And worst part is that apparently I broke something, as the the emulator's Disassembly is now showing all the NOPs I put. Which is weird because they used to go back to their original er...value? After closing and restarting the emulator. But not anymore. Those few minutes with 60fps were glorious though. |
|||
03-18-2015, 04:15 AM
(This post was last modified: 03-18-2015 06:55 AM by LunaMoo.)
Post: #340
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
@Goshorai not soo sad, since I have SAO as well:
Code: _S NPJH-50701 Edit: Added an optional code to kill the framelimit when too many characters are on the screen. the downside is it requires increased psp cpu clock to actually keep the 60fps and messes up with a bit more code, not tested much since it's hard to see amount of npc's that triggered it anyway. http://forums.ppsspp.org/showthread.php?tid=6594 - Custom PPSSPP Shaders! http://forums.ppsspp.org/showthread.php?tid=3590&pid=117172#pid117172 - simple CE scripts to help creating CWCheats, https://github.com/LunaMoo/PPSSPP_workarounds - CWCheat workarounds. |
|||
03-18-2015, 08:37 AM
Post: #341
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Ohh hey, i've done it. How do i make a cwcheat of it now?
|
|||
03-18-2015, 08:53 AM
Post: #342
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Another one, half of it is pretty much same as from the first post, but I fixed it for 60 fps:
Code: _S NPJH-50588 ---------------------- @GamerzHell9137 copy address of each line you need to change and changed instructions then you can follow this template: _C0 name of the cheat _L 0x2aaaaaaa 0xbbbbbbbb with as many _L lines as you need where: aaaaaaa = address_from_disassembly - 8800000(you can use standard windows calculator in programmer mode after setting "hex" if you can't do it in memory. bbbbbbbb = value you want to write, for nop that would be 00000000 That's pretty much all you need for asm cheats, I also add 0xE type code to stop them from refreshing, but it's really not important with short cheats. You can see different code types for example in here under cw cheat. http://forums.ppsspp.org/showthread.php?tid=6594 - Custom PPSSPP Shaders! http://forums.ppsspp.org/showthread.php?tid=3590&pid=117172#pid117172 - simple CE scripts to help creating CWCheats, https://github.com/LunaMoo/PPSSPP_workarounds - CWCheat workarounds. |
|||
03-18-2015, 09:36 AM
(This post was last modified: 03-19-2015 02:17 PM by GamerzHell9137.)
Post: #343
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
Was a bad call, the animations are double but the game and sound plays the same speed and the gameplay plays in 60FPS.
Code: _S ULUS-10207 I'll play more around the game and see if i can do anything. Must watch video in 720p cause only 720p+ videos support 60FPS EDIT: About FPU, on the other game i checked it but it had numbers like 30.00000 and 59.XXX (can't remember the numbers). I think that i'm searching the wrong place maybe? |
|||
03-18-2015, 09:38 AM
Post: #344
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
(03-18-2015 08:53 AM)LunaMoo Wrote: Another one, half of it is pretty much same as from the first post, but I fixed it for 60 fps: U Know which games i have without i telling u and making 60 fps patches for it Arigato Luna-Chan http://img4.fotos-hochladen.net/uploads/dhsignaturehcv9txkqdu.png |
|||
03-18-2015, 10:26 AM
(This post was last modified: 03-18-2015 11:27 AM by LunaMoo.)
Post: #345
|
|||
|
|||
RE: 60FPS patches for PSP games that run at 30FPS
I was one to say such patches are not to be mass produced, heh ~ another one:
Code: _S ULUS-10528 Edit: and another... ;3 Code: _S NPJH-50686 http://forums.ppsspp.org/showthread.php?tid=6594 - Custom PPSSPP Shaders! http://forums.ppsspp.org/showthread.php?tid=3590&pid=117172#pid117172 - simple CE scripts to help creating CWCheats, https://github.com/LunaMoo/PPSSPP_workarounds - CWCheat workarounds. |
|||
« Next Oldest | Next Newest »
|