How to Change Game Speed Independently of FPS (Example with Pokémon ORAS)
Hi everyone! Today I’m sharing a little discovery that will let you speed up your 3DS games.
I’ll use Pokémon Alpha Sapphire v1.4 as the demo.
After reverse engineering, here’s roughly the function that is called each frame:
The idea to speed up the game is simple: just call all the functions inside update() multiple times (with a loop).
To slow down, it’s the same idea: call the function only every X frames.
Here’s the code for Pokémon:
Simply replace X with the value you want:
If you have any questions, feel free to ask.
The logic is the same for all 3DS games.
I’ll use Pokémon Alpha Sapphire v1.4 as the demo.
After reverse engineering, here’s roughly the function that is called each frame:
C:
// mode = 0 => 60 FPS (16,666 µs)
// mode = 1 => 30 FPS (33,333 µs)
void runEachFrame() { // function is located at address: 0x0010E34C
// This is what seems to speed up the game when switching from 30 -> 60 FPS
// using Reshiban's codes
// https://gbatemp.net/threads/60-fps-patches-cheat-codes-releases-and-discussion.550527/
bool shouldUpdate = true;
if(mode) { // If 30 FPS, skip every other frame
count ^= true;
shouldUpdate = count;
}
if(shouldUpdate) {
// Update game state: weather, lighting, game events, etc.
update();
} else {
// ...
}
if(!mode || !shouldUpdate) {
// Helps avoid major lags
// If CPU and/or GPU are too slow, skip rendering the next frame
// Keep the previous framebuffer because the previous render is not finished
if(!skip) {
u64 start = GetSystemTick(); // svc 0x28
// Draw everything on screen, swap buffers, etc.
draw();
u64 delta = GetSystemTick() - start;
bool shouldSkip = false;
u32 limit = mode ? 33333 : 16666; // 33,333 µs => 30 FPS
// Measure GPU time, skip if overloaded (limit ~10,300 µs => 97 FPS)
if(isGpuOverloaded() && getGpuProcessingTime() > limit) {
shouldSkip = true;
}
// Check CPU time, skip if frame took too long (limit 16,666 µs => 60 FPS)
if(isCpuOverloaded() && delta > 16666) {
shouldSkip = true;
}
// Skip the next frame if overloaded
if(shouldSkip) {
skip = true;
}
} else {
skip = false;
}
}
}
The idea to speed up the game is simple: just call all the functions inside update() multiple times (with a loop).
To slow down, it’s the same idea: call the function only every X frames.
Here’s the code for Pokémon:
Code:
[60 FPS + GAME SPEED]
0010E36C E3A06001 // mov r6, #1
0010E370 E3A0C00X // mov r12, #X
0010E374 E58FC010 // str r12, [pc, #0x10]
0010E378 E59FC00C // ldr r12, [pc, #0xC]
0010E37C E25CC001 // subs r12, r12, #1
0010E380 0A000075 // beq 0x0010E55C : update the view (draw()) and exit function
0010E384 E58FC000 // str r12, [pc, #0]
0010E388 EA00000E // b 0x0010E3C8 : update the model (update())
0010E38C FFFFFFFF // counter: .word 0xFFFFFFFF
0010E528 EAFFFF92 // b 0x0010E378 : loop again
Simply replace X with the value you want:
- X=2 gives normal speed,
- X=3 gives double speed, etc.
If you have any questions, feel free to ask.
The logic is the same for all 3DS games.







