Ultra 2.7|R2

This commit is contained in:
redraz 2025-12-09 08:14:28 +03:00
parent 164babb735
commit a7853bf3ac
61 changed files with 565 additions and 143 deletions

View File

@ -8,7 +8,7 @@
### Ultra - это функциональная кастомная прошивка для Nintendo Switch, с упором в разгон и улучшенный пользовательский опыт.
### [UltraNX 2.7|R1](https://github.com/Ultra-NX/UltraNX/releases/tag/2.7-R1) Поддерживает все HOS до 21.0.1 включительно
### [UltraNX 2.7|R2](https://github.com/Ultra-NX/UltraNX/releases/tag/2.7-R2) Поддерживает все HOS до 21.1.0 включительно (21.1.0 в Safe Mode)

View File

@ -6,7 +6,7 @@
#
### Ultra is a functional custom firmware for Nintendo Switch, with a focus on overclocking and an improved user experience.
### [UltraNX 2.7|R1](https://github.com/Ultra-NX/UltraNX/releases/tag/2.7-R1) Supports all HOS up to and including 21.0.1
### [UltraNX 2.7|R2](https://github.com/Ultra-NX/UltraNX/releases/tag/2.7-R2) Supports all HOS up to and including 21.1.0 (21.1.0 in Safe Mode)

View File

@ -0,0 +1,16 @@
# Lumo 2 1.0.0.0
# BID: 5C2942CCDF0AA6EA
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x6BB0EE8, 0]
value_type: uint32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x7BC68D0, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]

View File

@ -0,0 +1,10 @@
# Beholder 2 1.0.3
# BID: 5D3FE9C0FAA44B4C
ALL_FPS:
# UnityEngine.Time::fixedDeltaTime
-
type: evaluate_write
address: [MAIN, 0x4275238, 0x48]
value_type: float
value: "1 / FPS_TARGET"

View File

@ -0,0 +1,19 @@
# PROGRESS ORDERS 1.0.3
# BID: 33E7D684796F363B
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x7B26958, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x8B1E280, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,19 @@
# 옥토패스 트래블러 0 1.0.2
# BID: 6070FC72448EE560
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x6C5C6E8, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x7C7E8E0, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,19 @@
# Combat Forces 1.0.0
# BID: 81C9C793B5370E9B
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x604AC78, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x6843A78, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,25 @@
# Anime vs Evil: Apocalypse 1.0
# BID: D2EADA78AA71283E
ALL_FPS:
# r.DynamicRes.FrameTimeBudget
-
type: evaluate_write
address: [MAIN, 0x8DA64D0, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
# r.VSync
-
type: write
address: [MAIN, 0x7DE4978, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x8DE1840, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,19 @@
# World At War: Cobra 1.0.0
# BID: 7DE262BD1732DBFB
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x604AC78, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x6843A78, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,25 @@
# King's Bounty II 1.7
# BID: 5EAF1BB0E2B89AF4
ALL_FPS:
# r.DynamicRes.FrameTimeBudget
-
type: evaluate_write
address: [MAIN, 0x93CF440, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2", "TruncDec(FRAMETIME_TARGET, 2)"]
# r.VSync
-
type: write
address: [MAIN, 0x8874BA0, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x93FB7B0, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -5,7 +5,7 @@ ALL_FPS:
# DynamicResolutionManager_TypeInfo
-
type: evaluate_write
address: [MAIN, 0x84A6F58, 0xB8, 0]
address: [MAIN, 0x84A6F58, 0xB8, 8]
address_unsafe: true
value_type: double
value: [FPS_TARGET, FRAMETIME_TARGET]
value: [FPS_TARGET, FRAMETIME_TARGET]

View File

@ -0,0 +1,40 @@
# Wasteland 2: Director's Cut 1.0.1
# BID: 77009C1234634A4E
DECLARATIONS:
# Dynamic resolution is botched because it relies on whole frame rendering loop time,
# which means we cannot set min to 60 FPS because otherwise it will never get back to higher resolutions
-
type: variable
name: dr_fps_min
value_type: float
default_value: 20
evaluate: "0.9 * FPS_TARGET"
-
type: variable
name: dr_fps_max
value_type: float
default_value: 33
evaluate: "FPS_TARGET"
-
type: code
name: getDrFpsTargetMin
instructions: [
[adrp, x20, $dr_fps_min],
[ldr, s1, [x20, $dr_fps_min]],
[ret]
]
MASTER_WRITE:
-
type: asm_a64
main_offset: 0x36EE98
instructions: [
[bl, _getDrFpsTargetMin()]
]
-
type: asm_a64
main_offset: 0x36EEF4
instructions: [
[adrp, x8, $dr_fps_max],
[ldr, s1, [x8, $dr_fps_max]]
]

View File

@ -0,0 +1,25 @@
# American Arcadia 1.0.3
# BID: 2CE51030AF9800A5
ALL_FPS:
# r.DynamicRes.FrameTimeBudget (default is 34.5)
-
type: evaluate_write
address: [MAIN, 0x76908F0, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
# r.VSync
-
type: write
address: [MAIN, 0x66B5390, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x76BE650, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,19 @@
# Octopath Traveler 0 1.0.2
# BID: FEABC8D141EECCA5
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x6C5A6E8, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x7C7C8E0, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,19 @@
# VARIOUS DAYLIFE 1.0.1
# BID: A2DDF741D0E37D15
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x60D56A0, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x68986B0, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,25 @@
# Wizard of Legend 2 1.1.0b
# BID: F8FA82D6A1BFE328
ALL_FPS:
# r.DynamicRes.FrameTimeBudget
-
type: evaluate_write
address: [MAIN, 0x85D8B28, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
# r.VSync
-
type: write
address: [MAIN, 0x75EE990, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x86132B8, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,25 @@
# Super Street: Racer 1.0.1
# BID: 8E82D24A9B7504FB
ALL_FPS:
# r.DynamicRes.FrameTimeBudget
-
type: evaluate_write
address: [MAIN, 0x6B6E560, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2", "TruncDec(FRAMETIME_TARGET, 2)"]
# r.VSync
-
type: write
address: [MAIN, 0x632F270, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x6B930B8, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,10 @@
# Nice Day for Fishing 1.0.7
# BID: 1A371F609F4B6172
ALL_FPS:
# UnityEngine.Time::fixedDeltaTime
-
type: evaluate_write
address: [MAIN, 0x4D2C6C0, 0x48]
value_type: float
value: "1 / FPS_TARGET"

View File

@ -5,7 +5,7 @@ ALL_FPS:
# DynamicResolutionManager_TypeInfo
-
type: evaluate_write
address: [MAIN, 0x84A6F58, 0xB8, 0]
address: [MAIN, 0x84A6F58, 0xB8, 8]
address_unsafe: true
value_type: double
value: [FPS_TARGET, FRAMETIME_TARGET]
value: [FPS_TARGET, FRAMETIME_TARGET]

View File

@ -0,0 +1,32 @@
# MudRunner - American Wilds Edition 4.5
# BID: 028C5AB881F17582
DECLARATIONS:
-
type: variable
name: dr_gpu_target_max
value_type: float
default_value: 21.5
evaluate: 0.645 * FRAMETIME_TARGET
-
type: variable
name: dr_gpu_target_min
value_type: float
default_value: 19.5
evaluate: (0.645 * FRAMETIME_TARGET) - 2
MASTER_WRITE:
# Redirect DR frametime target
-
type: asm_a64
main_offset: 0xA30A0
instructions: [
[adrp, x9, $dr_gpu_target_max],
[ldr, s1, [x9, $dr_gpu_target_max]]
]
-
type: asm_a64
main_offset: 0xA30D8
instructions: [
[adrp, x9, $dr_gpu_target_min],
[ldr, s1, [x9, $dr_gpu_target_min]]
]

View File

@ -0,0 +1,16 @@
# Hannah 1.0.3
# BID: 07E20F126ABEFF78
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x60CB978, 0]
value_type: uint32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x70C3140, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]

View File

@ -0,0 +1,10 @@
# Fruitbus 1.0.2
# BID: 2E049E21624484CF
ALL_FPS:
# UnityEngine.Time::fixedDeltaTime
-
type: evaluate_write
address: [MAIN, 0x9A7CBF8, 0x48]
value_type: float
value: "1 / FPS_TARGET"

View File

@ -0,0 +1,11 @@
# Risen 1.0.1
# BID: 94EA2A7C7EE32EEF
ALL_FPS:
# Dynamic Resolution factors
# REF: g_GetModuleAdmin<eCGfxAdmin>(void)::s_pAdmin + 0x610
-
type: evaluate_write
address: [MAIN, 0x41FDEA0, 0x610]
value_type: double
value: ["5.2 * (FPS_TARGET / 30)", "1.3 * (FPS_TARGET / 30)"]

View File

@ -0,0 +1,28 @@
# INAZUMA ELEVEN: Victory Road 1.4.0
# BID: 062189E9CF83BA5D
DECLARATIONS:
-
type: variable
name: fps_target
value_type: float
default_value: 30
evaluate: FPS_TARGET
MASTER_WRITE:
# Dynamic Resolution FPS Target
## REF: 62 02 23 1E 21 18 22 1E, ucvtf + fdiv
-
type: asm_a64
main_offset: 0xC44848
instructions: [
[adrp, x9, $fps_target],
[ldr, s1, [x9, $fps_target]]
]
ALL_FPS:
# Disable FPS Lock
## REF: 20 01 00 A9 00 01 63 9E, second LDRB below that, IDA will show address after full analyze
-
type: write
address: [MAIN, 0x374CC29]
value_type: uint8
value: 0

View File

@ -0,0 +1,19 @@
# World At War: Normandy 1.0.0
# BID: 6114E040846B8E3D
ALL_FPS:
# r.VSync
-
type: write
address: [MAIN, 0x604AC78, 0]
value_type: int32
value: [0, 0]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x6843A78, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,47 @@
# Beholder 3 1.0.1
# BID: A3416631954C56C8
DECLARATIONS:
# Changed math because frametime peaks at 60 FPS
-
type: variable
name: fps_target
value_type: uint32
default_value: 30
evaluate: FPS_TARGET - 5
-
type: variable
name: fps_target_max
value_type: uint32
default_value: 40
evaluate: FPS_TARGET - 1
-
type: code
name: getFpsTarget
instructions: [
[adrp, x9, $fps_target],
[ldr, w9, [x9, $fps_target]],
[ret]
]
-
type: code
name: getFpsTargetMax
instructions: [
[adrp, x9, $fps_target_max],
[ldr, w9, [x9, $fps_target_max]],
[ret]
]
MASTER_WRITE:
# DynamicResolutionURP::Update(), offsets 0x30 and 0x34
-
type: asm_a64
main_offset: 0x2E765DC
instructions: [
[bl, _getFpsTarget()]
]
-
type: asm_a64
main_offset: 0x2E765F8
instructions: [
[bl, _getFpsTargetMax()]
]

View File

@ -0,0 +1,19 @@
# The Pathless 1.0
# BID: 54E89AF3414E549A
ALL_FPS:
# r.DynamicRes.FrameTimeBudget
-
type: evaluate_write
address: [MAIN, 0x74CC188, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x74FADF8, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]
-
type: block
what: timing

View File

@ -0,0 +1,16 @@
# Caravan SandWitch 1.0.8
# BID: 2079893CE8402E04
ALL_FPS:
# r.DynamicRes.FrameTimeBudget
-
type: evaluate_write
address: [MAIN, 0x7A50210, 0]
value_type: float
value: ["TruncDec(FRAMETIME_TARGET, 2)", "TruncDec(FRAMETIME_TARGET, 2)"]
# t.MaxFPS
-
type: evaluate_write
address: [MAIN, 0x7A89920, 0]
value_type: float
value: [FPS_LOCK_TARGET, FPS_LOCK_TARGET]

View File

@ -0,0 +1,18 @@
# Card-en-Ciel 1.6.0
# BID: 9558FFD5CABC4612
# Buffers are hardcoded line by line and put into fixed size heap allocation, so getting triple buffer requires effort
ALL_FPS:
# Min delta FPS Target
-
type: evaluate_write
address: [MAIN, 0x2289610, 0x50]
value_type: uint32
value: FPS_TARGET
# Internal FPS Lock
# REF: look at nn::os::SleepThread() called in nnMain()
-
type: evaluate_write
address: [MAIN, 0x2289610, 0x60]
value_type: float
value: 1 / FPS_LOCK_TARGET

View File

@ -0,0 +1,10 @@
# There Is No Light 1.0.3
# BID: 76EB8E0320472553
ALL_FPS:
# UnityEngine.Time::fixedDeltaTime
-
type: evaluate_write
address: [MAIN, 0x5E6BCA0, 0x48]
value_type: float
value: "1 / FPS_TARGET"

Binary file not shown.

Binary file not shown.

View File

@ -75,8 +75,7 @@
"VENDOR": "Anbieter",
"MODEL": "Modell",
"STORAGE": "Speicherplatz",
"NOTICE": "Hinweis",
"UTILIZES": "Verwendet",
"INCOMPATIBLE_WARNING": "Inkompatibel mit AMS v1.10+",
"SYSTEM_RAM": "System-RAM",
"FREE": "frei",
"OVERLAY_MEMORY": "Overlay-Speicher",

View File

@ -75,8 +75,7 @@
"VENDOR": "Vendor",
"MODEL": "Model",
"STORAGE": "Storage",
"NOTICE": "Notice",
"UTILIZES": "Utilizes",
"INCOMPATIBLE_WARNING": "Incompatible on AMS v1.10+",
"SYSTEM_RAM": "System RAM",
"FREE": "free",
"OVERLAY_MEMORY": "Overlay Memory",

View File

@ -75,8 +75,7 @@
"VENDOR": "Fabricante",
"MODEL": "Modelo",
"STORAGE": "Almacenamiento",
"NOTICE": "Aviso",
"UTILIZES": "Utiliza",
"INCOMPATIBLE_WARNING": "Incompatible con AMS v1.10+",
"SYSTEM_RAM": "RAM del sistema",
"FREE": "libre",
"OVERLAY_MEMORY": "Memoria superposición",

View File

@ -75,8 +75,7 @@
"VENDOR": "Fabricant",
"MODEL": "Modèle",
"STORAGE": "Stockage",
"NOTICE": "Note",
"UTILIZES": "Utilise",
"INCOMPATIBLE_WARNING": "Incompatible avec AMS v1.10+",
"SYSTEM_RAM": "RAM système",
"FREE": "libre",
"OVERLAY_MEMORY": "Mémoire superposition",

View File

@ -75,8 +75,7 @@
"VENDOR": "Fornitore",
"MODEL": "Modello",
"STORAGE": "Archiviazione",
"NOTICE": "Nota",
"UTILIZES": "Utilizza",
"INCOMPATIBLE_WARNING": "Incompatibile con AMS v1.10+",
"SYSTEM_RAM": "RAM sistema",
"FREE": "libero",
"OVERLAY_MEMORY": "Memoria sovrapposizione",

View File

@ -75,8 +75,7 @@
"VENDOR": "ベンダー",
"MODEL": "モデル",
"STORAGE": "ストレージ",
"NOTICE": "通知",
"UTILIZES": "使用",
"INCOMPATIBLE_WARNING": "AMS v1.10+ と互換性がありません",
"SYSTEM_RAM": "システムRAM",
"FREE": "空き",
"OVERLAY_MEMORY": "オーバーレイメモリ",

View File

@ -75,8 +75,7 @@
"VENDOR": "제조사",
"MODEL": "모델",
"STORAGE": "저장소",
"NOTICE": "공지",
"UTILIZES": "사용",
"INCOMPATIBLE_WARNING": "AMS v1.10+과 호환되지 않습니다",
"SYSTEM_RAM": "시스템 RAM",
"FREE": "여유",
"OVERLAY_MEMORY": "오버레이 메모리",

View File

@ -75,8 +75,7 @@
"VENDOR": "Fabrikant",
"MODEL": "Model",
"STORAGE": "Opslag",
"NOTICE": "Mededeling",
"UTILIZES": "Gebruikt",
"INCOMPATIBLE_WARNING": "Incompatibel met AMS v1.10+",
"SYSTEM_RAM": "Systeem-RAM",
"FREE": "vrij",
"OVERLAY_MEMORY": "Overlay-geheugen",

View File

@ -75,8 +75,7 @@
"VENDOR": "Producent",
"MODEL": "Model",
"STORAGE": "Pamięć masowa",
"NOTICE": "Uwaga",
"UTILIZES": "Używa",
"INCOMPATIBLE_WARNING": "Niezgodny z AMS v1.10+",
"SYSTEM_RAM": "RAM systemu",
"FREE": "wolne",
"OVERLAY_MEMORY": "Pamięć nakładki",

View File

@ -75,8 +75,7 @@
"VENDOR": "Fabricante",
"MODEL": "Modelo",
"STORAGE": "Armazenamento",
"NOTICE": "Aviso",
"UTILIZES": "Utiliza",
"INCOMPATIBLE_WARNING": "Incompatível com AMS v1.10+",
"SYSTEM_RAM": "RAM do sistema",
"FREE": "livre",
"OVERLAY_MEMORY": "Memória de sobreposição",

View File

@ -75,8 +75,7 @@
"VENDOR": "Производитель",
"MODEL": "Модель",
"STORAGE": "Хранилище",
"NOTICE": "Уведомление",
"UTILIZES": "Использует",
"INCOMPATIBLE_WARNING": "Несовместимо с AMS v1.10+",
"SYSTEM_RAM": "ОЗУ системы",
"FREE": "свободно",
"OVERLAY_MEMORY": "Память оверлея",

View File

@ -75,8 +75,7 @@
"VENDOR": "Виробник",
"MODEL": "Модель",
"STORAGE": "Сховище",
"NOTICE": "Повідомлення",
"UTILIZES": "Використовує",
"INCOMPATIBLE_WARNING": "Несумісно з AMS v1.10+",
"SYSTEM_RAM": "ОЗУ системи",
"FREE": "вільно",
"OVERLAY_MEMORY": "Пам’ять оверлея",

View File

@ -75,8 +75,7 @@
"VENDOR": "厂商",
"MODEL": "型号",
"STORAGE": "存储",
"NOTICE": "提示",
"UTILIZES": "占用",
"INCOMPATIBLE_WARNING": "与 AMS v1.10+ 不兼容",
"SYSTEM_RAM": "系统内存",
"FREE": "剩余",
"OVERLAY_MEMORY": "插件内存",

View File

@ -75,8 +75,7 @@
"VENDOR": "廠商",
"MODEL": "型號",
"STORAGE": "儲存空間",
"NOTICE": "提示",
"UTILIZES": "占用",
"INCOMPATIBLE_WARNING": "與 AMS v1.10+ 不相容",
"SYSTEM_RAM": "系統記憶體",
"FREE": "剩餘",
"OVERLAY_MEMORY": "外掛記憶體",

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -75,6 +75,10 @@ del '/SaltySD/plugins/NX-FPS.elf'
del '/SaltySD/plugins/ReverseNX-RT.elf'
del '/tegraexplorer/scripts/DowngradeFix.te'
del '/switch/kefir-updater/'
del '/switch/mhz.nro'
del '/switch/RaytracingNX.nro'

Binary file not shown.

View File

@ -1,109 +0,0 @@
#REQUIRE VER 4.0.0
#REQUIRE MINERVA
#REQUIRE KEYS
#REQUIRE SD
#Script_by_CostelaBR
p = println
fatal = {
color(0xFF0000)
p("\n[FATAL]", fatalMsg)
pause()
exit()
}
wait = {
t = timer()
while (timer() < (t + tw)) {
print("Wait for ", ((t + tw - timer()) / 1000), " seconds \r")
}
}
downgradeFix = {
color(0x00FF00)
p("Starting Downgrade Fix...")
color(0xFFFFFF)
p("Mounting SYSTEM partition...")
if (mount("SYSTEM")) {
fatal(fatalMsg = "Failed to mount SYSTEM partition!")
}
targetFile = "bis:/save/8000000000000073"
if (!fsexists(targetFile)) {
color(0xFFFF00)
p("File 8000000000000073 not found in SYSTEM partition.")
p("No action needed.")
color(0xFFFFFF)
pause()
exit()
}
color(0xFF0000)
p("Deleting 8000000000000073 from SYSTEM partition...")
color(0xFFFFFF)
if (delfile(targetFile)) {
fatal(fatalMsg = "Failed to delete 8000000000000073!")
}
if (fsexists(targetFile)) {
fatal(fatalMsg = "File deletion failed - file still exists!")
}
color(0x00FF00)
p("SUCCESS: 8000000000000073 has been deleted!")
color(0xFFFFFF)
}
clear()
color(0x00FFFF)
p("=== Switch Downgrade Fix ===")
p("This script will delete the 8000000000000073 save file")
p("from the SYSTEM partition to prevent downgrade protection.")
p()
color(0xFFFFFF)
p("Select target:")
target = menu(["Exit", "Sysmmc", "Emummc"], 0)
if (target == 0) {
exit()
}
if (target == 1) {
mount = mountsys
mmcType = "Sysmmc"
} .else() {
mount = mountemu
mmcType = "Emummc"
}
clear()
color(0x00FFFF)
p("=== Downgrade Fix Confirmation ===")
color(0xFFFFFF)
p("Target:", mmcType)
p("Action: Delete 8000000000000073")
p()
color(0xFFFF00)
p("WARNING: This will modify your SYSTEM partition!")
p("Make sure you know what you doing before proceeding!")
p()
color(0xFFFFFF)
wait(tw = 5000)
p("Press POWER to continue, any other key to exit")
if (!pause().power) {
exit()
}
clear()
downgradeFix()
p()
color(0x00FF00)
p("Downgrade fix completed successfully!")
color(0xFFFFFF)
p("Press any key to exit")
pause()