Autogeneration of static FPS mods + Rajkosto's mod_onearg() in build.sh

This commit is contained in:
epigramx 2018-02-08 10:49:59 +02:00
parent 17e430f912
commit fff4410dd2
12 changed files with 65 additions and 296 deletions

View File

@ -1,15 +0,0 @@
This is based on an extreme simplification of the fps++ mod by Xalphenos; it
drops dynamic FPS to get back stability. The Rajkosto "best fence" method is
also included for performance and stability. It improves over the previous
static fps mod because it allows ANY value as a static fps target and it
also includes the stamina fix.
To use it simply grab one of the uploaded versions or edit one with these
changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use
the result of that calculation and the target fps in patches.txt.
Disclaimer: this is different from the static FPS mod ported recently. The main
advantage of this one is that it allows ANY static FPS instead of only 60, 30,
20.. and it also includes the stamina fix.
epigramx

View File

@ -1,7 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = "The Legend of Zelda: Breath of the Wild - static 30FPS mod"
version = 2
[Control]
vsyncFrequency = 30

View File

@ -1,108 +0,0 @@
[BotwFPSV208] #i.e. v1.5.0
moduleMatches = 0x6267BFD0
#Cave
codeCaveSize = 0x1C
_multiplier = 0x0 # edit the next line to change the multiplier
0x00000000 = .float 0.66667 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_targetfps = 0x18 # edit the next line to change the target fps
0x18 = .float 45
#"Best fence" by Rajkosto
_fenceNeg1 = 0x00000004
0x00000004 = add r6, r12, r0 #orig instruction we are replacing
0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water)
0x0000000C = blt .+0x08 #skip subtract if less than
0x00000010 = subi r6, r6, 1 #do the subtract
0x00000014 = blr #return
#Extreme simplification of FPS++ by Xalphenos
#codeChanges
0x031FA97C = nop
0x03793328 = nop
0x03793334 = nop
0x03793378 = lis r29, _multiplier@ha
0x03793380 = lfs f0, _multiplier@L(r29)
0x0379338C = nop
0x03415C1C = lis r12, _multiplier@ha
0x03415C24 = lfs f0, _multiplier@l(r12)
0x03415C2C = nop
0x02D90D2C = lis r10, _targetfps@ha
0x02D90D30 = lfs f11, _targetfps@l(r10)
0x02D90D88 = lis r10, _targetfps@ha
0x02D90D8C = lfs f11, _targetfps@l(r10)
#Break all forms of frame limiting
0x031FAAFC = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead)
#0x031FAAE8 = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead)
#0x031FAB00 = nop #skip fence (no waiting on GPU)
0x031FACD0 = nop #disable vsync
0x031FACF4 = nop #disable vsync loop
#Additional vsync dropping
0x0309D030 = nop #disable vsync
0x0309D054 = nop #disable vsync loop
#For testing, the original static mod lines (commented out by default):
#0x031FB0C0 = li r0, 1
#0x031FB104 = li r0, 1
#Cheats
#0x02D90CC0 = fmr f29, f1 #inf stamina
#0x02D452A4 = nop #inf hearts
#0x02EB6758 = nop #inf arrows
[BotwFPSv176V192] #i.e. v1.4.0 and v1.4.1
moduleMatches = 0xFD091F9F,0xD472D8A5
#Cave
codeCaveSize = 0x1C
_multiplier = 0x0 # edit the next line to change the multiplier
0x00000000 = .float 0.66667 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_targetfps = 0x18 # edit the next line to change the target fps
0x18 = .float 45
#"Best fence" by Rajkosto
_fenceNeg1 = 0x00000004
0x00000004 = add r6, r12, r0 #orig instruction we are replacing
0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water)
0x0000000C = blt .+0x08 #skip subtract if less than
0x00000010 = subi r6, r6, 1 #do the subtract
0x00000014 = blr #return
#Extreme simplification of FPS++ by Xalphenos
#codeChanges
0x031F9E80 = nop
0x03792620 = nop
0x0379262C = nop
0x03792670 = lis r29, _multiplier@ha
0x03792678 = lfs f0, _multiplier@L(r29)
0x03792684 = nop
0x03414EF8 = lis r12, _multiplier@ha
0x03414F00 = lfs f0, _multiplier@l(r12)
0x03414F08 = nop
0x02D90790 = lis r10, _targetfps@ha
0x02D90794 = lfs f11, _targetfps@l(r10)
0x02D907EC = lis r10, _targetfps@ha
0x02D907F0 = lfs f11, _targetfps@l(r10)
#Break all forms of frame limiting
0x031FA000 = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead)
#0x031F9FEC = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead)
#0x031FA004 = nop #skip fence (no waiting on GPU)
0x031FA1D4 = nop #disable vsync
0x031FA1F8 = nop #disable vsync loop
#Additional vsync dropping
0x0309C9A4 = nop #disable vsync
0x0309C9C8 = nop #disable vsync loop
#For testing, the original static mod lines (commented out by default):
#0x031FA5C4 = li r0, 1
#0x031FA608 = li r0, 1
#Cheats
#0x02D90724 = fmr f29, f1 #inf stamina
#0x02D44D44 = nop #inf hearts
#0x02EB61BC = nop #inf arrows

View File

@ -1,15 +0,0 @@
This is based on an extreme simplification of the fps++ mod by Xalphenos; it
drops dynamic FPS to get back stability. The Rajkosto "best fence" method is
also included for performance and stability. It improves over the previous
static fps mod because it allows ANY value as a static fps target and it
also includes the stamina fix.
To use it simply grab one of the uploaded versions or edit one with these
changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use
the result of that calculation and the target fps in patches.txt.
Disclaimer: this is different from the static FPS mod ported recently. The main
advantage of this one is that it allows ANY static FPS instead of only 60, 30,
20.. and it also includes the stamina fix.
epigramx

View File

@ -1,7 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = "The Legend of Zelda: Breath of the Wild - static 45FPS mod"
version = 2
[Control]
vsyncFrequency = 45

View File

@ -1,108 +0,0 @@
[BotwFPSV208] #i.e. v1.5.0
moduleMatches = 0x6267BFD0
#Cave
codeCaveSize = 0x1C
_multiplier = 0x0 # edit the next line to change the multiplier
0x00000000 = .float 0.5 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_targetfps = 0x18 # edit the next line to change the target fps
0x18 = .float 60
#"Best fence" by Rajkosto
_fenceNeg1 = 0x00000004
0x00000004 = add r6, r12, r0 #orig instruction we are replacing
0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water)
0x0000000C = blt .+0x08 #skip subtract if less than
0x00000010 = subi r6, r6, 1 #do the subtract
0x00000014 = blr #return
#Extreme simplification of FPS++ by Xalphenos
#codeChanges
0x031FA97C = nop
0x03793328 = nop
0x03793334 = nop
0x03793378 = lis r29, _multiplier@ha
0x03793380 = lfs f0, _multiplier@L(r29)
0x0379338C = nop
0x03415C1C = lis r12, _multiplier@ha
0x03415C24 = lfs f0, _multiplier@l(r12)
0x03415C2C = nop
0x02D90D2C = lis r10, _targetfps@ha
0x02D90D30 = lfs f11, _targetfps@l(r10)
0x02D90D88 = lis r10, _targetfps@ha
0x02D90D8C = lfs f11, _targetfps@l(r10)
#Break all forms of frame limiting
0x031FAAFC = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead)
#0x031FAAE8 = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead)
#0x031FAB00 = nop #skip fence (no waiting on GPU)
0x031FACD0 = nop #disable vsync
0x031FACF4 = nop #disable vsync loop
#Additional vsync dropping
0x0309D030 = nop #disable vsync
0x0309D054 = nop #disable vsync loop
#For testing, the original static mod lines (commented out by default):
#0x031FB0C0 = li r0, 1
#0x031FB104 = li r0, 1
#Cheats
#0x02D90CC0 = fmr f29, f1 #inf stamina
#0x02D452A4 = nop #inf hearts
#0x02EB6758 = nop #inf arrows
[BotwFPSv176V192] #i.e. v1.4.0 and v1.4.1
moduleMatches = 0xFD091F9F,0xD472D8A5
#Cave
codeCaveSize = 0x1C
_multiplier = 0x0 # edit the next line to change the multiplier
0x00000000 = .float 0.5 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_targetfps = 0x18 # edit the next line to change the target fps
0x18 = .float 60
#"Best fence" by Rajkosto
_fenceNeg1 = 0x00000004
0x00000004 = add r6, r12, r0 #orig instruction we are replacing
0x00000008 = cmpwi r6, 500 #check if less than 500 (full sync on those first frames to prevent milk water)
0x0000000C = blt .+0x08 #skip subtract if less than
0x00000010 = subi r6, r6, 1 #do the subtract
0x00000014 = blr #return
#Extreme simplification of FPS++ by Xalphenos
#codeChanges
0x031F9E80 = nop
0x03792620 = nop
0x0379262C = nop
0x03792670 = lis r29, _multiplier@ha
0x03792678 = lfs f0, _multiplier@L(r29)
0x03792684 = nop
0x03414EF8 = lis r12, _multiplier@ha
0x03414F00 = lfs f0, _multiplier@l(r12)
0x03414F08 = nop
0x02D90790 = lis r10, _targetfps@ha
0x02D90794 = lfs f11, _targetfps@l(r10)
0x02D907EC = lis r10, _targetfps@ha
0x02D907F0 = lfs f11, _targetfps@l(r10)
#Break all forms of frame limiting
0x031FA000 = bla _fenceNeg1 #Best fence (make sure GPU is never more than 1 frame ahead)
#0x031F9FEC = li r0, 1 #Better fence (make sure GPU is never more than 1 second? ahead)
#0x031FA004 = nop #skip fence (no waiting on GPU)
0x031FA1D4 = nop #disable vsync
0x031FA1F8 = nop #disable vsync loop
#Additional vsync dropping
0x0309C9A4 = nop #disable vsync
0x0309C9C8 = nop #disable vsync loop
#For testing, the original static mod lines (commented out by default):
#0x031FA5C4 = li r0, 1
#0x031FA608 = li r0, 1
#Cheats
#0x02D90724 = fmr f29, f1 #inf stamina
#0x02D44D44 = nop #inf hearts
#0x02EB61BC = nop #inf arrows

View File

@ -1,15 +0,0 @@
This is based on an extreme simplification of the fps++ mod by Xalphenos; it
drops dynamic FPS to get back stability. The Rajkosto "best fence" method is
also included for performance and stability. It improves over the previous
static fps mod because it allows ANY value as a static fps target and it
also includes the stamina fix.
To use it simply grab one of the uploaded versions or edit one with these
changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use
the result of that calculation and the target fps in patches.txt.
Disclaimer: this is different from the static FPS mod ported recently. The main
advantage of this one is that it allows ANY static FPS instead of only 60, 30,
20.. and it also includes the stamina fix.
epigramx

View File

@ -1,7 +0,0 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = "The Legend of Zelda: Breath of the Wild - static 60FPS mod"
version = 2
[Control]
vsyncFrequency = 60

View File

@ -1,12 +1,17 @@
<?php
$targetfps = $argv[1];
$divisor = 30/$targetfps
?>
[BotwFPSV208] #i.e. v1.5.0
moduleMatches = 0x6267BFD0
#Cave
codeCaveSize = 0x1C
_multiplier = 0x0 # edit the next line to change the multiplier
0x00000000 = .float 1.00 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_divisor = 0x0 # edit the next line to change the divisor
0x00000000 = .float <?=$divisor?> # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_targetfps = 0x18 # edit the next line to change the target fps
0x18 = .float 30
0x18 = .float <?=$targetfps?>
#"Best fence" by Rajkosto
_fenceNeg1 = 0x00000004
@ -21,11 +26,11 @@ _fenceNeg1 = 0x00000004
0x031FA97C = nop
0x03793328 = nop
0x03793334 = nop
0x03793378 = lis r29, _multiplier@ha
0x03793380 = lfs f0, _multiplier@L(r29)
0x03793378 = lis r29, _divisor@ha
0x03793380 = lfs f0, _divisor@L(r29)
0x0379338C = nop
0x03415C1C = lis r12, _multiplier@ha
0x03415C24 = lfs f0, _multiplier@l(r12)
0x03415C1C = lis r12, _divisor@ha
0x03415C24 = lfs f0, _divisor@l(r12)
0x03415C2C = nop
0x02D90D2C = lis r10, _targetfps@ha
0x02D90D30 = lfs f11, _targetfps@l(r10)
@ -57,10 +62,11 @@ moduleMatches = 0xFD091F9F,0xD472D8A5
#Cave
codeCaveSize = 0x1C
_multiplier = 0x0 # edit the next line to change the multiplier
0x00000000 = .float 1.00 # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_divisor = 0x0 # edit the next line to change the divisor
0x00000000 = .float <?=$divisor?> # = 30FPS / TARGET FPS, e.g. 30FPS / 18FPS = 1.66667
_targetfps = 0x18 # edit the next line to change the target fps
0x18 = .float 30
0x18 = .float <?=$targetfps?>
#"Best fence" by Rajkosto
_fenceNeg1 = 0x00000004
@ -75,11 +81,11 @@ _fenceNeg1 = 0x00000004
0x031F9E80 = nop
0x03792620 = nop
0x0379262C = nop
0x03792670 = lis r29, _multiplier@ha
0x03792678 = lfs f0, _multiplier@L(r29)
0x03792670 = lis r29, _divisor@ha
0x03792678 = lfs f0, _divisor@L(r29)
0x03792684 = nop
0x03414EF8 = lis r12, _multiplier@ha
0x03414F00 = lfs f0, _multiplier@l(r12)
0x03414EF8 = lis r12, _divisor@ha
0x03414F00 = lfs f0, _divisor@l(r12)
0x03414F08 = nop
0x02D90790 = lis r10, _targetfps@ha
0x02D90794 = lfs f11, _targetfps@l(r10)

View File

@ -0,0 +1,18 @@
This is based on an extreme simplification of the fps++ mod by Xalphenos; it
drops dynamic FPS to prevent graphics judder. The Rajkosto "best fence" method
is also included for performance and stability. Judder was easily noticeable
when Link paraglides; the caveat is that the user must pick a target FPS that
they can maintain.
It improves over previous static mods in that it allows ANY value as a
static fps target and it includes the stamina fix.
To use it simply grab one of the provided versions or edit one with these
changes: a) rules.txt frequency and name b) divide 30 by the target FPS c) use
the result of that calculation and the target fps in patches.txt.
This readme was derived from a static <?=$argv[1] ?>FPS mod. Additional FPS targets
and discussion are at https://forum.cemu.info/showthread.php/421. If you do
know how to use build.sh at Slashie's repo, it supports arbitrary targets.
epigramx

View File

@ -0,0 +1,7 @@
[Definition]
titleIds = 00050000101C9300,00050000101C9400,00050000101C9500
name = "The Legend of Zelda: Breath of the Wild - static <?=$argv[1] ?>FPS mod"
version = 2
[Control]
vsyncFrequency = <?=$argv[1] ?>

View File

@ -108,6 +108,23 @@ std_respack () {
done
}
mod_onearg () {
params=( "$@" )
subparams=( "${params[@]:1}" )
mod_folder="${params[0]}"
echo -e "${GREEN}[Building] ${BCYAN}$mod_folder ${NC}with arguments: ${subparams[@]}"
for arrg in "${subparams[@]}"
do
inFolder="Source/$mod_folder"
outFolder="Modifications/${mod_folder}_${arrg}"
#echo "${arrg} inFolder: $inFolder outFolder: $outFolder"
build_dir "$inFolder" "$outFolder" "$arrg"
done
}
res16by9=( "360p" "480p" "540p" "720p" "900p" "1080p" "1440p" "1800p" "2160p" "2880p" "4320p" "5760p" )
res21by9=( "540p219" "720p219" "900p219" "1080p219" "1440p219" "1800p219" "2160p219" "2880p219" "4320p219" "5760p219" )
res48by9=( "360p489" "480p489" "540p489" "720p489" "900p489" "1080p489" "1440p489" "1800p489" "2160p489" "2880p489" "4320p489" "5760p489" )
@ -196,4 +213,7 @@ std_respack "WipeoutCreate" "${res16by9[@]/$just720p}"
std_respack "Wonderful101" "${res16by9[@]/$just720p}"
std_respack "WoollyWorld" "${res16by9[@]/$just720p}" "${res21by9[@]}" "${res48by9[@]}"
std_respack "XenobladeX" "${res16by9[@]/$just720p}" "${res21by9[@]}" "${res48by9[@]}"
mod_onearg "BreathOfTheWild_StaticFPS" 30 45 60
echo -e "${NC}"