USG-FIRM-WRITER/Script.gm9
2024-06-29 19:07:12 -04:00

488 lines
21 KiB
Plaintext

###################################################################################################################################
# GodMode9 script to work with my custom USG-FIRM-WRITER cart, a tool that manages DS Lite firmwares.
# Created: 2023/06/05
# Last updated: 2024/06/29
# Written by rmc
#
# _______
# | ===== |
# | <|
# |> |
# |_______|
# | ** **** |
# | \ / |
# | X |
# | / \ |
# | _____ |
# |_|| ||||_|
# \ \|||
# \|||/
# \||
# |||
# Why do people |||
# put ASCII art |||
# in source code? |||
# |||
# /|\
# |||||
# /|/ \\
# /// \\
# ____ _________|||___||__________ ____
# |____|___________________________|__*_|
# | |
# | _____________________ |
# | | USG-FIRM-WRITER v2 | |
# | |_____________________| |
# | |
# | |
# | O O . |
# |_____________________________________|
#
###################################################################################################################################
# Create work directory
mkdir $[GM9OUT]/USG-FIRM-WRITER
# Dump files individually, can be set as 'FW', 'ALL', or 'NONE'. The 'ALL' flag will dump the WiFi configuration as a seperate file.
set DUMP_ALL ALL
###################################################################################################################################
# Main menu for all your menuing needs.
###################################################################################################################################
@Menu
set PREVIEW_MODE "USG-FIRM-WRITER Script v1.0\nhttps://github.com/rvtr/USG-FIRM-WRITER\nWritten by rmc"
labelsel -o -s "Select an option." sub_*
goto Menu
###################################################################################################################################
# Dump firmware and compare to known dumps.
###################################################################################################################################
@sub_Dump_Firmware
set PREVIEW_MODE "Dumping firmware..."
if ask "Proceed with checker?\nThis will overwrite any old dumps, unless 'DUMP_ALL'\nwas set as 'NONE'."
else
goto Menu
end
find C:/*.sav SAVEPATH
# Get MAC
fget $[SAVEPATH]@36:06 MAC
if chk $[DUMP_ALL] FW
cp -w $[SAVEPATH] 0:/USG-FIRM-WRITER/$[MAC]_FIRMWARE.bin
elif chk $[DUMP_ALL] ALL
cp -w $[SAVEPATH] 0:/USG-FIRM-WRITER/$[MAC]_FIRMWARE.bin
# Backup WiFi configuration and save to dummy file
fdummy 0:/USG-FIRM-WRITER/temp_WIFI_CONFIG.bin 1D6
cp -w 0:/USG-FIRM-WRITER/temp_WIFI_CONFIG.bin 0:/USG-FIRM-WRITER/$[MAC]_WIFI_CONFIG.bin
rm 0:/USG-FIRM-WRITER/temp_WIFI_CONFIG.bin # Sadly need to create temp -> copy temp to permanent -> delete temp
#
# Why? Creating the permanent file directly if it already exits will cause a
# crash, and we can't tell if it already exists.
# Have to write the data in 100 byte blocks to due fget size error
fget $[SAVEPATH]@2A:64 WIFI_CONFIG # Backup data (100b)
fset 0:/USG-FIRM-WRITER/$[MAC]_WIFI_CONFIG.bin@00 $[WIFI_CONFIG] # Store data (100b)
fget $[SAVEPATH]@8E:64 WIFI_CONFIG # Backup data (100b)
fset 0:/USG-FIRM-WRITER/$[MAC]_WIFI_CONFIG.bin@64 $[WIFI_CONFIG] # Store data (100b)
fget $[SAVEPATH]@F2:64 WIFI_CONFIG # Backup data (100b)
fset 0:/USG-FIRM-WRITER/$[MAC]_WIFI_CONFIG.bin@C8 $[WIFI_CONFIG] # Store data (100b)
fget $[SAVEPATH]@156:64 WIFI_CONFIG # Backup data (100b)
fset 0:/USG-FIRM-WRITER/$[MAC]_WIFI_CONFIG.bin@12C $[WIFI_CONFIG] # Store data (100b)
fget $[SAVEPATH]@1BA:46 WIFI_CONFIG # Backup data (70b)
fset 0:/USG-FIRM-WRITER/$[MAC]_WIFI_CONFIG.bin@190 $[WIFI_CONFIG] # Store data (70b)
end # Total size is 470b (0x1D6 hex).
set PREVIEW_MODE "Getting build info..."
fget $[SAVEPATH]@18:01 FW_HH_STRING
fget $[SAVEPATH]@19:01 FW_MM_STRING
fget $[SAVEPATH]@1A:01 FW_DD_STRING
fget $[SAVEPATH]@1B:01 FW_MO_STRING
fget $[SAVEPATH]@1C:01 FW_YY_STRING
fget $[SAVEPATH]@1D:01 FW_REGION_STRING
fget $[SAVEPATH]@18:06 FW_FULL_STRING
set PREVIEW_MODE "Englishifying build info..."
if chk $[FW_REGION_STRING] FF
set FW_BUILD_REGION "NTR/Worldwide"
elif chk $[FW_REGION_STRING] 20
set FW_BUILD_REGION "USG/Worldwide"
elif chk $[FW_REGION_STRING] 35
set FW_BUILD_REGION "USG/Korea"
elif chk $[FW_REGION_STRING] 43
set FW_BUILD_REGION "NTR/China"
elif chk $[FW_REGION_STRING] 63
set FW_BUILD_REGION "USG/China"
elif chk $[FW_REGION_STRING] 01
set FW_BUILD_REGION "NIS/Worldwide (Nintendo Zone Box)"
elif chk $[FW_REGION_STRING] 00
set FW_BUILD_REGION "NTR/Prototype"
elif chk $[FW_REGION_STRING] A0
set FW_BUILD_REGION "NTR/IS-NITRO"
end
if chk $[FW_MO_STRING] 01
set FW_BUILD_MONTH "January"
elif chk $[FW_MO_STRING] 02
set FW_BUILD_MONTH "February"
elif chk $[FW_MO_STRING] 03
set FW_BUILD_MONTH "March"
elif chk $[FW_MO_STRING] 040x1D6
set FW_BUILD_MONTH "April"
elif chk $[FW_MO_STRING] 05
set FW_BUILD_MONTH "May"
elif chk $[FW_MO_STRING] 06
set FW_BUILD_MONTH "June"
elif chk $[FW_MO_STRING] 07
set FW_BUILD_MONTH "July"
elif chk $[FW_MO_STRING] 08
set FW_BUILD_MONTH "August"
elif chk $[FW_MO_STRING] 09
set FW_BUILD_MONTH "September"
elif chk $[FW_MO_STRING] 10
set FW_BUILD_MONTH "October"
elif chk $[FW_MO_STRING] 11
set FW_BUILD_MONTH "November"
elif chk $[FW_MO_STRING] 12
set FW_BUILD_MONTH "December"
elif set FW_BUILD_MONTH "UNKNOWN"
end
# Display build info
set PREVIEW_MODE "Build info:\n\nTime: $[FW_MM_STRING]:$[FW_HH_STRING]\nDate: 20$[FW_YY_STRING], $[FW_BUILD_MONTH] $[FW_DD_STRING]\nRegion: $[FW_REGION_STRING] - $[FW_BUILD_REGION]\nFlashMe: No\nHex: $[FW_HH_STRING] $[FW_MM_STRING] $[FW_DD_STRING] $[FW_MO_STRING] $[FW_YY_STRING] $[FW_REGION_STRING] (0x18-0x1D)"
# Display build info if flashme
# http://docs.randommeaninglesscharacters.com/dsfirmwares.html
if chk $[FW_FULL_STRING] 0711051004FF
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 5109261104FF
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 4814060605FF
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 152109060543
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 161630110520
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 4514071205FF
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 192026010601
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 592020020600 # ISNE Phat
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 5920200206A0 # ISNE Lite
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 191108030620
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 351506260463
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 302109110635
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 000000000000
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 5108280205FF # FlashMe (Phat - v8, v8a)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 332105020620 # FlashMe (Lite - 050512, 050715, v3, v5, v6, v7, v8, v8a)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F023490 # CreeboMeBeta2 (v0.02)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F02D0B4 # fwnitro (v1.6b no scroller + no mkds, mkds only, scroller only)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F02D0BC # fwnitro (v1.6b scroller + mkds)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F0254AB # fwnitro (v1.6c no sroller, no mkds)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F0254B3 # fwnitro (v1.6c mkds only)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F0254B5 # fwnitro (v1.6c scroller only)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk $[FW_FULL_STRING] 0CF07F0254BB # fwnitro (v1.6c scroller + mkds)
echo "Dump complete!\n\nThis is a known firmware revision."
elif chk 1 1
echo "UNKNOWN FIRMWARE: Please send the firmware dump to:\n'lillian@randommeaninglesscharacters.com'.\n(0:/USG-FIRM-WRITER/$[MAC]_FIRMWARE.bin)"
goto Menu
end
if ask "Dump another WiFi board?"
goto sub_Dump_Firmware
else
goto Menu
end
###################################################################################################################################
# For flashing firmware dumps
###################################################################################################################################
@sub_Flash_Firmware
set PREVIEW_MODE "Flash firmware backup."
# Backup FW/config here
if ask "Proceed with flasher?\nThis will overwrite the current firmware."
find C:/*.sav SAVEPATH # Find WiFi board firmware
# Display current firmware info
set PREVIEW_MODE "Getting build info..."
fget $[SAVEPATH]@18:01 FW_HH_STRING
fget $[SAVEPATH]@19:01 FW_MM_STRING
fget $[SAVEPATH]@1A:01 FW_DD_STRING
fget $[SAVEPATH]@1B:01 FW_MO_STRING
fget $[SAVEPATH]@1C:01 FW_YY_STRING
fget $[SAVEPATH]@1D:01 FW_REGION_STRING
fget $[SAVEPATH]@18:06 FW_FULL_STRING
set PREVIEW_MODE "Englishifying build info..."
if chk $[FW_REGION_STRING] FF
set FW_BUILD_REGION "NTR/Worldwide"
elif chk $[FW_REGION_STRING] 20
set FW_BUILD_REGION "USG/Worldwide"
elif chk $[FW_REGION_STRING] 35
set FW_BUILD_REGION "USG/Korea"
elif chk $[FW_REGION_STRING] 43
set FW_BUILD_REGION "NTR/China"
elif chk $[FW_REGION_STRING] 63
set FW_BUILD_REGION "USG/China"
elif chk $[FW_REGION_STRING] 01
set FW_BUILD_REGION "NIS/Worldwide (Nintendo Zone Box)"
elif chk $[FW_REGION_STRING] 90
set FW_BUILD_REGION "CFW"
elif chk $[FW_REGION_STRING] B4
set FW_BUILD_REGION "CFW"
elif chk $[FW_REGION_STRING] BC
set FW_BUILD_REGION "CFW"
elif chk $[FW_REGION_STRING] 00
set FW_BUILD_REGION "NTR/Prototype"
elif chk $[FW_REGION_STRING] A0
set FW_BUILD_REGION "NTR/IS-NITRO"
end
if chk $[FW_MO_STRING] 01
set FW_BUILD_MONTH "January"
elif chk $[FW_MO_STRING] 02
set FW_BUILD_MONTH "February"
elif chk $[FW_MO_STRING] 03
set FW_BUILD_MONTH "March"
elif chk $[FW_MO_STRING] 04
set FW_BUILD_MONTH "April"
elif chk $[FW_MO_STRING] 05
set FW_BUILD_MONTH "May"
elif chk $[FW_MO_STRING] 06
set FW_BUILD_MONTH "June"
elif chk $[FW_MO_STRING] 07
set FW_BUILD_MONTH "July"
elif chk $[FW_MO_STRING] 08
set FW_BUILD_MONTH "August"
elif chk $[FW_MO_STRING] 09
set FW_BUILD_MONTH "September"
elif chk $[FW_MO_STRING] 10
set FW_BUILD_MONTH "October"
elif chk $[FW_MO_STRING] 11
set FW_BUILD_MONTH "November"
elif chk $[FW_MO_STRING] 12
set FW_BUILD_MONTH "December"
elif set FW_BUILD_MONTH "UNKNOWN"
end
# Display build info
set PREVIEW_MODE "Current firmware build info:\n\nTime: $[FW_MM_STRING]:$[FW_HH_STRING]\nDate: 20$[FW_YY_STRING], $[FW_BUILD_MONTH] $[FW_DD_STRING]\nRegion: $[FW_REGION_STRING] - $[FW_BUILD_REGION]\nHex: $[FW_HH_STRING] $[FW_MM_STRING] $[FW_DD_STRING] $[FW_MO_STRING] $[FW_YY_STRING] $[FW_REGION_STRING] (0x18-0x1D)"
if ask "Use external dumps? If no then your own dumps from\nthis script will be used.\nNote: for external dumps, place firmware backups in:\n0:/USG-FIRM-WRITER/External/"
if filesel "Select firmware backup" 0:/USG-FIRM-WRITER/External/* FIRMWARE_FLASH
else
echo "No file selected, cancelling."
goto sub_Flash_Firmware
end
else
if filesel "Select firmware backup" 0:/USG-FIRM-WRITER/*FIRMWARE.bin FIRMWARE_FLASH
else
echo "No file selected, cancelling."
goto sub_Flash_Firmware
end
end
# Display current firmware info
set PREVIEW_MODE "Getting build info..."
fget $[FIRMWARE_FLASH]@18:01 FW_HH_STRING
fget $[FIRMWARE_FLASH]@19:01 FW_MM_STRING
fget $[FIRMWARE_FLASH]@1A:01 FW_DD_STRING
fget $[FIRMWARE_FLASH]@1B:01 FW_MO_STRING
fget $[FIRMWARE_FLASH]@1C:01 FW_YY_STRING
fget $[FIRMWARE_FLASH]@1D:01 FW_REGION_STRING
fget $[FIRMWARE_FLASH]@18:06 FW_FULL_STRING
set PREVIEW_MODE "Englishifying build info..."
if chk $[FW_REGION_STRING] FF
set FW_BUILD_REGION "NTR/Worldwide"
elif chk $[FW_REGION_STRING] 20
set FW_BUILD_REGION "USG/Worldwide"
elif chk $[FW_REGION_STRING] 35
set FW_BUILD_REGION "USG/Korea"
elif chk $[FW_REGION_STRING] 43
set FW_BUILD_REGION "NTR/China"
elif chk $[FW_REGION_STRING] 63
set FW_BUILD_REGION "USG/China"
elif chk $[FW_REGION_STRING] 01
set FW_BUILD_REGION "NIS/Worldwide (Nintendo Zone Box)"
elif chk $[FW_REGION_STRING] 90
set FW_BUILD_REGION "CFW"
elif chk $[FW_REGION_STRING] B4
set FW_BUILD_REGION "CFW"
elif chk $[FW_REGION_STRING] BC
set FW_BUILD_REGION "CFW"
elif chk $[FW_REGION_STRING] 00
set FW_BUILD_REGION "NTR/Prototype"
end
if chk $[FW_MO_STRING] 01
set FW_BUILD_MONTH "January"
elif chk $[FW_MO_STRING] 02
set FW_BUILD_MONTH "February"
elif chk $[FW_MO_STRING] 03
set FW_BUILD_MONTH "March"
elif chk $[FW_MO_STRING] 04
set FW_BUILD_MONTH "April"
elif chk $[FW_MO_STRING] 05
set FW_BUILD_MONTH "May"
elif chk $[FW_MO_STRING] 06
set FW_BUILD_MONTH "June"
elif chk $[FW_MO_STRING] 07
set FW_BUILD_MONTH "July"
elif chk $[FW_MO_STRING] 08
set FW_BUILD_MONTH "August"
elif chk $[FW_MO_STRING] 09
set FW_BUILD_MONTH "September"
elif chk $[FW_MO_STRING] 10
set FW_BUILD_MONTH "October"
elif chk $[FW_MO_STRING] 11
set FW_BUILD_MONTH "November"
elif chk $[FW_MO_STRING] 12
set FW_BUILD_MONTH "December"
elif set FW_BUILD_MONTH "UNKNOWN"
end
# Display build info
set PREVIEW_MODE "New firmware build info:\n\nTime: $[FW_MM_STRING]:$[FW_HH_STRING]\nDate: 20$[FW_YY_STRING], $[FW_BUILD_MONTH] $[FW_DD_STRING]\nRegion: $[FW_REGION_STRING] - $[FW_BUILD_REGION]\nHex: $[FW_HH_STRING] $[FW_MM_STRING] $[FW_DD_STRING] $[FW_MO_STRING] $[FW_YY_STRING] $[FW_REGION_STRING] (0x18-0x1D)"
if not ask "Are you sure you want to flash the new firmware?"
echo "Operation cancelled."
goto Menu
end
# Build info for user to check and confirm
# Create temporary copy of firmware and import config to that before flashing.
cp -w $[FIRMWARE_FLASH] 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin
# Have to write the data in 100 byte blocks to due fget size error
fget $[SAVEPATH]@2A:64 WIFI_CONFIG0 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@2A $[WIFI_CONFIG0] # Store data
fget $[SAVEPATH]@8E:64 WIFI_CONFIG1 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@8E $[WIFI_CONFIG1] # Store data
fget $[SAVEPATH]@F2:64 WIFI_CONFIG2 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@F2 $[WIFI_CONFIG2] # Store data
fget $[SAVEPATH]@156:64 WIFI_CONFIG3 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@156 $[WIFI_CONFIG3] # Store data
fget $[SAVEPATH]@1BA:46 WIFI_CONFIG4 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@1BA $[WIFI_CONFIG4] # Store data
# Add user config here later on
find C:/*.sav SAVEPATH
cp -w 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin $[SAVEPATH] # Flash wireless fixed firmware
rm 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin # Delete temp edited file
echo "Firmware flashed okay!"
else
echo "Operation cancelled."
goto Menu
end
goto Menu
###################################################################################################################################
# Inject WiFi configuration from one backup to another
###################################################################################################################################
@sub_Inject_WiFi_Config
echo "Warning: make sure you have a backup first!\nIf you ever lose this data, it is impossible to recreate."
if not ask "Are you sure you want to continue?"
echo "Operation cancelled."
goto Menu
end
if filesel "Select WiFi config backup" 0:/USG-FIRM-WRITER/*WIFI_CONFIG.bin WIFI_CONFIG_FLASH
else
echo "No file selected, cancelling."
goto Menu
end
if not ask "Inject into WiFi board? If no then you can select\na firmware backup from the SD card."
set INJECT_MODE SD
if ask "Inject to external firmware dumps?\nIf no then your own dumps from this script will be used.\nNote: for external dumps, place firmware backups in:\n0:/USG-FIRM-WRITER/External/"
if filesel "Select firmware to inject into" 0:/USG-FIRM-WRITER/External/* FIRMWARE_FLASH
else
echo "No file selected, cancelling."
goto Menu
end
else
if filesel "Select firmware to inject into" 0:/USG-FIRM-WRITER/*FIRMWARE.bin FIRMWARE_FLASH
else
echo "No file selected, cancelling."
goto Menu
end
end
else
set INJECT_MODE BOARD
end
if chk $[INJECT_MODE] BOARD
find C:/*.sav SAVEPATH
cp -w $[SAVEPATH] 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin
else
cp -w $[FIRMWARE_FLASH] 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin
end
fget $[WIFI_CONFIG_FLASH]@00:64 WIFI_CONFIG0 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@2A $[WIFI_CONFIG0] # Store data
fget $[WIFI_CONFIG_FLASH]@64:64 WIFI_CONFIG1 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@8E $[WIFI_CONFIG1] # Store data
fget $[WIFI_CONFIG_FLASH]@C8:64 WIFI_CONFIG2 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@F2 $[WIFI_CONFIG2] # Store data
fget $[WIFI_CONFIG_FLASH]@12C:64 WIFI_CONFIG3 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@156 $[WIFI_CONFIG3] # Store data
fget $[WIFI_CONFIG_FLASH]@190:46 WIFI_CONFIG4 # Backup data
fset 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin@1BA $[WIFI_CONFIG4] # Store data
if chk $[INJECT_MODE] BOARD
cp -w 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin $[SAVEPATH]
else
cp -w 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin $[FIRMWARE_FLASH]
end
rm 0:/USG-FIRM-WRITER/temp_FIRMWARE.bin
echo "Injected okay!"
goto Menu
###################################################################################################################################
# End script... but why would you want to do that?
###################################################################################################################################
@sub_Exit_Script
echo "Exiting script, have a nice day!"
# Firmware index
# 0x018-0x01C = build date in: hour, minute, day, month, year
# 0x01D = region
# 0x02A-0x1FF = WiFi config
# 0x036-0x03B = MAC address
#
#
#
#
#
#
#
#