Post Reply 
Thread Rating:
  • 7 Votes - 5 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Discussion] 60FPS patches for PSP games that run at 30FPS
03-17-2015, 02:28 PM
Post: #335
RE: 60FPS patches for PSP games that run at 30FPS
Wall of text incomingTongue...
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. - Custom PPSSPP Shaders! - simple CE scripts to help creating CWCheats, - CWCheat workarounds.
Find all posts by this user
Quote this message in a reply
Post Reply 

Messages In This Thread
RE: 60FPS patches for PSP games that run at 30FPS - LunaMoo - 03-17-2015 02:28 PM

Forum Jump: