mirror of
https://github.com/Ultra-NX/UltraNX.git
synced 2025-09-10 10:41:31 +00:00
Upd2
This commit is contained in:
parent
90908e1cf4
commit
6d87b67c86
@ -58,7 +58,3 @@ X0100423009358000
|
||||
;Splatoon 3
|
||||
;10.0.0 upwards crashes after online match
|
||||
X0100C2500FC20000
|
||||
|
||||
;Hollow Knight: Silksong
|
||||
;1.0.28324 crash on boot
|
||||
X010013C00E930000
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Jujutsu Kaisen Cursed Clash US 1.4.0
|
||||
# BID: 7C724F497564C027
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
@ -26,8 +24,10 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x849B7A8, 0x9C4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -1,42 +1,24 @@
|
||||
# Batman - The Telltale Series 1.0.4
|
||||
# BID: A3A998AF3252D110
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6440
|
||||
instructions: [
|
||||
[mov, w2, 3],
|
||||
[madd, x1, x8, x2, x9]
|
||||
]
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0xC5A6D8
|
||||
value_type: uint32
|
||||
value: 0x188CC50
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x1758A90
|
||||
value_type: uint32
|
||||
value: 0x188CC50
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xC56550
|
||||
type: code
|
||||
name: tripleBuffer
|
||||
instructions: [
|
||||
[stp, x29, x30, [sp, -16], "!"],
|
||||
[mov, x29, sp],
|
||||
[ldr, x0, [x26, 0x10]],
|
||||
[cbz, x0, +24],
|
||||
[cbz, x0, :goto1],
|
||||
[adrp, x8, 0x1758000],
|
||||
[ldr, x8, [x8, 0x90]],
|
||||
[ldr, x8, [x8]],
|
||||
[blr, x8],
|
||||
[b, +16],
|
||||
[mov, w0, 0xc0],
|
||||
[b, :goto2],
|
||||
:goto1, [mov, w0, 0xc0],
|
||||
[bl, 0x735480],
|
||||
[str, x0, [x26, 0x10]],
|
||||
[ldr, x22, [x27]],
|
||||
:goto2, [ldr, x22, [x27]],
|
||||
[adrp, x27, 0x1757000],
|
||||
[ldr, x21, [x25]],
|
||||
[ldr, x27, [x27, 0xf38]],
|
||||
@ -62,13 +44,34 @@ MASTER_WRITE:
|
||||
[mov, x1, x23],
|
||||
[blr, x8],
|
||||
[adrp, x22, 0x1758000],
|
||||
[b, 0x5eec]
|
||||
[ldp, x29, x30, [sp], 16],
|
||||
[ret]
|
||||
]
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6440
|
||||
instructions: [
|
||||
[mov, w2, 3],
|
||||
[madd, x1, x8, x2, x9]
|
||||
]
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0xC5A6D8
|
||||
value_type: uint32
|
||||
value: 0x188CC50
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x1758A90
|
||||
value_type: uint32
|
||||
value: 0x188CC50
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x5EE8
|
||||
instructions: [
|
||||
[b, 0xc56550]
|
||||
[bl, _tripleBuffer()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
@ -82,10 +85,4 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, x2, 0x1950000]
|
||||
]
|
||||
ALL_FPS:
|
||||
# dummy
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x188CF00]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
||||
|
@ -1,8 +1,13 @@
|
||||
# Tiebreak+: Official Game of the ATP and WTA 1.3.0
|
||||
# BID: 88CC45A195E0BDA8
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.03333333333
|
||||
evaluate: "0.8 / FPS_TARGET" # we are using this trick because function is overengineered and it's not easy to just use standard 1 / FPS_TARGET
|
||||
MASTER_WRITE:
|
||||
# Triple buffer
|
||||
# REF: 00 40 00 00 00 04 00 00 00 88 00 00 02 00 00 00
|
||||
@ -17,20 +22,7 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x147BE04
|
||||
instructions: [
|
||||
[adrp, x8, 0x30c3000],
|
||||
[ldr, s3, [x8, 0xf00]],
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, s3, [x8, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
## Default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x30C3F00
|
||||
value_type: float
|
||||
value: 0.03333333333
|
||||
ALL_FPS:
|
||||
# Adjust Dynamic Resolution target, we are using this trick because function is overengineered and it's not easy to just use standard 1 / FPS_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x30C3F00]
|
||||
value_type: float
|
||||
value: "0.8 / FPS_TARGET"
|
||||
|
@ -0,0 +1,25 @@
|
||||
# SWORD ART ONLINE Fractured Daydream JAP 1.4.1.1
|
||||
# BID: 33614E4F6B3267B3
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x90A0758, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 1)", "TruncDec(FRAMETIME_TARGET, 1)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x90DB2B0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x88DAF88, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
@ -1,8 +1,6 @@
|
||||
# SWORD ART ONLINE Fractured Daydream JAP 1.3.0
|
||||
# BID: C2F2C4B700B30598
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
@ -24,4 +22,4 @@ ALL_FPS:
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
what: timing
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Breathedge 1.0.2
|
||||
# BID: B26DE1669B729335
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x55CB668, 0x7F0]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
# t.MaxFPS
|
||||
|
@ -0,0 +1,25 @@
|
||||
# Tony Hawk's Pro Skater 3 + 4 1.06
|
||||
# BID: 505069EBC0B82A6F
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x77EC4B8, 0]
|
||||
value_type: float
|
||||
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x781A6A0, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7014598, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
@ -1,12 +1,11 @@
|
||||
# DreadOut Remastered Collection 1.0.2
|
||||
# BID: 725731C74E4CA6A9
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# REF: DynamicResolution::.cctor
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3E01640, 0, 0xB8, 8]
|
||||
address_unsafe: true
|
||||
value_type: double
|
||||
value: [FPS_TARGET, FRAMETIME_TARGET]
|
@ -1,12 +1,11 @@
|
||||
# The Forest Quartet 4.0.2
|
||||
# BID: 47A022F858BA09B1
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# DynamicResolution_TypeInfo
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x4B320A0, 0xB8, 0]
|
||||
address_unsafe: true
|
||||
value_type: double
|
||||
value: ["0.96 * FRAMETIME_TARGET", "(0.96 * FRAMETIME_TARGET) - 0.75"]
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Remnant: From The Ashes 1.0.1
|
||||
# BID: 49CF6B0B0A62F9E2
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.MaxGPUTime ((1000/FPS) * 0.93)
|
||||
-
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Bakery Simulator 1.1.0
|
||||
# BID: 31A37D73E22F1059
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to untie game speed from framerate and unlock FPS
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x5F9B6A8, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Fate/EXTELLA LINK 1.0.2
|
||||
# BID: 97FC79E063E26C9B
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
-
|
||||
@ -11,11 +9,3 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, x8, 0x300000003]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x4740500]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# GOD EATER 3 2.5.1
|
||||
# BID: C0F144F5139F542E
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
-
|
||||
@ -11,10 +9,3 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, x8, 0x300000003]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xA7FA900]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Goat Simulator 3 1.0.7.3
|
||||
# BID: 26AB1CB54DD4508D
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Goat Simulator 3 1.0.7.6
|
||||
# BID: 8D4FD57DB7D63120
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Goat Simulator 3 1.0.7.4
|
||||
# BID: A5DA93E6537350D8
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Goat Simulator 3 1.0.7.5
|
||||
# BID: C606C7DC1C0EC88F
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
|
@ -1,8 +1,43 @@
|
||||
# Sherlock Holmes: The Devil's Daughter 1.0.0
|
||||
# BID: 2B37ED2A971948F3
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 38
|
||||
evaluate: "1.14 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 22
|
||||
evaluate: "0.66 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target3
|
||||
value_type: float
|
||||
default_value: 43.5
|
||||
evaluate: "1.305 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target4
|
||||
value_type: float
|
||||
default_value: 58
|
||||
evaluate: "1.74 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target5
|
||||
value_type: float
|
||||
default_value: 47
|
||||
evaluate: "1.41 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target6
|
||||
value_type: float
|
||||
default_value: 34
|
||||
evaluate: "1.02 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect Dynamic Resolution timings to MAIN + 0x3189F00
|
||||
# 38.0
|
||||
@ -10,47 +45,43 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0xFFEAFC
|
||||
instructions: [
|
||||
[adrp, x10, 0x3189000],
|
||||
[ldr, s1, [x10, 0xf00]]
|
||||
[adrp, x10, $dr_target1],
|
||||
[ldr, s1, [x10, $dr_target1]]
|
||||
]
|
||||
# 22.0
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xFFEB0C
|
||||
instructions: [
|
||||
[ldr, s1, [x10, 0xf04]]
|
||||
[ldr, s1, [x10, $dr_target2]]
|
||||
]
|
||||
# 43.5
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xFFEAD4
|
||||
instructions: [
|
||||
[adrp, x10, 0x3189000],
|
||||
[ldr, s1, [x10, 0xf08]]
|
||||
[adrp, x10, $dr_target3],
|
||||
[ldr, s1, [x10, $dr_target3]]
|
||||
]
|
||||
# 58.0
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xFFEAE4
|
||||
instructions: [
|
||||
[adrp, x10, 0x3189000],
|
||||
[ldr, s1, [x10, 0xf0c]]
|
||||
[adrp, x10, $dr_target4],
|
||||
[ldr, s1, [x10, $dr_target4]]
|
||||
]
|
||||
# 47.0 | 34.0
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xFFEB20
|
||||
instructions: [
|
||||
[adrp, x11, 0x3189000],
|
||||
[ldr, s1, [x11, 0xf10]],
|
||||
[ldr, w12, [x11, 0xf14]]
|
||||
[adrp, x11, $dr_target5],
|
||||
[ldr, s1, [x11, $dr_target5]],
|
||||
[adrp, x11, $dr_target6],
|
||||
[fcmp, s0, s1],
|
||||
[ldr, s1, [x11, $dr_target6]]
|
||||
]
|
||||
# Default values:
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x3189F00
|
||||
value_type: float
|
||||
value: [38.0, 22.0, 43.5, 58.0, 47.0, 34.0]
|
||||
ALL_FPS:
|
||||
# UGameEngine::GetMaxTickRate()
|
||||
# Bool Lock FPS
|
||||
@ -59,10 +90,3 @@ ALL_FPS:
|
||||
address: [MAIN, 0x30D1B7C]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# Dynamic Resolution
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3189F00]
|
||||
value_type: float
|
||||
value: ["(38.0 / (1000/30)) * FRAMETIME_TARGET", "(22.0 / (1000/30)) * FRAMETIME_TARGET", "(43.5 / (1000/30)) * FRAMETIME_TARGET", "(58.0 / (1000/30)) * FRAMETIME_TARGET", "(47.0 / (1000/30)) * FRAMETIME_TARGET", "(34.0 / (1000/30)) * FRAMETIME_TARGET"]
|
||||
|
||||
|
@ -2,8 +2,6 @@
|
||||
# BID: 7A450848CFDEC18E
|
||||
# Some prerendered cutscenes are still pushed at 30 FPS
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Block updating DR timings, REF: 00 01 27 1E 48 40 A8 52
|
||||
-
|
||||
@ -40,10 +38,10 @@ ALL_FPS:
|
||||
value: FPS_LOCK_TARGET
|
||||
# Renderer thread delay
|
||||
-
|
||||
type: write
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5704028]
|
||||
value_type: float
|
||||
value: 0.01
|
||||
value: "0.66 / FPS_TARGET"
|
||||
# DR timings
|
||||
-
|
||||
type: evaluate_write
|
||||
@ -53,4 +51,3 @@ ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -0,0 +1,25 @@
|
||||
# DRAGON QUEST TREASURES 1.0.1
|
||||
# BID: 2F81A2EC9B298B37
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to untie game speed from framerate and unlock FPS
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7E110D8, 0x7C0]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
# bAllowMultiThreadedAnimationUpdate |= 4
|
||||
# bOptimizeAnimBlueprintMemberVariableAccess |= 2
|
||||
# bCanBlueprintsTickByDefault |= 1
|
||||
value: 7
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7E119A8, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
@ -1,8 +1,6 @@
|
||||
# Gal*Gun 2 1.0.4
|
||||
# BID: 9CDFB0CD24CAE030
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.VSync
|
||||
-
|
||||
@ -20,6 +18,7 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x44E6030, 0x764]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: 0
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# GUNDAM BREAKER 4 1.9.0
|
||||
# BID: 0CC82881FF112C6D
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# GUNDAM BREAKER 4 1.5.0
|
||||
# BID: F898CCE9C3A291AF
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
|
@ -3,28 +3,20 @@
|
||||
# Game is using double buffer, buffers are not allocated in loop.
|
||||
# So it's not possible to get stable FPS lock between 30 and 60 without changing refresh rate.
|
||||
|
||||
unsafeCheck: true
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_scale
|
||||
value_type: double
|
||||
default_value: 1000000
|
||||
evaluate: "30000000 / FPS_TARGET"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Change location of GPU frametime double divider to MAIN+0x32C6D00
|
||||
# Change location of GPU frametime double divider
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x921768
|
||||
instructions: [
|
||||
[adrp, x8, 0x32c6000],
|
||||
[ldr, d1, [x8, 0xd00]]
|
||||
[adrp, x8, $dr_scale],
|
||||
[ldr, d1, [x8, $dr_scale]]
|
||||
]
|
||||
# Default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x32C6D00
|
||||
value_type: double
|
||||
value: 1000000
|
||||
ALL_FPS:
|
||||
# GPU Frametime divider = (30/FPS) * 1000000
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x32C6D00]
|
||||
value_type: double
|
||||
value: "(30 / FPS_TARGET) * 1000000"
|
||||
|
||||
|
@ -2,8 +2,6 @@
|
||||
# BID: 799D1061182C1302
|
||||
# Thanks to theboy181 for finding instruction responsible for calculating frame time which I used to find where is FPS target stored
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove FPS Lock
|
||||
-
|
||||
@ -23,11 +21,13 @@ ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xED96A8, 0x30]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: "19200000 / FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xED96A8, 0x28]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: "1920000 / FPS_TARGET"
|
||||
# FPS 2D Game Speed Target
|
||||
@ -42,4 +42,3 @@ ALL_FPS:
|
||||
address: [MAIN, 0xEFFC60, 0x50]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
|
||||
|
@ -2,13 +2,12 @@
|
||||
# BID: 3A3C781930CB8201
|
||||
# WARNING: Enemy Movement Speed is not scaling properly to framerate. At 60 FPS it's multiple times slower, looking like enemies are practically walking in place.
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to untie game speed from framerate and unlock FPS
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x5F32908, 0x7B8]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
@ -31,3 +30,4 @@ ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -2,27 +2,19 @@
|
||||
# BID: 471546458FD9E43D
|
||||
# REF: 01 04 0C 5E 00 10 2E 1E
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target to MAIN+0x36D4F00
|
||||
# Redirect DR frametime target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17358B4
|
||||
instructions: [
|
||||
[adrp, x13, 0x36d4000],
|
||||
[ldr, s2, [x13, 0xf00]]
|
||||
[adrp, x13, $dr_target],
|
||||
[ldr, s2, [x13, $dr_target]]
|
||||
]
|
||||
# default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x36D4F00
|
||||
value_type: float
|
||||
value: 33.3333333333
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x36D4F00]
|
||||
value_type: float
|
||||
|
||||
value: FRAMETIME_TARGET
|
||||
|
@ -0,0 +1,20 @@
|
||||
# Expeditions: A Mudrunner Game 1.18.0.0
|
||||
# BID: 9ACB108D8DC59245
|
||||
# REF: 01 04 0C 5E 00 10 2E 1E
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1737634
|
||||
instructions: [
|
||||
[adrp, x13, $dr_target],
|
||||
[ldr, s2, [x13, $dr_target]]
|
||||
]
|
@ -1,8 +1,6 @@
|
||||
# Jujutsu Kaisen Cursed Clash JP 1.4.0
|
||||
# BID: 7C724F497564C027
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget
|
||||
-
|
||||
@ -26,8 +24,10 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x849B7A8, 0x9C4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Demon Slayer -Kimetsu no Yaiba- The Hinokami Chronicles 1.53
|
||||
# BID: 14C878ECCA9D7CB5
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xB314540, 0x7F8]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,15 +1,13 @@
|
||||
# Hammerwatch Anniversary Edition 1.0.3
|
||||
# BID: D147CAEF2BC74574
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Rewrite "v_fps_limit 30" to 62
|
||||
# Rewrite "v_fps_limit 30" to 99
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0xE028B5
|
||||
value_type: uint16
|
||||
value: 0x3236
|
||||
value: 0x3939
|
||||
# Change egl Interval to lock game by default to 30 FPS
|
||||
-
|
||||
type: asm_a64
|
||||
@ -23,11 +21,3 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, w1, 2]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x15ABF3C0]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
||||
|
@ -1,15 +1,13 @@
|
||||
# Hammerwatch 2 1.0.4
|
||||
# BID: 38896FEC1B4ADB1C
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Rewrite "v_fps_limit 30" to 62
|
||||
# Rewrite "v_fps_limit 30" to 99
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x7C7597
|
||||
value_type: uint16
|
||||
value: 0x3236
|
||||
value: 0x3939
|
||||
# Change egl Interval to lock game by default to 30 FPS
|
||||
-
|
||||
type: asm_a64
|
||||
@ -23,11 +21,3 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, w1, 2]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x161BCF8]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Dusk Diver 2 1.0.1
|
||||
# BID: 217C9ECF258C0312
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to untie game speed from framerate and unlock FPS
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x77C7098, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
@ -30,3 +29,4 @@ ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -1,50 +1,48 @@
|
||||
# Eiyuden Chronicle: Rising 1.02
|
||||
# BID: 39DC785D9073C22B
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: double
|
||||
default_value: 31
|
||||
evaluate: "0.93 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: double
|
||||
default_value: 29
|
||||
evaluate: "0.87 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: code
|
||||
name: drMaxTarget
|
||||
instructions: [
|
||||
[adrp, x19, $dr_target1],
|
||||
[ldr, d1, [x19, $dr_target1]],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: drMinTarget
|
||||
instructions: [
|
||||
[adrp, x8, $dr_target2],
|
||||
[ldr, d1, [x8, $dr_target2]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect DynamicResolution$$LowerResSW Max Target in MS to MAIN+0x3BE1200
|
||||
# Redirect DynamicResolution$$LowerResSW Max Target in MS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2426988
|
||||
instructions: [
|
||||
[b, 0x2426a94]
|
||||
[bl, _drMaxTarget()]
|
||||
]
|
||||
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2426A94
|
||||
instructions: [
|
||||
[adrp, x19, 0x3be1000],
|
||||
[ldr, d1, [x19, 0x200]],
|
||||
[b, 0x242698c]
|
||||
]
|
||||
# Redirect DynamicResolution$$LowerResSW Min Target in MS to MAIN+0x3BE1208
|
||||
# Redirect DynamicResolution$$LowerResSW Min Target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x24269F4
|
||||
instructions: [
|
||||
[b, 0x2426ea4]
|
||||
[bl, _drMinTarget()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2426EA4
|
||||
instructions: [
|
||||
[adrp, x8, 0x3be1000],
|
||||
[ldr, d1, [x8, 0x208]],
|
||||
[b, 0x24269f8]
|
||||
]
|
||||
# Write default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x3BE1200
|
||||
value_type: double
|
||||
value: [31, 29]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3BE1200]
|
||||
value_type: double
|
||||
value: ["0.93 * FRAMETIME_TARGET", "0.87 * FRAMETIME_TARGET"]
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Fate/Samurai Remnant 1.3.2
|
||||
# BID: 6C46135714ABB870
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
# Disable setting double buffer, REF: 28 63 A8 9B B8 5F 6E 29 2B F7 01 51 B9 83 57 B8
|
||||
MASTER_WRITE:
|
||||
-
|
||||
|
@ -4,58 +4,45 @@
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: double
|
||||
default_value: 0.03333333333333333
|
||||
evaluate: "1 / FPS_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS Lock and Dynamic Resolution target values to MAIN + 0x21036F00
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x13281C
|
||||
instructions: [
|
||||
[adrp, x8, 0x21036000],
|
||||
[ldr, x8, [x8, 0xf00]]
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, x8, [x8, $fps_lock]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x3E324C
|
||||
instructions: [
|
||||
[adrp, x8, 0x21036000],
|
||||
[ldr, x8, [x8, 0xf00]]
|
||||
[adrp, x8, $fps_lock],
|
||||
[ldr, x8, [x8, $fps_lock]]
|
||||
]
|
||||
# NOP updating Dynamic Resolution target value
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2D94E8
|
||||
instructions: [
|
||||
[adrp, x9, 0x21036000],
|
||||
[ldr, w9, [x9, 0xf08]]
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, w9, [x9, $dr_target]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x597C5C
|
||||
instructions: [
|
||||
[adrp, x9, 0x21036000],
|
||||
[ldr, w9, [x9, 0xf08]]
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, w9, [x9, $dr_target]]
|
||||
]
|
||||
# Default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x21036F00
|
||||
value_type: double
|
||||
value: 0.03333333333333333
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x21036F08
|
||||
value_type: float
|
||||
value: 33.333333333333
|
||||
ALL_FPS:
|
||||
# FPS Lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x21036F00]
|
||||
value_type: double
|
||||
value: "1 / FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x21036F08]
|
||||
value_type: float
|
||||
|
||||
value: FRAMETIME_TARGET
|
||||
|
@ -2,8 +2,13 @@
|
||||
# BID: 283095029A5AB467
|
||||
# Double buffer is reserved line by line inside class array, so requires ton of patching
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33.333333
|
||||
evaluate: FRAMETIME_TARGET
|
||||
MASTER_WRITE:
|
||||
# Force game to use dynamic speed instead of fixed speed
|
||||
-
|
||||
@ -12,25 +17,11 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, w8, 2]
|
||||
]
|
||||
# Redirect DR timing to MAIN + 0x9DBAEB8
|
||||
# Redirect DR timing
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE88250
|
||||
instructions: [
|
||||
[adrp, x8, 0x9dba000],
|
||||
[ldr, s0, [x8, 0xeb8]]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, s0, [x8, $dr_target]]
|
||||
]
|
||||
# Default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x9DBAEB8
|
||||
value_type: float
|
||||
value: 33.3333333333
|
||||
ALL_FPS:
|
||||
# DR timing
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x9DBAEB8]
|
||||
value_type: float
|
||||
value: FRAMETIME_TARGET
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# MotoGP 24 1.0.5
|
||||
# BID: 1053EA8AD2A50F15
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,12 +1,10 @@
|
||||
# Tamagotchi Plaza 1.0.2
|
||||
# たまごっちのプチプチおみせっち おまちど~さま! 1.0.2
|
||||
# BID: 9ACE779510EC93C9
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# UnityEngine.Rendering.OnDemandRendering_TypeInfo
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x683BB20, 0xB8, 0]
|
||||
value_type: int32
|
||||
value: -1
|
||||
value: -1
|
||||
|
@ -1,10 +1,21 @@
|
||||
# LEGO Star Wars: The Skywalker Saga 1.10.0
|
||||
# BID: EC593A5F9552100A
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 24
|
||||
evaluate: "0.72 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 31
|
||||
evaluate: "0.93 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# redirect reading Dynamic Resolution timing min & max to MAIN + 0xC3C0A50
|
||||
# redirect reading Dynamic Resolution timing min & max
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6171A0
|
||||
@ -12,33 +23,21 @@ MASTER_WRITE:
|
||||
[nop],
|
||||
[ldr, s3, [x11, 0xe04]],
|
||||
[fadd, s1, s1, s3],
|
||||
[adrp, x12, 0xc3c0000],
|
||||
[ldr, s2, [x12, 0xa50]]
|
||||
[adrp, x12, $dr_target1],
|
||||
[ldr, s2, [x12, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6171F0
|
||||
instructions: [
|
||||
[adrp, x11, 0xc3c0000],
|
||||
[ldr, s2, [x11, 0xa54]]
|
||||
[adrp, x11, $dr_target2],
|
||||
[ldr, s2, [x11, $dr_target2]]
|
||||
]
|
||||
# Default DR timings
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0xC3C0A50
|
||||
value_type: float
|
||||
value: [24, 31]
|
||||
ALL_FPS:
|
||||
# g_video_swap_mode
|
||||
## Setting it to 1 to enable 120 FPS results in resolution range being always forced to docked mode
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xAA62FF0]
|
||||
value_type: int32
|
||||
value: 2
|
||||
# Min + max dynamic resolution timing in ms
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xC3C0A50]
|
||||
value_type: float
|
||||
value: ["0.72 * FRAMETIME_TARGET", "0.93 * FRAMETIME_TARGET"]
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Hellblade: Senua's Sacrifice 1.1.0
|
||||
# BID: 9B3DDF2FB9100E51
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Custom Dynamic Resolution implementation - Frame Time (MAX/MIN)
|
||||
# MAX = (1/FPS) * 0.95
|
||||
@ -11,7 +9,7 @@ ALL_FPS:
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x520BBE0, 0x40]
|
||||
value_type: float
|
||||
value: ["(1 / FPS_TARGET) * 0.95", "(1 / FPS_TARGET) * 0.9"]
|
||||
value: ["0.95 / FPS_TARGET", "0.9 / FPS_TARGET"]
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
|
@ -1,28 +1,22 @@
|
||||
# Assassin's Creed The Rebel Collection - Assassin's Creed Rogue 1.0.0
|
||||
# BID: 3DEF0E36AA8C6592
|
||||
|
||||
unsafeCheck: true
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_scale
|
||||
value_type: float
|
||||
default_value: 1000
|
||||
evaluate: "30000 / FPS_TARGET"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Patch code to divide last frametime by float scale factor stored in MAIN+0x61EE400
|
||||
# Patch code to divide last frametime by float scale factor
|
||||
# To match it to Dynamic Resolution calculations
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9F1DDC
|
||||
instructions: [
|
||||
[adrp, x8, 0x61ee000],
|
||||
[ldr, s1, [x8, 0x400]]
|
||||
[adrp, x8, $dr_scale],
|
||||
[ldr, s1, [x8, $dr_scale]]
|
||||
]
|
||||
# Write default dynamic resolution timing factor
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x61EE400
|
||||
value_type: float
|
||||
value: 1000
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x61EE400]
|
||||
value_type: float
|
||||
value: "(FPS_TARGET / 30) * 1000"
|
||||
|
||||
|
@ -3,6 +3,167 @@
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: last_tick
|
||||
value_type: uint64
|
||||
default_value: 0
|
||||
-
|
||||
type: variable
|
||||
name: frame_target
|
||||
value_type: uint32
|
||||
default_value: 33333333
|
||||
evaluate: "FRAMETIME_TARGET * 1000000"
|
||||
-
|
||||
type: variable
|
||||
name: speed_factor
|
||||
value_type: float
|
||||
default_value: 1.0
|
||||
-
|
||||
type: variable
|
||||
name: current_fps
|
||||
value_type: float
|
||||
default_value: 30.0
|
||||
-
|
||||
type: variable
|
||||
name: current_frametime
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1 / FPS_TARGET"
|
||||
-
|
||||
type: const
|
||||
name: nanoseconds_in_sec
|
||||
value: 1000000000
|
||||
-
|
||||
type: const
|
||||
name: max_delta
|
||||
value: 66666666
|
||||
-
|
||||
type: variable
|
||||
name: microseconds_in_sec
|
||||
value_type: double
|
||||
default_value: 1000000.0
|
||||
-
|
||||
type: code
|
||||
name: dynamicSpeed
|
||||
instructions: [
|
||||
[stp, x29, x30, [sp, -16], "!"],
|
||||
[mov, x29, sp],
|
||||
[blr, x8],
|
||||
[mrs, x0, cntpct_el0],
|
||||
[adrp, x8, $last_tick],
|
||||
[ldr, x7, [x8, $last_tick]],
|
||||
[str, x0, [x8, $last_tick]],
|
||||
[cbz, x7, :goto1],
|
||||
[sub, x0, x0, x7],
|
||||
[bl, _convertTickToTimeSpan()],
|
||||
[adrp, x8, $frame_target],
|
||||
[ldr, w1, [x8, $frame_target]],
|
||||
[cmp, x1, x0],
|
||||
[b.lt, :goto2],
|
||||
[mov, x0, x1],
|
||||
:goto2, [mov, x1, $max_delta],
|
||||
[movk, x1, $max_delta, 16],
|
||||
[cmp, x1, x0],
|
||||
[b.gt, :goto3],
|
||||
[mov, x0, x1],
|
||||
:goto3, [ucvtf, d0, x0],
|
||||
[adrp, x0, $microseconds_in_sec],
|
||||
[ldr, d1, [x0, $microseconds_in_sec]],
|
||||
[fdiv, d0, d0, d1],
|
||||
[mov, x0, 1000],
|
||||
[ucvtf, d1, x0],
|
||||
[fdiv, d1, d1, d0],
|
||||
[adrp, x0, $current_fps],
|
||||
[fcvt, s1, d1],
|
||||
[str, s1, [x0, $current_fps]],
|
||||
[fmov, s2, 30.0],
|
||||
[fdiv, s2, s2, s1],
|
||||
[adrp, x0, $speed_factor],
|
||||
[str, s2, [x0, $speed_factor]],
|
||||
[mov, x1, 1000],
|
||||
[ucvtf, d1, x1],
|
||||
[fdiv, d1, d0, d1],
|
||||
[fcvt, s1, d1],
|
||||
[adrp, x0, $current_frametime],
|
||||
[str, s1, [x0, $current_frametime]],
|
||||
:goto1, [ldp, x29, x30, [sp], 16],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: battleFix
|
||||
instructions: [
|
||||
[adrp, x9, $speed_factor],
|
||||
[ldr, s0, [x9, $speed_factor]],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: cameraRotationFix
|
||||
instructions: [
|
||||
[adrp, x8, $speed_factor],
|
||||
[ldr, s8, [x8, $speed_factor]],
|
||||
[fmul, s0, s8, s0],
|
||||
[fcmp, s0, 0.0],
|
||||
[b.ge, :goto1],
|
||||
[fneg, s0, s0],
|
||||
[fsqrt, s0, s0],
|
||||
[fneg, s0, s0],
|
||||
[ret],
|
||||
:goto1, [fsqrt, s0, s0],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: fnSiteFix
|
||||
instructions: [
|
||||
[ldr, s0, [x19, 0xd0]],
|
||||
[adrp, x0, $speed_factor],
|
||||
[ldr, s1, [x0, $speed_factor]],
|
||||
[fmul, s0, s0, s1],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: longJumpFix
|
||||
instructions: [
|
||||
[fmov, s11, 30.0],
|
||||
[fadd, s11, s11, s11],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: qteFix
|
||||
instructions: [
|
||||
[adrp, x20, $speed_factor],
|
||||
[ldr, s1, [x20, $speed_factor]],
|
||||
[ldr, s2, [x19, 0x120]],
|
||||
[fmul, s1, s2, s1],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: fogSpeedFix
|
||||
instructions: [
|
||||
[fsqrt, s2, s2],
|
||||
[fmadd, s0, s1, s2, s0],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: overdriveFix
|
||||
instructions: [
|
||||
[adrp, x0, $current_frametime],
|
||||
[ldr, s0, [x0, $current_frametime]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Dynamic speed mod for stuff like UI, lipsync, grass and rain
|
||||
## Redirect nvnQueuePresentTexture call to code cave at MAIN+0x1735050
|
||||
@ -10,106 +171,51 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x95EED8
|
||||
instructions: [
|
||||
[b, 0x1735050]
|
||||
[bl, _dynamicSpeed()]
|
||||
]
|
||||
## Code Cave (save floats for speed factor to MAIN+0x47BE268, frametime as FPS in MAIN+0x47BE26C, frametime in s in MAIN+0x47BE270)
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1735050
|
||||
instructions: [
|
||||
[blr, x8],
|
||||
[bl, 0x1732500],
|
||||
[adrp, x8, 0x47be000],
|
||||
[ldr, x7, [x8, 0x260]],
|
||||
[str, x0, [x8, 0x260]],
|
||||
[cbnz, x7, +8],
|
||||
[b, 0x95eedc],
|
||||
[sub, x0, x0, x7],
|
||||
[bl, 0x1732510],
|
||||
[adrp, x8, 0x47be000],
|
||||
[ldr, w1, [x8, 0x300]],
|
||||
[cmp, x1, x0],
|
||||
[b.lt, +8],
|
||||
[mov, x0, x1],
|
||||
[mov, x1, 0x40aa],
|
||||
[movk, x1, 0x3f9, 16],
|
||||
[cmp, x1, x0],
|
||||
[b.gt, +8],
|
||||
[mov, x0, x1],
|
||||
[ucvtf, d0, x0],
|
||||
[adrp, x0, 0x17eb000],
|
||||
[ldr, d1, [x0, 0xd58]],
|
||||
[fdiv, d0, d0, d1],
|
||||
[mov, x0, 1000],
|
||||
[ucvtf, d1, x0],
|
||||
[fdiv, d1, d1, d0],
|
||||
[adrp, x0, 0x47be000],
|
||||
[fcvt, s1, d1],
|
||||
[str, s1, [x0, 0x26c]],
|
||||
[fmov, s2, 30.0],
|
||||
[fdiv, s2, s2, s1],
|
||||
[str, s2, [x0, 0x268]],
|
||||
[mov, x1, 1000],
|
||||
[ucvtf, d1, x1],
|
||||
[fdiv, d1, d0, d1],
|
||||
[fcvt, s1, d1],
|
||||
[str, s1, [x0, 0x270]],
|
||||
[b, 0x95eedc]
|
||||
]
|
||||
## Default values for code cave
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x47BE268
|
||||
value_type: float
|
||||
value: [1.0, 30.0, 0.033333333333]
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x47BE300
|
||||
value_type: uint32
|
||||
value: 33333333
|
||||
## Function 1 to speed factor // Usage unknown
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x286968
|
||||
instructions: [
|
||||
[adrp, x21, 0x47be000],
|
||||
[adrp, x21, $speed_factor],
|
||||
[ldr, x0, [x8, 0xe18]],
|
||||
[ldr, s10, [x21, 0x268]]
|
||||
[ldr, s10, [x21, $speed_factor]]
|
||||
]
|
||||
## Function 3 to speed factor // Usage unknown
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xA16F00
|
||||
instructions: [
|
||||
[adrp, x0, 0x47be000],
|
||||
[ldr, s8, [x0, 0x268]]
|
||||
[adrp, x0, $speed_factor],
|
||||
[ldr, s8, [x0, $speed_factor]]
|
||||
]
|
||||
## Function 4 to FPS // UI Speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xA1F060
|
||||
instructions: [
|
||||
[adrp, x0, 0x47be000],
|
||||
[adrp, x0, $current_fps],
|
||||
[fmov, s0, w8],
|
||||
[ldr, s0, [x0, 0x26c]]
|
||||
[ldr, s0, [x0, $current_fps]]
|
||||
]
|
||||
## Function 5 to FPS // Usage unknown
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2672DC
|
||||
instructions: [
|
||||
[adrp, x0, 0x47ae000],
|
||||
[adrp, x0, $current_fps],
|
||||
[fmov, s0, w8],
|
||||
[ldrh, w8, [x19, 0x68]],
|
||||
[ldr, s5, [x0, 0x26c]]
|
||||
[ldr, s5, [x0, $current_fps]]
|
||||
]
|
||||
## Function 6 to FPS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x26DB70
|
||||
instructions: [
|
||||
[adrp, x0, 0x47be000],
|
||||
[ldr, s0, [x0, 0x26c]],
|
||||
[adrp, x0, $current_fps],
|
||||
[ldr, s0, [x0, $current_fps]],
|
||||
[fcvtzu, w0, s0],
|
||||
[mov, w9, 6],
|
||||
[udiv, w8, w0, w9]
|
||||
@ -119,29 +225,20 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x1E2924
|
||||
instructions: [
|
||||
[adrp, x9, 0x47be000]
|
||||
[adrp, x9, $current_frametime]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E2938
|
||||
instructions: [
|
||||
[ldr, s0, [x9, 0x270]]
|
||||
[ldr, s0, [x9, $current_frametime]]
|
||||
]
|
||||
# Adjust various elements related to fighting
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E8F48
|
||||
instructions: [
|
||||
[b, 0x1735174]
|
||||
]
|
||||
## Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1735174
|
||||
instructions: [
|
||||
[adrp, x9, 0x47be000],
|
||||
[ldr, s0, [x9, 0x268]],
|
||||
[b, 0x1e8f4c]
|
||||
[bl, _battleFix()]
|
||||
]
|
||||
## Fix gun speed
|
||||
-
|
||||
@ -155,39 +252,15 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x13A90B4
|
||||
instructions: [
|
||||
[adrp, x8, 0x47be000],
|
||||
[ldr, s0, [x8, 0xf00]]
|
||||
]
|
||||
## Default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x47BEF00
|
||||
value_type: float
|
||||
value: 0.01666666666
|
||||
# Adjust camera speed rotation dynamically
|
||||
## Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1735108
|
||||
instructions: [
|
||||
[adrp, x8, 0x47be000],
|
||||
[ldr, s8, [x8, 0x268]],
|
||||
[fmul, s0, s8, s0],
|
||||
[fcmp, s0, 0.0],
|
||||
[b.ge, +20],
|
||||
[fneg, s0, s0],
|
||||
[fsqrt, s0, s0],
|
||||
[fneg, s0, s0],
|
||||
[ret],
|
||||
[fsqrt, s0, s0],
|
||||
[ret]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, s0, [x8, $dr_target]]
|
||||
]
|
||||
## Connect function 1
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1E17A0
|
||||
instructions: [
|
||||
[bl, 0x1735108]
|
||||
[bl, _cameraRotationFix()]
|
||||
]
|
||||
## Connect function 2
|
||||
-
|
||||
@ -200,139 +273,55 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x1E17BC
|
||||
instructions: [
|
||||
[bl, 0x1735108]
|
||||
]
|
||||
# Force 1s sleep to synchronize audio if cutscene detected
|
||||
## Use function responsible for writing type 4 of cutscene
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2FB0D8
|
||||
instructions: [
|
||||
[b, 0x1735158]
|
||||
]
|
||||
### Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1735158
|
||||
instructions: [
|
||||
[mov, w20, 4],
|
||||
[adrp, x0, 0x1fef000],
|
||||
[str, w20, [x0, 0xaf4]],
|
||||
[mov, x0, 0xca00],
|
||||
[movk, x0, 0x3b9a, 16],
|
||||
[bl, 0x17320d0],
|
||||
[b, 0x2fb0dc]
|
||||
[bl, _cameraRotationFix()]
|
||||
]
|
||||
# Adjust Field Action gauge bar speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE5E00
|
||||
instructions: [
|
||||
[adrp, x0, 0x47be000],
|
||||
[adrp, x0, $speed_factor],
|
||||
[adrp, x9, 0x1d54000],
|
||||
[ldr, s8, [x0, 0x268]]
|
||||
[ldr, s8, [x0, $speed_factor]]
|
||||
]
|
||||
## Fix for FN Site
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xE5858
|
||||
instructions: [
|
||||
[b, 0x17350e8]
|
||||
]
|
||||
### Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17350E8
|
||||
instructions: [
|
||||
[ldr, s0, [x19, 0xd0]],
|
||||
[adrp, x0, 0x47be000],
|
||||
[ldr, s1, [x0, 0x268]],
|
||||
[fmul, s0, s0, s1],
|
||||
[b, 0xe585c]
|
||||
[bl, _fnSiteFix()]
|
||||
]
|
||||
# Fix long jump when not running
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x23EF70
|
||||
instructions: [
|
||||
[b, 0x17350fc]
|
||||
]
|
||||
## Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17350FC
|
||||
instructions: [
|
||||
[fmov, s11, 30.0],
|
||||
[fadd, s11, s11, s11],
|
||||
[b, 0x23ef74]
|
||||
[bl, _longJumpFix()]
|
||||
]
|
||||
# Adjust QTE Speed
|
||||
## Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1735134
|
||||
instructions: [
|
||||
[adrp, x20, 0x47be000],
|
||||
[ldr, s1, [x20, 0x268]],
|
||||
[b, 0x17351a8]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17351A8
|
||||
instructions: [
|
||||
[ldr, s2, [x19, 0x120]],
|
||||
[fmul, s1, s2, s1],
|
||||
[b, 0x5c6284]
|
||||
]
|
||||
## Connect function
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x5C6280
|
||||
instructions: [
|
||||
[b, 0x1735134]
|
||||
]
|
||||
# Adjust Overdrive counter, Follow Ball speed
|
||||
## Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1735180
|
||||
instructions: [
|
||||
[adrp, x0, 0x47be000],
|
||||
[ldr, s0, [x0, 0x270]],
|
||||
[ret]
|
||||
]
|
||||
## Connect function
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x67354
|
||||
instructions: [
|
||||
[bl, 0x1734e00]
|
||||
[bl, _qteFix()]
|
||||
]
|
||||
# Fix fog speed
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x296AE0
|
||||
instructions: [
|
||||
[adrp, x8, 0x47be000],
|
||||
[ldr, s2, [x8, 0x268]],
|
||||
[bl, 0x17351b4]
|
||||
[adrp, x8, $speed_factor],
|
||||
[ldr, s2, [x8, $speed_factor]],
|
||||
[bl, _fogSpeedFix()]
|
||||
]
|
||||
## Code cave
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x17351B4
|
||||
main_offset: 0x676D4
|
||||
instructions: [
|
||||
[fsqrt, s2, s2],
|
||||
[fmadd, s0, s1, s2, s0],
|
||||
[ret]
|
||||
[bl, _overdriveFix()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# FPS Target
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x47BE300]
|
||||
value_type: uint32
|
||||
value: "FRAMETIME_TARGET * 1000000"
|
||||
# FPS Lock
|
||||
# ref: 00 01 00 b9 2a 01 00 b9 c0 03 5f d6
|
||||
-
|
||||
@ -340,12 +329,6 @@ ALL_FPS:
|
||||
address: [MAIN, 0x1D943A0]
|
||||
value_type: int32
|
||||
value: [1, 1]
|
||||
# DR Target
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x47BEF00]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
# Lock game to 30 FPS when complex/prerendered cutscene is played
|
||||
## Adjusts DR target
|
||||
-
|
||||
@ -354,7 +337,7 @@ ALL_FPS:
|
||||
compare_value_type: uint32
|
||||
compare_type: ">"
|
||||
compare_value: 2
|
||||
address: [MAIN, 0x47BEF00]
|
||||
address: [VARIABLE, dr_target]
|
||||
value_type: float
|
||||
value: 0.03333333333
|
||||
## Force OS to run at 60 Hz with interval 2
|
||||
@ -364,6 +347,5 @@ ALL_FPS:
|
||||
compare_value_type: uint32
|
||||
compare_type: ">"
|
||||
compare_value: 2
|
||||
address: [MAIN]
|
||||
value_type: refresh_rate
|
||||
value: 30
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Deliver Us The Moon 1.0.0
|
||||
# BID: 928AF9461536F5E3
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,13 +1,12 @@
|
||||
# DRAGON QUEST TREASURES 1.0.1
|
||||
# BID: 2F81A2EC9B298B37
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to untie game speed from framerate and unlock FPS
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x7E110D8, 0x7C0]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,7 +1,19 @@
|
||||
# Dark Souls Remastered 1.0.3
|
||||
# BID: DF3766A2BB651A3E
|
||||
|
||||
unsafeCheck: false
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: fps_target
|
||||
value_type: double
|
||||
default_value: 30
|
||||
evaluate: FPS_LOCK_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: game_speed
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect FPS target to MAIN+0x55E9A00
|
||||
@ -9,63 +21,41 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x706FA4
|
||||
instructions: [
|
||||
[adrp, x1, 0x55e9000]
|
||||
[adrp, x1, $fps_target]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x7070B0
|
||||
instructions: [
|
||||
[ldr, d0, [x1, 0xa00]]
|
||||
[ldr, d0, [x1, $fps_target]]
|
||||
]
|
||||
# Redirect game speed to MAIN+0x55E9A08
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x667900
|
||||
instructions: [
|
||||
[adrp, x8, 0x55e9000],
|
||||
[ldr, s8, [x8, 0xa08]]
|
||||
[adrp, x8, $game_speed],
|
||||
[ldr, s8, [x8, $game_speed]]
|
||||
]
|
||||
# Write default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x55E9A00
|
||||
value_type: double
|
||||
value: 30
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x55E9A08
|
||||
value_type: float
|
||||
value: 0.0333333333
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x55E9A00]
|
||||
value_type: double
|
||||
value: FPS_LOCK_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x55E9A08]
|
||||
value_type: float
|
||||
value: "1/FPS_TARGET"
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x4543788, 0x470]
|
||||
compare_address_unsafe: true
|
||||
compare_type: "=="
|
||||
compare_value_type: int32
|
||||
compare_value: 1
|
||||
address: [MAIN, 0x55E9A00]
|
||||
value_type: double
|
||||
address: [VARIABLE, fps_target]
|
||||
value: 30
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x4543788, 0x470]
|
||||
compare_address_unsafe: true
|
||||
compare_type: "=="
|
||||
compare_value_type: int32
|
||||
compare_value: 1
|
||||
address: [MAIN, 0x55E9A08]
|
||||
value_type: float
|
||||
address: [VARIABLE, game_speed]
|
||||
value: 0.0333333333
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -0,0 +1,106 @@
|
||||
# Kirby and the Forgotten Land 1.1.0
|
||||
# BID: A6CE40DC3AEDB1BE
|
||||
# Thanks to Hazerou for finding interval offsets
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
## REF: 08 07 40 B9 49 00 80 52
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x747C04
|
||||
instructions: [
|
||||
[mov, w9, 3]
|
||||
]
|
||||
# Fix helper functions to not corrupt stack
|
||||
## REF: 42 00 80 52 BF FF 30 A9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x747CE0
|
||||
instructions: [
|
||||
[mov, w2, 3]
|
||||
]
|
||||
## REF: 08 65 45 F9 42 00 80 52, first result
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x75ADFC
|
||||
instructions: [
|
||||
[mov, w2, 3]
|
||||
]
|
||||
## REF: 09 C0 9D 52 09 01 A0 72 E1 03 00 91 F6 03 00 91, beginning of function
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x676AC8
|
||||
instructions: [
|
||||
[sub, sp, sp, 0x50],
|
||||
[stp, x22, x21, [sp, 0x20]],
|
||||
[stp, x20, x19, [sp, 0x30]],
|
||||
[stp, x29, x30, [sp, 0x40]],
|
||||
[add, x29, sp, 0x40]
|
||||
]
|
||||
## REF: 00 61 00 91 42 00 80 52
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x676B1C
|
||||
instructions: [
|
||||
[mov, w2, 3]
|
||||
]
|
||||
## REF: End of function from code above, first ldp x29 x30
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x676B40
|
||||
instructions: [
|
||||
[ldp, x29, x30, [sp, 0x40]],
|
||||
[ldp, x20, x19, [sp, 0x30]],
|
||||
[ldp, x22, x21, [sp, 0x20]],
|
||||
[add, sp, sp, 0x50]
|
||||
]
|
||||
## REF: 42 00 80 52 F6 03 00 91
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x74C280
|
||||
instructions: [
|
||||
[mov, w2, 3]
|
||||
]
|
||||
## REF: 42 00 80 52 16 69 69 F8, second result
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x75AE68
|
||||
instructions: [
|
||||
[mov, w2, 3]
|
||||
]
|
||||
## REF: 42 00 80 52 08 05 40 F9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x7C2E64
|
||||
instructions: [
|
||||
[mov, w2, 3]
|
||||
]
|
||||
# Block transparency in some 2D elements to avoid issue with flickering at triple buffer
|
||||
## REF: 49 91 89 B9 4A 41 48 B9
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6A757C
|
||||
instructions: [
|
||||
[mov, x9, 0x102],
|
||||
[ldr, w10, [x10, 0x840]],
|
||||
[add, x20, x8, 0x820],
|
||||
[lsl, x12, x10, 3],
|
||||
[str, x9, [x20]]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Interval (Setting it to 0 unlocks framerate and sets dynamic game speed)
|
||||
## REF: 17 6C 90 52 57 01 A0 72 08 7C 01 A9, first STR above it
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xA76728, 0x50]
|
||||
address_unsafe: true
|
||||
value_type: int32
|
||||
value: 0
|
||||
# Dynamic Resolution GPU Frametiming Max / Min (Max = 1.95 * (30/FPS), Min = 1.7 * (30/FPS))
|
||||
## REF: 88 F2 80 B9 F3 03 00 AA 1F 05 00 71, last result, first STR above it
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xA767B0, 0x140, 0x1B0, 0x20, 0x34]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: ["(30 / FPS_TARGET) * 1.95", "(30 / FPS_TARGET) * 1.7"]
|
@ -2,8 +2,6 @@
|
||||
# BID: D9BA7DB72FFAFECD
|
||||
# Thanks to Hazerou for finding interval offsets
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
-
|
||||
@ -84,12 +82,15 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xA72628, 0x50]
|
||||
address_unsafe: true
|
||||
value_type: int32
|
||||
value: 0
|
||||
# Dynamic Resolution GPU Frametiming Max / Min (Max = 1.95 * (30/FPS), Min = 1.7 * (30/FPS))
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xA726B0, 0x140, 0x1B0, 0x20, 0x34]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: ["(30 / FPS_TARGET) * 1.95", "(30 / FPS_TARGET) * 1.7"]
|
||||
|
||||
|
||||
|
@ -1,45 +1,44 @@
|
||||
# Resident Evil 1.0.0
|
||||
# BID: 6BEC9B23B09DF46C
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: cutscene_flag
|
||||
value_type: uint32
|
||||
default_value: 0
|
||||
-
|
||||
type: code
|
||||
name: signalCutscene
|
||||
instructions: [
|
||||
[add, x29, sp, 0x10],
|
||||
[mov, w1, 1],
|
||||
[adrp, x19, $cutscene_flag],
|
||||
[str, w1, [x19, $cutscene_flag]],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: designalCutscene
|
||||
instructions: [
|
||||
[mov, w1, wzr],
|
||||
[adrp, x2, $cutscene_flag],
|
||||
[str, w1, [x2, $cutscene_flag]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Detect prerendered cutscenes
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xB1A810
|
||||
main_offset: 0xB1A818
|
||||
instructions: [
|
||||
[b, 0xb31be8]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xB31BE8
|
||||
instructions: [
|
||||
[str, x19, [sp, -0x20], "!"],
|
||||
[mov, w1, 1],
|
||||
[adrp, x19, 0x24e7000],
|
||||
[str, w1, [x19, 0xff0]],
|
||||
[mov, x19, x0],
|
||||
[mov, w0, 0xca00],
|
||||
[movk, w0, 0x3b9a, 16],
|
||||
[svc, 0xb],
|
||||
[mov, x0, x19],
|
||||
[b, 0xb1a814]
|
||||
[bl, _signalCutscene()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xB1A9BC
|
||||
instructions: [
|
||||
[b, 0xb31c10]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xB31C10
|
||||
instructions: [
|
||||
[mov, w1, wzr],
|
||||
[adrp, x2, 0x24e7000],
|
||||
[str, w1, [x2, 0xff0]],
|
||||
[b, 0xb24ec0]
|
||||
[b, _designalCutscene()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Internal FPS Lock
|
||||
@ -51,9 +50,7 @@ ALL_FPS:
|
||||
-
|
||||
type: compare
|
||||
compare_type: "=="
|
||||
compare_value_type: uint32
|
||||
compare_value: 1
|
||||
compare_address: [MAIN, 0x24E7FF0]
|
||||
address: [MAIN]
|
||||
compare_address: [VARIABLE, cutscene_flag]
|
||||
value_type: refresh_rate
|
||||
value: 30
|
||||
|
@ -1,17 +1,28 @@
|
||||
# REYNATIS (US/EU) 1.0.10
|
||||
# BID: 5F765D2CC4CDEF1C
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: double
|
||||
default_value: 31
|
||||
evaluate: "0.93 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: double
|
||||
default_value: 29
|
||||
evaluate: "(0.93 * FRAMETIME_TARGET) - 2"
|
||||
MASTER_WRITE:
|
||||
# Redirect reading DR timing in DynamicResolution::LowerResSW() to MAIN + 0x7C22F00
|
||||
# Redirect reading DR timing in DynamicResolution::LowerResSW()
|
||||
# REF: 01 f0 67 1e
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x38E7ECC
|
||||
instructions: [
|
||||
[adrp, x20, 0x7c22000],
|
||||
[ldr, d1, [x20, 0xf00]],
|
||||
[adrp, x20, $dr_target1],
|
||||
[ldr, d1, [x20, $dr_target1]],
|
||||
[fcmpe, d0, d1],
|
||||
[ldp, s9, s8, [x19, 0x40]],
|
||||
[b.le, 0x38e7f34],
|
||||
@ -21,19 +32,5 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x38E7F34
|
||||
instructions: [
|
||||
[ldr, d1, [x20, 0xf08]]
|
||||
[ldr, d1, [x20, $dr_target2]]
|
||||
]
|
||||
# Default handheld value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x7C22F00
|
||||
value_type: double
|
||||
value: [31, 29]
|
||||
ALL_FPS:
|
||||
# Dynamic Resolution Timing
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x7C22F00]
|
||||
value_type: double
|
||||
value: ["0.93 * FRAMETIME_TARGET", "(0.93 * FRAMETIME_TARGET) - 2"]
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# DRAGON BALL Z: KARAKOT + A NEW POWER AWAKENS SET 1.50
|
||||
# BID: 20503FA77FA416B7
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate in cutscenes to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9456538, 0x810]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47 in cutscenes, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,13 +1,12 @@
|
||||
# DRAGON BALL Z: KARAKOT + A NEW POWER AWAKENS SET 1.51
|
||||
# BID: 389E38618E93A5E0
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate in cutscenes to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9456538, 0x810]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47 in cutscenes, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,13 +1,12 @@
|
||||
# DRAGON BALL Z: KARAKOT + A NEW POWER AWAKENS SET 1.52
|
||||
# BID: 72F6F8B54276185C
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate in cutscenes to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x945A538, 0x810]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47 in cutscenes, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
@ -32,4 +31,4 @@ ALL_FPS:
|
||||
type: write
|
||||
address: [MAIN, 0x88C6FD8, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
value: [0, 0]
|
||||
|
@ -1,13 +1,12 @@
|
||||
# DRAGON BALL Z: KARAKOT + A NEW POWER AWAKENS SET 1.60
|
||||
# BID: BC99D4D0A9474360
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate in cutscenes to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x996A558, 0x810]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47 in cutscenes, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
@ -32,4 +31,4 @@ ALL_FPS:
|
||||
type: write
|
||||
address: [MAIN, 0x8DD7418, 0]
|
||||
value_type: int32
|
||||
value: [0, 0]
|
||||
value: [0, 0]
|
||||
|
@ -2,8 +2,6 @@
|
||||
# BID: 76EC789B99A25BA5
|
||||
# REF: aql::GraphicsContext::initialize
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
-
|
||||
@ -12,10 +10,3 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, x8, 3]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x25CCF00]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
@ -4,63 +4,50 @@
|
||||
# Fishing timer is decreasing 2x faster at 60 FPS
|
||||
# Bike is turning 2x faster at 60 FPS
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: fps_lock
|
||||
value_type: uint32
|
||||
default_value: 33333333
|
||||
evaluate: "FRAMETIME_TARGET * 930000"
|
||||
-
|
||||
type: variable
|
||||
name: frame_time
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
-
|
||||
type: code
|
||||
name: dynamicSpeed
|
||||
instructions: [
|
||||
[str, d0, [x8, 0x20]],
|
||||
[fcvt, s4, d0],
|
||||
[adrp, x8, $frame_time],
|
||||
[str, s4, [x8, $frame_time]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Move loading FPS lock time to MAIN+0x2B31200
|
||||
# Move loading FPS lock time
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x511818
|
||||
instructions: [
|
||||
[adrp, x9, 0x2b31000],
|
||||
[ldr, w9, [x9, 0x200]]
|
||||
[adrp, x9, $fps_lock],
|
||||
[ldr, w9, [x9, $fps_lock]]
|
||||
]
|
||||
# Default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x2B31200
|
||||
value_type: uint32
|
||||
value: 33333333
|
||||
# Write game's loop time as float to MAIN+0x2B31204
|
||||
# Write game's loop time as float
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x511884
|
||||
instructions: [
|
||||
[b, 0x5117f4]
|
||||
[bl, _dynamicSpeed()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x5117F4
|
||||
instructions: [
|
||||
[str, d0, [x8, 0x20]],
|
||||
[fcvt, s4, d0],
|
||||
[b, 0x511a84]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x511A84
|
||||
instructions: [
|
||||
[adrp, x8, 0x2b31000],
|
||||
[str, s4, [x8, 0x204]],
|
||||
[b, 0x511888]
|
||||
]
|
||||
- # Read lowest timing float factor from MAIN+0x2B31204
|
||||
- # Read lowest timing float factor
|
||||
type: asm_a64
|
||||
main_offset: 0x5E5EC
|
||||
instructions: [
|
||||
[adrp, x8, 0x2b31000],
|
||||
[adrp, x8, $frame_time],
|
||||
[fminnm, s1, s1, s2],
|
||||
[ldr, s2, [x8, 0x204]]
|
||||
[ldr, s2, [x8, $frame_time]]
|
||||
]
|
||||
- # Default value
|
||||
type: bytes
|
||||
main_offset: 0x2B31204
|
||||
value_type: float
|
||||
value: 0.0333333333
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x2B31200]
|
||||
value_type: uint32
|
||||
value: 11111111
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.1.0
|
||||
# BID: 153DB27728D41305
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect DR to MAIN + 0x2F11FF0
|
||||
# REF: A9 24 89 52 49 A2 A7 72
|
||||
@ -26,6 +24,7 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2ED8D10, 0xE0, 0x284]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# DR Target
|
||||
|
@ -1,37 +1,31 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.3.0
|
||||
# BID: 1CEA83A1E6684665
|
||||
|
||||
unsafeCheck: false
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.035714
|
||||
evaluate: "1.01 / FPS_TARGET"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect DR to MAIN + 0x2F5CFF0
|
||||
# Redirect DR
|
||||
# REF: A9 24 89 52 49 A2 A7 72, second REF
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x10AAEE4
|
||||
instructions: [
|
||||
[adrp, x9, 0x2f5c000],
|
||||
[ldr, s1, [x9, 0xff0]],
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s1, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
## Default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x2F5CFF0
|
||||
value_type: float
|
||||
value: 0.035714
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
# REF: 88 46 40 F9 03 11 40 F9, first ADRP+LDR above it
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2F23C00, 0xE0, 0x294]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# DR Target
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x2F5CFF0]
|
||||
value_type: float
|
||||
value: "1.01 / FPS_TARGET"
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.2.0
|
||||
# BID: 29F67D61B0AD1500
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect DR to MAIN + 0x2F4CFF0
|
||||
# REF: A9 24 89 52 49 A2 A7 72, second REF
|
||||
@ -26,6 +24,7 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2F13D80, 0xE0, 0x284]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# DR Target
|
||||
|
@ -1,8 +1,6 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.2.1
|
||||
# BID: 3B2CB1C8865E7B1E
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect DR to MAIN + 0x2F4CFF0
|
||||
# REF: A9 24 89 52 49 A2 A7 72, second REF
|
||||
@ -26,6 +24,7 @@ ALL_FPS:
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2F13D80, 0xE0, 0x284]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# DR Target
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.0.2
|
||||
# BID: 5E43788065113530
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
# REF: 88 46 40 F9 03 11 40 F9, first ADRP+LDR above it
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2E8DCF0, 0xE0, 0x284]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
@ -0,0 +1,30 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.4.2
|
||||
# BID: 9B9CCD97EB6EF789
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.035714
|
||||
evaluate: "1.01 / FPS_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect DR
|
||||
# REF: A9 24 89 52 49 A2 A7 72, second REF
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x10EC6A4
|
||||
instructions: [
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s1, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
# REF: 88 46 40 F9 03 11 40 F9, first ADRP+LDR above it
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2FC3CB0, 0xE0, 0x294]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
@ -1,13 +1,12 @@
|
||||
# Atelier Yumia: The Alchemist of Memories & the Envisioned Land 1.0.1
|
||||
# BID: A947DDE7826A3562
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
# REF: 88 46 40 F9 03 11 40 F9, first ADRP+LDR above it
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2E8AB00, 0xE0, 0x284]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
@ -1,38 +1,31 @@
|
||||
# 유미아의 아틀리에 ~추억의 연금술사와 창환의 땅~ 1.3.0
|
||||
# BID: 6CB3E54C5F648410
|
||||
|
||||
unsafeCheck: false
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.035714
|
||||
evaluate: "1.01 / FPS_TARGET"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect DR to MAIN + 0x2F5CFF0
|
||||
# Redirect DR
|
||||
# REF: A9 24 89 52 49 A2 A7 72, second REF
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x10AAEE4
|
||||
instructions: [
|
||||
[adrp, x9, 0x2f5c000],
|
||||
[ldr, s1, [x9, 0xff0]],
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s1, [x9, $dr_target]],
|
||||
[nop]
|
||||
]
|
||||
## Default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x2F5CFF0
|
||||
value_type: float
|
||||
value: 0.035714
|
||||
ALL_FPS:
|
||||
# Disable FPS Lock
|
||||
# REF: 88 46 40 F9 03 11 40 F9, first ADRP+LDR above it
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x2F23C00, 0xE0, 0x294]
|
||||
address_unsafe: true
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# DR Target
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x2F5CFF0]
|
||||
value_type: float
|
||||
value: "1.01 / FPS_TARGET"
|
||||
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Monster Hunter Rise JP 16.02
|
||||
# BID: D2FD97779381FB9A
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Internal FPS lock
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x12B2E5C8, 0x434]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: FPS_LOCK_TARGET
|
||||
-
|
||||
|
@ -1,34 +1,32 @@
|
||||
# Fire Emblem: Three Houses 1.2.0
|
||||
# BID: 89048449BA238C8C
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 34
|
||||
evaluate: "0.99 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 25
|
||||
evaluate: "0.84 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect DR timing targets to MAIN + 0x21E4F30
|
||||
# Redirect DR timing targets
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x4C82D0
|
||||
instructions: [
|
||||
[adrp, x10, 0x21e4000],
|
||||
[ldr, s2, [x10, 0xf30]]
|
||||
[adrp, x10, $dr_target1],
|
||||
[ldr, s2, [x10, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x4C8300
|
||||
instructions: [
|
||||
[adrp, x8, 0x21e4000],
|
||||
[ldr, s2, [x8, 0xf34]]
|
||||
[adrp, x8, $dr_target2],
|
||||
[ldr, s2, [x8, $dr_target2]]
|
||||
]
|
||||
# Default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x21E4F30
|
||||
value_type: float
|
||||
value: [34, 25]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x21E4F30]
|
||||
value_type: float
|
||||
value: ["0.99 * FRAMETIME_TARGET", "0.84 * FRAMETIME_TARGET"]
|
||||
|
||||
|
@ -1,49 +1,54 @@
|
||||
# NieR:Automata The End of YoRHa Edition US/EU 1.0.2
|
||||
# BID: E43525F22282A477
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target_bad
|
||||
value_type: float
|
||||
default_value: 45
|
||||
evaluate: "1.35 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target_optimal
|
||||
value_type: float
|
||||
default_value: 32.01
|
||||
evaluate: "0.9603 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target_good
|
||||
value_type: float
|
||||
default_value: 30
|
||||
evaluate: "0.9 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect DR timings to MAIN + 0x2BE6F00, [Bad, Optimal, Good]
|
||||
# Redirect DR timings
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF3E4
|
||||
instructions: [
|
||||
[adrp, x12, 0x2be6000],
|
||||
[ldr, s3, [x12, 0xf00]]
|
||||
[adrp, x12, $dr_target_bad],
|
||||
[ldr, s3, [x12, $dr_target_bad]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF434
|
||||
instructions: [
|
||||
[adrp, x12, 0x2be6000],
|
||||
[ldr, w12, [x12, 0xf04]]
|
||||
[adrp, x12, $dr_target_optimal],
|
||||
[ldr, w12, [x12, $dr_target_optimal]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF484
|
||||
instructions: [
|
||||
[fcsel, s3, s4, s0, gt],
|
||||
[adrp, x12, 0x2be6000],
|
||||
[ldr, s0, [x12, 0xf04]],
|
||||
[nop]
|
||||
[adrp, x12, $dr_target_optimal],
|
||||
[ldr, s0, [x12, $dr_target_optimal]],
|
||||
[adrp, x12, $dr_target_good]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x9BF4A8
|
||||
instructions: [
|
||||
[ldr, s0, [x12, 0xf08]]
|
||||
[ldr, s0, [x12, $dr_target_good]]
|
||||
]
|
||||
# Default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x2BE6F00
|
||||
value_type: float
|
||||
value: [45, 32.01, 30]
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x2BE6F00]
|
||||
value_type: float
|
||||
value: ["1.35 * FRAMETIME_TARGET", "0.9603 * FRAMETIME_TARGET", "0.9 * FRAMETIME_TARGET"]
|
||||
|
||||
|
@ -1,12 +1,11 @@
|
||||
# A Hat in Time 1.0.4
|
||||
# BID: 746F0D697EEEE2DD
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# MaxSmoothedFrameRate
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x2265248, 0x71C]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: FPS_LOCK_TARGET
|
||||
|
@ -1,8 +1,61 @@
|
||||
# Crysis 2 Remastered 1.3.0
|
||||
# BID: B3967105033ACC08
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 31.5
|
||||
evaluate: "0.945 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 32.5
|
||||
evaluate: "0.975 * FRAMETIME_TARGET"
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: dr_target3
|
||||
value_type: float
|
||||
default_value: 33
|
||||
evaluate: "0.99 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target4
|
||||
value_type: float
|
||||
default_value: 35
|
||||
evaluate: "0.99 * FRAMETIME_TARGET"
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: dr_target5
|
||||
value_type: float
|
||||
default_value: 32
|
||||
evaluate: "0.96 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target6
|
||||
value_type: float
|
||||
default_value: 33.5
|
||||
evaluate: "0.96 * FRAMETIME_TARGET"
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
# DON'T PUT ANYTHING BETWEEN - START
|
||||
-
|
||||
type: variable
|
||||
name: dr_target7
|
||||
value_type: float
|
||||
default_value: 28.75
|
||||
evaluate: "0.8625 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target8
|
||||
value_type: float
|
||||
default_value: 29.75
|
||||
evaluate: "0.8625 * FRAMETIME_TARGET"
|
||||
# DON'T PUT ANYTHING BETWEEN - END
|
||||
MASTER_WRITE:
|
||||
# Redirect Dynamic Resolution Timings to read always not from .text
|
||||
-
|
||||
@ -22,63 +75,32 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x2EE9A38
|
||||
instructions: [
|
||||
[adrp, x11, 0x453b000]
|
||||
[adrp, x11, $dr_target1]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2EE9A40
|
||||
instructions: [
|
||||
[adrp, x12, 0x453b000],
|
||||
[ldr, s1, [x11, 0x300]],
|
||||
[ldr, s2, [x12, 0x304]]
|
||||
[adrp, x12, $dr_target2],
|
||||
[ldr, s1, [x11, $dr_target1]],
|
||||
[ldr, s2, [x12, $dr_target2]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2EE9A50
|
||||
instructions: [
|
||||
[adrp, x13, 0x453b000],
|
||||
[add, x13, x13, 0x308]
|
||||
[adrp, x13, $dr_target3],
|
||||
[add, x13, x13, $dr_target3]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x2EE9A7C
|
||||
instructions: [
|
||||
[adrp, x9, 0x453b000],
|
||||
[add, x9, x9, 0x310],
|
||||
[adrp, x11, 0x453b000],
|
||||
[add, x11, x11, 0x318]
|
||||
[adrp, x9, $dr_target5],
|
||||
[add, x9, x9, $dr_target5],
|
||||
[adrp, x11, $dr_target7],
|
||||
[add, x11, x11, $dr_target7]
|
||||
]
|
||||
# Write default values
|
||||
# MAIN + 0x333FAFC
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x453B300
|
||||
value_type: float
|
||||
value: 31.5
|
||||
# MAIN + 0x333F844
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x453B304
|
||||
value_type: float
|
||||
value: 32.5
|
||||
# MAIN + 0x333E360
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x453B308
|
||||
value_type: float
|
||||
value: [33, 35]
|
||||
# MAIN + 0x333E258
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x453B310
|
||||
value_type: float
|
||||
value: [32, 33.5]
|
||||
# MAIN + 0x333E9F8
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x453B318
|
||||
value_type: float
|
||||
value: [28.75, 29.75]
|
||||
ALL_FPS:
|
||||
# sys_MaxFPS
|
||||
-
|
||||
@ -88,40 +110,10 @@ ALL_FPS:
|
||||
value: FPS_LOCK_TARGET
|
||||
# Renderer thread delay
|
||||
-
|
||||
type: write
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x444A0D8]
|
||||
value_type: float
|
||||
value: 0.01
|
||||
# MAIN + 0x333FAFC
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x453B300]
|
||||
value_type: float
|
||||
value: "0.945 * FRAMETIME_TARGET"
|
||||
# MAIN + 0x333F844
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x453B304]
|
||||
value_type: float
|
||||
value: "0.975 * FRAMETIME_TARGET"
|
||||
# MAIN + 0x333E360
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x453B308]
|
||||
value_type: float
|
||||
value: ["0.99 * FRAMETIME_TARGET", "0.99 * FRAMETIME_TARGET"]
|
||||
# MAIN + 0x333E258
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x453B310]
|
||||
value_type: float
|
||||
value: ["0.96 * FRAMETIME_TARGET", "0.96 * FRAMETIME_TARGET"]
|
||||
# MAIN + 0x333E9F8
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x453B318]
|
||||
value_type: float
|
||||
value: ["0.8625 * FRAMETIME_TARGET", "0.8625 * FRAMETIME_TARGET"]
|
||||
value: "0.66 / FPS_TARGET"
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
@ -1,8 +1,19 @@
|
||||
# WARRIORS: Abyss 1.4.0
|
||||
# BID: 36B692C0FA9F6F46
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 50
|
||||
evaluate: "1.5 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 40
|
||||
evaluate: "1.2 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# REF: 09 49 A8 52 21 01 27 1E 00 20 21 1E
|
||||
# Use FPS Target instead of vsync value for Dynamic Resolution max delta
|
||||
@ -13,27 +24,21 @@ MASTER_WRITE:
|
||||
[adrp, x1, 0x1021000],
|
||||
[ldr, s1, [x1, 0xe10]]
|
||||
]
|
||||
# Redirect DR Targets to MAIN+0x1477F00
|
||||
# Redirect DR Targets
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6E3B94
|
||||
instructions: [
|
||||
[adrp, x9, 0x14bf000],
|
||||
[ldr, s1, [x9, 0xf00]]
|
||||
[adrp, x9, $dr_target1],
|
||||
[ldr, s1, [x9, $dr_target1]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x6E3BA4
|
||||
instructions: [
|
||||
[adrp, x9, 0x14bf000],
|
||||
[ldr, s1, [x9, 0xf04]]
|
||||
[adrp, x9, $dr_target2],
|
||||
[ldr, s1, [x9, $dr_target2]]
|
||||
]
|
||||
# Default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x14BFF00
|
||||
value_type: float
|
||||
value: [50, 40]
|
||||
ALL_FPS:
|
||||
# REF: 00 00 F0 42 78 00 00 00 00 00 F0 42 04 00 00 00
|
||||
# FPS Lock
|
||||
@ -68,9 +73,3 @@ ALL_FPS:
|
||||
address: [MAIN, 0x1021E18]
|
||||
value_type: float
|
||||
value: "FPS_TARGET"
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x14BFF00]
|
||||
value_type: float
|
||||
|
||||
value: ["1.5 * FRAMETIME_TARGET", "1.2 * FRAMETIME_TARGET"]
|
||||
|
@ -1,8 +1,6 @@
|
||||
# SONIC GENERATIONS 1.0.1/1.1.0
|
||||
# BID: D91C67509C6AED8D
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# NOP internal FPS Lock
|
||||
# REF: 00 00 23 1E E1 02 27 1E 00 08 21 1E
|
||||
@ -20,11 +18,3 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, w20, 2]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x5226F00]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Warhammer 40,000: Boltgun 1.0.0.7
|
||||
# BID: 3E961285846C72A5
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x63A69F8, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Warhammer 40,000: Boltgun 1.0.0.3
|
||||
# BID: 7C992B6A003C599F
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x710C9C8, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Warhammer 40,000: Boltgun 1.0.0.6
|
||||
# BID: B8630C6EE3A22FE8
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to unlock framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x63A69F8, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
|
@ -2,25 +2,24 @@
|
||||
# BID: E853C44FDF18B88F
|
||||
# Credits to Hazerou for finding offsets for FPS lock and speed
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
evaluate: "0.5 / FPS_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect reading DR GPU time factor to MAIN + 0x4FC0E00
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x470E80
|
||||
instructions: [
|
||||
[adrp, x9, 0x4fc0000],
|
||||
[ldr, s2, [x9, 0xe00]]
|
||||
[adrp, x9, $dr_target],
|
||||
[ldr, s2, [x9, $dr_target]]
|
||||
]
|
||||
# Default value (= 0.5 / FPS)
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x4FC0E00
|
||||
value_type: float
|
||||
value: 0.0166666666
|
||||
ALL_FPS:
|
||||
# Internal Vsync (default value)
|
||||
# Internal Vsync
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x45A7410]
|
||||
@ -32,10 +31,3 @@ ALL_FPS:
|
||||
address: [MAIN, 0x45A71F0]
|
||||
value_type: float
|
||||
value: FPS_TARGET
|
||||
# DR GPU time factor
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x4FC0E00]
|
||||
value_type: float
|
||||
value: "0.5 / FPS_TARGET"
|
||||
|
||||
|
@ -1,29 +1,20 @@
|
||||
# Nights Of Azure 2: Bride of the New Moon 1.0.1
|
||||
# BID: 81DA4F9E1E961CA6
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: code
|
||||
name: tripleBuffer
|
||||
instructions: [
|
||||
[mov, w22, 3],
|
||||
[str, w22, [x1, 8]],
|
||||
[b, 0xa305c0]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Remove double buffer
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x7E4ED8
|
||||
instructions: [
|
||||
[bl, 0xa31900]
|
||||
[bl, _tripleBuffer()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xA31900
|
||||
instructions: [
|
||||
[mov, w22, 3],
|
||||
[str, w22, [x1, 8]],
|
||||
[b, 0xa305c0]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DUMMY
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x13E5400]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
|
||||
|
@ -0,0 +1,10 @@
|
||||
# Tamagotchi Plaza 1.0.4
|
||||
# BID: 1BA8D8FD3897F22F
|
||||
|
||||
ALL_FPS:
|
||||
# UnityEngine.Rendering.OnDemandRendering_TypeInfo
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x683EB68, 0xB8, 0]
|
||||
value_type: int32
|
||||
value: -1
|
@ -2,8 +2,6 @@
|
||||
# BID: 7A450848CFDEC18E
|
||||
# Some prerendered cutscenes are still pushed at 30 FPS
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
MASTER_WRITE:
|
||||
# Block updating DR timings, REF: 00 01 27 1E 48 40 A8 52
|
||||
-
|
||||
@ -40,10 +38,10 @@ ALL_FPS:
|
||||
value: FPS_LOCK_TARGET
|
||||
# Renderer thread delay
|
||||
-
|
||||
type: write
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5704028]
|
||||
value_type: float
|
||||
value: 0.01
|
||||
value: "0.66 / FPS_TARGET"
|
||||
# DR timings
|
||||
-
|
||||
type: evaluate_write
|
||||
|
@ -1,8 +1,19 @@
|
||||
# Sherlock Holmes: Crimes and Punishments 1.0.0
|
||||
# BID: 789C2939A757C0CD
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target1
|
||||
value_type: float
|
||||
default_value: 38
|
||||
evaluate: "1.14 * FRAMETIME_TARGET"
|
||||
-
|
||||
type: variable
|
||||
name: dr_target2
|
||||
value_type: float
|
||||
default_value: 32
|
||||
evaluate: "0.96 * FRAMETIME_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Redirect Dynamic Resolution timings to MAIN + 0x23774F00
|
||||
# 38.0
|
||||
@ -10,24 +21,18 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0xF57294
|
||||
instructions: [
|
||||
[adrp, x9, 0x23774000],
|
||||
[adrp, x9, $dr_target1],
|
||||
[fmul, s0, s0, s1],
|
||||
[ldr, s1, [x9, 0xf00]]
|
||||
[ldr, s1, [x9, $dr_target1]]
|
||||
]
|
||||
# 32.0
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xF572B8
|
||||
instructions: [
|
||||
[ldr, s1, [x9, 0xf04]],
|
||||
[nop]
|
||||
[adrp, x9, $dr_target2],
|
||||
[ldr, s1, [x9, $dr_target2]]
|
||||
]
|
||||
# Default values:
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x23774F00
|
||||
value_type: float
|
||||
value: [38.0, 32.0]
|
||||
ALL_FPS:
|
||||
# UGameEngine::GetMaxTickRate()
|
||||
# Bool Lock FPS
|
||||
@ -36,9 +41,3 @@ ALL_FPS:
|
||||
address: [MAIN, 0x2E61108]
|
||||
value_type: uint8
|
||||
value: 0
|
||||
# Dynamic Resolution
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x23774F00]
|
||||
value_type: float
|
||||
value: ["(38.0 / (1000/30)) * FRAMETIME_TARGET", "(32.0 / (1000/30)) * FRAMETIME_TARGET"]
|
||||
|
@ -2,30 +2,23 @@
|
||||
# BID: 824B38A25986B2AB
|
||||
# Scenes exclusively 2D are tied to framerate, so at 60 FPS they are 2x faster.
|
||||
|
||||
unsafeCheck: true
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_scale
|
||||
value_type: float
|
||||
default_value: 1
|
||||
evaluate: "FPS_TARGET / 30"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Patch code to multiply last frametime by float scale factor stored in MAIN+0x3B4D800
|
||||
# Patch code to multiply last frametime by float scale factor
|
||||
# To match it to Dynamic Resolution calculations
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xB40638
|
||||
instructions: [
|
||||
[adrp, x9, 0x3b4d000],
|
||||
[ldr, s0, [x9, 0x800]],
|
||||
[adrp, x9, $dr_scale],
|
||||
[ldr, s0, [x9, $dr_scale]],
|
||||
[fmul, s9, s8, s0],
|
||||
[nop]
|
||||
]
|
||||
# Write default dynamic resolution timing factor
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x3B4D800
|
||||
value_type: float
|
||||
value: 1
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x3B4D800]
|
||||
value_type: float
|
||||
value: "FPS_TARGET / 30"
|
||||
|
||||
|
@ -2,17 +2,23 @@
|
||||
# BID: 2B59D6C677258A2A
|
||||
# Scenes exclusively 2D are tied to framerate, so at 60 FPS they are 2x faster.
|
||||
|
||||
unsafeCheck: true
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_scale
|
||||
value_type: float
|
||||
default_value: 1
|
||||
evaluate: "FPS_TARGET / 30"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Patch code to multiply last frametime by float scale factor stored in MAIN+0x4276B00
|
||||
# Patch code to multiply last frametime by float scale factor
|
||||
# To match it to Dynamic Resolution calculations
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xBDBE44
|
||||
instructions: [
|
||||
[adrp, x8, 0x4276000],
|
||||
[ldr, s0, [x8, 0xb00]]
|
||||
[adrp, x8, $dr_scale],
|
||||
[ldr, s0, [x8, $dr_scale]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
@ -21,16 +27,3 @@ MASTER_WRITE:
|
||||
[fmul, s0, s8, s0],
|
||||
[nop]
|
||||
]
|
||||
# Write default dynamic resolution timing factor
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x4276B00
|
||||
value_type: float
|
||||
value: 1
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x4276B00]
|
||||
value_type: float
|
||||
value: "FPS_TARGET / 30"
|
||||
|
||||
|
@ -2,28 +2,20 @@
|
||||
# BID: 0AE4D1770B196094
|
||||
# Scenes exclusively 2D are tied to framerate, so at 60 FPS they are 2x faster.
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_scale
|
||||
value_type: float
|
||||
default_value: 1000
|
||||
evaluate: "30000 / FPS_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Patch code to divide last frametime by float scale factor stored in MAIN+0x4422800
|
||||
# Patch code to divide last frametime by float scale factor
|
||||
# To match it to Dynamic Resolution calculations
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xAD51A0
|
||||
instructions: [
|
||||
[adrp, x8, 0x4422000],
|
||||
[ldr, s1, [x8, 0x800]]
|
||||
[adrp, x8, $dr_scale],
|
||||
[ldr, s1, [x8, $dr_scale]]
|
||||
]
|
||||
# Write default dynamic resolution timing factor
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x4422800
|
||||
value_type: float
|
||||
value: 1000
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x4422800]
|
||||
value_type: float
|
||||
value: "(FPS_TARGET / 30) * 1000"
|
||||
|
||||
|
@ -3,8 +3,13 @@
|
||||
# Some things are still tied to framerate, but nothing game breaking it seems.
|
||||
# Game is using double buffer, trying to enable triple buffer results in crash.
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.0333333333
|
||||
evaluate: "1/FPS_TARGET"
|
||||
MASTER_WRITE:
|
||||
# Swap 30 FPS target with 60
|
||||
-
|
||||
@ -51,21 +56,15 @@ MASTER_WRITE:
|
||||
instructions: [
|
||||
[mov, w21, 2]
|
||||
]
|
||||
# Redirect DR timing target to MAIN + 0x1C5DF00
|
||||
# Redirect DR timing target
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0xA38B18
|
||||
instructions: [
|
||||
[adrp, x1, 0x1c5d000],
|
||||
[ldr, s0, [x1, 0xf00]]
|
||||
[adrp, x1, $dr_target],
|
||||
[ldr, s0, [x1, $dr_target]]
|
||||
]
|
||||
ALL_FPS:
|
||||
# DR timing = 1/FPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1C5DF00]
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
# vsync target
|
||||
-
|
||||
type: evaluate_write
|
||||
@ -73,3 +72,4 @@ ALL_FPS:
|
||||
value_type: uint32
|
||||
value: "VSYNC_TARGET - 1"
|
||||
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Labirynth Of The Demon King 1.81
|
||||
# BID: DE26B43C3D21B3A3
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x59ED248, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
# t.MaxFPS
|
||||
|
@ -1,87 +1,74 @@
|
||||
# Gear.Club Unlimited 2 1.7.2
|
||||
# BID: FE757B10B45C3444
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: vsync_target
|
||||
value_type: uint32
|
||||
default_value: 2
|
||||
evaluate: VSYNC_TARGET
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 33
|
||||
evaluate: "1.1 * FPS_TARGET"
|
||||
-
|
||||
type: code
|
||||
name: getVsyncTarget
|
||||
instructions: [
|
||||
[adrp, x1, $vsync_target],
|
||||
[ldr, w1, [x1, $vsync_target]],
|
||||
[mov, w19, w1],
|
||||
[ret]
|
||||
]
|
||||
-
|
||||
type: code
|
||||
name: getDrTarget
|
||||
instructions: [
|
||||
[adrp, x0, $dr_target],
|
||||
[ldr, s0, [x0, $dr_target]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Edit Eden.Graphics.IGraphicsQualityProfile::set_VSyncCount to get interval from MAIN + 0x5FBAF20
|
||||
# Edit Eden.Graphics.IGraphicsQualityProfile::set_VSyncCount
|
||||
# If not edited, light is flickering at > 30 FPS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x14B4990
|
||||
instructions: [
|
||||
[adrp, x1, 0x5fba000],
|
||||
[ldr, w1, [x1, 0xf20]],
|
||||
[adrp, x1, $vsync_target],
|
||||
[ldr, w1, [x1, $vsync_target]],
|
||||
[str, w1, [x0, 0x54]],
|
||||
[ret]
|
||||
]
|
||||
# Edit UnityEngine.QualitySettings::set_vSyncCount to get interval from MAIN + 0x5FBAF20
|
||||
# Edit UnityEngine.QualitySettings::set_vSyncCount
|
||||
# If not edited, light is flickering at > 30 FPS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x1B46EE4
|
||||
instructions: [
|
||||
[adrp, x0, 0x5fba000],
|
||||
[ldr, w0, [x0, 0xf20]],
|
||||
[adrp, x0, $vsync_target],
|
||||
[ldr, w0, [x0, $vsync_target]],
|
||||
[ldp, x29, x30, [sp, 0x20]],
|
||||
[ldp, x20, x19, [sp, 0x10]],
|
||||
[add, sp, sp, 0x30],
|
||||
[br, x1]
|
||||
]
|
||||
# Edit Eden.Graphics.GraphicsQualityManager::SetTargetFrameRate to get interval from MAIN + 0x5FBAF20
|
||||
# Edit Eden.Graphics.GraphicsQualityManager::SetTargetFrameRate
|
||||
# If not edited, it locks to 30 FPS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x14AB578
|
||||
instructions: [
|
||||
[bl, 0x3445ce8]
|
||||
[bl, _getVsyncTarget()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x3445CE8
|
||||
instructions: [
|
||||
[adrp, x1, 0x5fba000],
|
||||
[ldr, w1, [x1, 0xf20]],
|
||||
[mov, w19, w1],
|
||||
[ret]
|
||||
]
|
||||
# Edit Eden.Graphics.DynamicResolutionScaler::UpdateScaling to get DR target timing from MAIN + 0x5FBAF28
|
||||
# Edit Eden.Graphics.DynamicResolutionScaler::UpdateScaling
|
||||
# If not edited, performance is much worse at > 30 FPS
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x14988BC
|
||||
instructions: [
|
||||
[bl, 0x3445cf8]
|
||||
[bl, _getDrTarget()]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x3445CF8
|
||||
instructions: [
|
||||
[adrp, x0, 0x5fba000],
|
||||
[ldr, s0, [x0, 0xf28]],
|
||||
[ret]
|
||||
]
|
||||
# Default values
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x5FBAF20
|
||||
value_type: uint32
|
||||
value: 2
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x5FBAF28
|
||||
value_type: float
|
||||
value: 33
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5FBAF20]
|
||||
value_type: uint32
|
||||
value: VSYNC_TARGET
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x5FBAF28]
|
||||
value_type: float
|
||||
value: "1.1 * FPS_TARGET"
|
||||
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# F1 Manager 2024 1.4
|
||||
# BID: 42350FCC758887D1
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# F1 Manager 2024 1.8
|
||||
# BID: 53C0F2107412F0E2
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# F1 Manager 2024 1.3
|
||||
# BID: 645C3BE90D4ED3D5
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# F1 Manager 2024 1.7
|
||||
# BID: A245DABD986CBC85
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,8 +1,6 @@
|
||||
# F1 Manager 2024 1.5
|
||||
# BID: CA23556FE5EF2EB1
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,7 +1,13 @@
|
||||
# Amber Isle 1.0.3
|
||||
# BID: E8BF195297B63BA2
|
||||
|
||||
unsafeCheck: true
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: double
|
||||
default_value: 25.333333333333336
|
||||
evaluate: "FRAMETIME_TARGET * 0.76"
|
||||
|
||||
MASTER_WRITE:
|
||||
# Redirect all hardcoded doubles in DynamicResolutionHandler::Update to MAIN+0x909EF00
|
||||
@ -10,48 +16,37 @@ MASTER_WRITE:
|
||||
type: asm_a64
|
||||
main_offset: 0x21FE1E4
|
||||
instructions: [
|
||||
[adrp, x8, 0x909e000],
|
||||
[ldr, d0, [x8, 0xf00]]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, d0, [x8, $dr_target]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x21FE3E0
|
||||
instructions: [
|
||||
[adrp, x8, 0x909e000],
|
||||
[ldr, d1, [x8, 0xf00]]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, d1, [x8, $dr_target]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x21FE43C
|
||||
instructions: [
|
||||
[adrp, x8, 0x909e000],
|
||||
[ldr, d1, [x8, 0xf00]]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, d1, [x8, $dr_target]]
|
||||
]
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x21FE7D4
|
||||
instructions: [
|
||||
[adrp, x8, 0x909e000],
|
||||
[ldr, d0, [x8, 0xf00]]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, d0, [x8, $dr_target]]
|
||||
]
|
||||
## REF: c8 aa 8a f2 28 07 f8 f2
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x21fE550
|
||||
instructions: [
|
||||
[adrp, x8, 0x909e000],
|
||||
[ldr, d0, [x8, 0xf00]],
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, d0, [x8, $dr_target]],
|
||||
[fneg, d0, d0]
|
||||
]
|
||||
# default value
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x909EF00
|
||||
value_type: double
|
||||
value: 25.333333333333336
|
||||
ALL_FPS:
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x909EF00]
|
||||
value_type: double
|
||||
value: "FRAMETIME_TARGET * 0.76"
|
||||
|
||||
|
@ -1,8 +1,6 @@
|
||||
# The Smurfs 2: The Prisoner of the Green Stone 1.03.03
|
||||
# The Smurfs 2: The Prisoner of the Green Stone 1.03.03/1.04
|
||||
# BID: F294A4EBE966E8A9
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# r.DynamicRes.FrameTimeBudget (1000/FPS) cutted to 2 decimals
|
||||
-
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Redemption Reapers 1.4.0
|
||||
# BID: 955DF07AA5F4497B
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate to untie game speed from framerate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x751C478, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
# Default is 0x47, bUseFixedFrameRate |= 0x40
|
||||
# By writing 7 we are making sure that other flags are maintained:
|
||||
@ -30,3 +29,4 @@ ALL_FPS:
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
|
||||
|
@ -1,41 +1,42 @@
|
||||
# Xenoblade Chronicles 3 2.2.0/2.2.1
|
||||
# BID: 82D187FE9EF9BE92
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
DECLARATIONS:
|
||||
-
|
||||
type: variable
|
||||
name: dr_target
|
||||
value_type: float
|
||||
default_value: 0.0166666666
|
||||
evaluate: "(1 / FPS_TARGET) / VSYNC_TARGET"
|
||||
-
|
||||
type: const
|
||||
name: default_frametime
|
||||
value: 0x3d088889
|
||||
-
|
||||
type: code
|
||||
name: etherFix
|
||||
instructions: [
|
||||
[ldr, x21, [x0]],
|
||||
[mov, w8, $default_frametime],
|
||||
[movk, w8, $default_frametime, 16],
|
||||
[str, w8, [x21, 0x214]],
|
||||
[ret]
|
||||
]
|
||||
MASTER_WRITE:
|
||||
# Redirect DR frametime target reading to .bss code cave [MAIN, 0x236AB00]
|
||||
# Redirect DR frametime target reading
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x124F518
|
||||
instructions: [
|
||||
[adrp, x8, 0x236a000],
|
||||
[ldr, s0, [x8, 0xb00]]
|
||||
[adrp, x8, $dr_target],
|
||||
[ldr, s0, [x8, $dr_target]]
|
||||
]
|
||||
# Original DR frametime target
|
||||
-
|
||||
type: bytes
|
||||
main_offset: 0x236AB00
|
||||
value_type: float
|
||||
value:
|
||||
- 0.0166666666
|
||||
# Fix crash when gathering big amount of ether for > 30 FPS
|
||||
- # Code cave at 0x1295DA0
|
||||
-
|
||||
type: asm_a64
|
||||
main_offset: 0x67360
|
||||
instructions: [
|
||||
[bl, 0x1295da0]
|
||||
]
|
||||
- # Push fixed 1/30 float to game speed pointer late enough to not affect it
|
||||
type: asm_a64
|
||||
main_offset: 0x1295DA0
|
||||
instructions: [
|
||||
[ldr, x21, [x0]],
|
||||
[fmov, s1, 1.0],
|
||||
[fmov, s2, 30.0],
|
||||
[fdiv, s1, s1, s2],
|
||||
[str, s1, [x21, 0x214]],
|
||||
[ret]
|
||||
[bl, _etherFix()]
|
||||
]
|
||||
ALL_FPS:
|
||||
# vsync
|
||||
@ -44,16 +45,11 @@ ALL_FPS:
|
||||
address: [MAIN, 0x1B42DB0]
|
||||
value_type: int32
|
||||
value: [VSYNC_TARGET, VSYNC_TARGET]
|
||||
# DR Timing (relative to vsync)
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x236AB00]
|
||||
value_type: float
|
||||
value: "((1 / FPS_TARGET) / VSYNC_TARGET) * 0.78"
|
||||
# UI speed
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0x1BA1A90, 128]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: "1 / FPS_TARGET"
|
||||
-
|
||||
@ -66,30 +62,28 @@ ALL_FPS:
|
||||
value_type: int32
|
||||
value: [2, 2]
|
||||
-
|
||||
type: evaluate_compare
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x1BA1A98]
|
||||
compare_type: "!="
|
||||
compare_value_type: int8
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x236AB00]
|
||||
value_type: float
|
||||
value: "((1 / 30) / 2) * 0.78"
|
||||
-
|
||||
type: evaluate_compare
|
||||
compare_address: [MAIN, 0x1BA1A98]
|
||||
compare_type: "!="
|
||||
compare_value_type: int8
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x1BA1A90, 128]
|
||||
value_type: float
|
||||
value: "1 / 30"
|
||||
address: [VARIABLE, dr_target]
|
||||
value: 0.0166666666
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x1BA1A98]
|
||||
compare_type: "!="
|
||||
compare_value_type: int8
|
||||
compare_value: 0
|
||||
address: [MAIN, 0x1BA1A90, 128]
|
||||
address_unsafe: true
|
||||
value_type: float
|
||||
value: 0.0333333333
|
||||
-
|
||||
type: compare
|
||||
compare_address: [MAIN, 0x1BA1A98]
|
||||
compare_type: "!="
|
||||
compare_value_type: int8
|
||||
compare_value: 0
|
||||
address: [MAIN]
|
||||
value_type: refresh_rate
|
||||
value: 30
|
||||
|
||||
|
@ -1,13 +1,12 @@
|
||||
# Stray 1.6.0
|
||||
# BID: 109D974E180A5AA1
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable bUseFixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x5DC7368, 0x7A4]
|
||||
address_unsafe: true
|
||||
value_type: int32
|
||||
value: 7
|
||||
# r.VSync
|
||||
|
@ -1,8 +1,6 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 1.4.0
|
||||
# BID: 061A7341077C0974
|
||||
|
||||
unsafeCheck: true
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
@ -18,4 +16,4 @@ ALL_FPS:
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
||||
what: timing
|
||||
|
@ -1,13 +1,12 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 1.2.1
|
||||
# BID: 66BC954F5323014C
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xACC63E0, 0xAA4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
# t.MaxFPS
|
||||
|
@ -0,0 +1,19 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 1.5.0
|
||||
# BID: 74BCAC96835DB9AE
|
||||
|
||||
ALL_FPS:
|
||||
# t.MaxFPS
|
||||
-
|
||||
type: evaluate_write
|
||||
address: [MAIN, 0xAE6F938, 0]
|
||||
value_type: float
|
||||
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
|
||||
# r.VSync
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0x9E4F728, 0]
|
||||
value_type: uint32
|
||||
value: [0, 0]
|
||||
-
|
||||
type: block
|
||||
what: timing
|
@ -1,13 +1,12 @@
|
||||
# FANTASY LIFE i: The Girl Who Steals Time 1.3.0
|
||||
# BID: 9DBA6AA32721CAB9
|
||||
|
||||
unsafeCheck: false
|
||||
|
||||
ALL_FPS:
|
||||
# Disable FixedFrameRate
|
||||
-
|
||||
type: write
|
||||
address: [MAIN, 0xACF23E0, 0xAA4]
|
||||
address_unsafe: true
|
||||
value_type: uint32
|
||||
value: 7
|
||||
# t.MaxFPS
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user