I few months a go I wanted to find a way to get the PC port of Jet Set Radio running at 60fps. I found it odd that the game would unlock it's frame rate at times during fade outs, so I wanted to see if there was a way to have the frame rate unlocked all the time.
I recently discovered that the Android port of Jet Set Radio contains three ARM binaries in the lib folder (libjetsetradio.so and libjetsetradio-nn.so are the more interesting of the bunch). The best part is that the Android port, much like the port of Sonic Advance, contains the original symbols for the data/functions in both binaries. Since I assume the code base for the PC/Android ports are both somewhat similar, I figured that I could use the symbols from the Android version to help find the equivalent subroutines in the PC port.
Currently I'm looking at a function called "njRendererSetFpsLock", which looks as follows (addressing might not be exactly the same for you since I had to decrypt my executable):
.text:01291B40 ; =============== S U B R O U T I N E ======================================= .text:01291B40 .text:01291B40 ; Attributes: bp-based frame .text:01291B40 .text:01291B40 njRendererSetFpsLock proc near ; CODE XREF: j_njRendererSetFpsLockj .text:01291B40 .text:01291B40 arg_0 = dword ptr 8 .text:01291B40 .text:01291B40 push ebp .text:01291B41 mov ebp, esp .text:01291B43 cmp [ebp+arg_0], 0 .text:01291B47 mov ecx, _ZN6CVideo8instanceE_ptr .text:01291B4D mov eax, [ecx] .text:01291B4F mov eax, [eax+98h] .text:01291B55 setnz dl .text:01291B58 movzx edx, dl .text:01291B5B push edx .text:01291B5C call eax .text:01291B5E pop ebp .text:01291B5F retn .text:01291B5F njRendererSetFpsLock endp .text:01291B5F .text:01291B5F ; ---------------------------------------------------------------------------
This function will either take a 0 or 1 as a parameter (1 for enable, 0 for disable I'm assuming). In the Android port, this function is called by a couple subroutines - exAdxlogo, deProgress, coProgress, exSequenceFirstCheckEnd, exSequenceDemoEnd, exSequenceDemoWait, exSequenceFirstCheckInit. These calls exist to some extent in the PC port, but I can only somewhat guess as to which function is which (for example, I know exAdxlogo is where the Heritage video is loaded/played by putting a breakpoint where the call is).
The only problem with this is that I can't seem to get anything to happen if I change the parameter around in the IDA Pro debugger when it's pushed onto the stack. So I don't know if this really is the function that modifies the frame limit. There are some other curious functions in the Android port that I might investigate later.
The reason for this post is that I'm wondering if anyone is interested in helping me get the game running at 60fps. If you want, you can download the interesting binaries from the Android port along with the decrypted exe from the PC port (along with Ida Pro 6.7 databases for each). If you can't open the databases, you can just drag the executables in your favorite disassembler instead.