Download
Latest (SA-1)
This version should be used by any system that can properly emulate the SA-1 with 256kb of BWRAM.
- SD2SNES
- Mesen-S
- higan/bsnes v115+
- bsnes+
- snes9x 1.6+
- faust
Randomizer (SA-1)
This version is slightly modified from the main version to include several randomizer features:
- Major items are replaced with E
- No item text
- No crystal cutscenes
- Bottle submenu is accessed with X, instead of automatically
- Pressing Y on a bottle in the menu will select the next bottle
- Quick swap (DISGUSTING!)
- Hammerable Ganon
v13.6.0 (Old)
This is a snapshot of the pre-SA-1 practice hack. It will no longer be updated and only serves as a fallback for incompatible systems.
- Everdrive
- SuperNT jailbreak
- BizHawk's bsnes core (v85)
- SNES Classic (This entire console is utter garbage)
Hack features
The practice hack comes loaded with a full suite of HUD changes, features, and wedges to facilitate RTA practice and glitch hunting. The most commonly used features include:
- Presets to load a specific section of the run with the appropriate equipment.
- Built-in save states for practicing anything repeatedly.
- Timers for comparing strategies and execution against yourself and others.
- Input display for displaying your inputs on your display.
Configuration settings will persist across practice hack versions if newly downloaded hacks are given the same file name as previous versions on whatever system you use.
Practice Hack Menu
The practice hack menu can be accessed by having the R and Start buttons held down together on the same frame. This menu and other shortcuts can be activated during most gameplay modes, but will be prohibited during some modules (such as the file select menu). When disallowed, shortcut bindings will play a beep and resume normal action.
Menu controls
R+Start |
Game play |
Open practice menu |
Start |
In practice menu |
Close practice menu |
Select |
In practice menu |
Return to main index |
A |
Submenu option |
Open submenu |
Toggle option |
Toggle item |
List option |
Next selection |
Command option |
Activate command |
X |
Most options |
Clear / Disable |
Numfields |
Set to minimum |
Y |
Most options |
Enable |
Numfields |
Set to maximum |
B |
Main menu |
Move to top |
Submenu |
Return to previous menu |
L / R |
Num field |
Increment/Decrement by larger amounts; no wrapping |
⏴ / ⏵ |
Toggle option |
Toggle item |
List option |
Previous/Next selection |
Num field |
Increment/Decrement by 1 |
⏶ / ⏷ |
Practice menu |
Move cursor |
Menu legend
Icon |
Meaning |
|
Opens a submenu |
|
Runs an immediate command |
|
Toggles a binary option |
|
Sets from a selection of choices |
|
Sets a numerical value |
|
Loads a preset |
|
Sets a shortcut binding |
Common concerns
How accurate is lag compared to the vanilla game?
As of version 14, very; about 2% of a scanline off. Here's a quick rundown of how it works:
SA-1
The SA-1 is a coprocessor that can be used alongside the main SNES CPU. It can run code faster, but, more importantly, it can run at the same time as the SNES CPU without slowing it down. This allows the practice hack to handle certain features with minimal lag change from vanilla. Due to the limitations on memory access, not every feature can be handled lag-free on the SA-1.
Features that run on the SA-1 will be marked with this badge: SA1.
Implementation
There are specific routines that get run at the beginning and end of every frame to manage the OAM buffer. These routine aren't coded very efficiently. They've been heavily optimized to allow more CPU time for all the extra features. The SNES CPU then sends an interrupt request which tells the SA-1 to process controller input for shortcuts. If a shortcut is found, a vector pointing to its routine in ROM will be saved in memory. The next frame, the SNES will check for this vector, and respond accordingly.
For the game HUD, almost every reference to its WRAM buffer has been changed to a location in BWRAM where the SA-1 can see it. Once the HUD's buffer has been modified by the game, it copies a handful of variables that are only visible to the SNES CPU into memory that is visible to both the SNES and the SA-1. This is where most of the time saved with OAM optimization is accounted for. After these variables are copied, the SNES sends another interrupt request to the SA-1 to indicate that the coprocessor can do its own changes to the tilemap before it gets drawn to the screen. Some features (such as the hearts) are still written to their original WRAM buffer. This way, they can contribute their normal CPU load without ruining the HUD.
On any frame where the HUD doesn't update, a separate check makes sure that these variables are still copied over, as this copying is critical to balancing the practice hack back in line with vanilla. The rest of the code hacked in is very minimal, and those few extra cycles are very unlikely to create additional lag frames.
Certain features require more variables to be copied over than others. These will necessarily require a slightly higher fraction of the CPU's time, but they will only take this time when the HUD is redrawn. Such features will be marked with this badge: EX.
My system isn't supported! Update the older hacks!
No.
The change to SA-1 included a complete overhaul of the backend code. Adding new features to both versions would require maintaining two completely separate codebases and writing almost every feature twice. I simply cannot allow my ability to improve this project be inhibited by inferior applications or devices that do not properly emulate expansion chips. You may think it's not fair that I'm ignoring your system, but what's actually not fair is holding everyone else back from a better practice hack.
Known issues
- Lag from mosaics can be inaccurate, depending on what you've already done in your current play session. I'm still investigating the best way to approach this problem.
Trouble shooting
- Holding Start and Select during power on will reset all configurations to their defaults. When you do this, you will hear Link screaming as he falls to his death.
- If something in the menu goes out of range, you will be warned with "BAD VAL". Press X to clear it.
Caveats
It's impossible to modify anything this much without sacrificing some behavior. This section details known caveats that should be taken into consideration by the user.
Overlay corruption and the SA-1
The memory layout of the SA-1 puts important hardware registers and on-board memory in an area potentially affected by overlay corruption. To prevent corruption to the SA-1, the star tile holes routine will be intercepted if it is about to write too far. This will have some effect on the timing of longer corruptions.
When cut short, the practice hack will continue reading without writing to see how far the writes would have gone. If they reach too far ($4200
), then a blue screen of death will be displayed to explain the intentional lock.
In addition to the writing, this type of corruption may also read too far. This does not have the potential to corrupt the SA-1, but it does throw the behavior out of sync from vanilla. Normally, corruption that reaches this far is dependent on open bus behavior; however, the SA-1 places registers and memory in this region, effecting a less deterministic sea of values. To coax corruptions into resolving, a large block of memory from $3680
to $37FF
has been filled with the required terminator value. This solution necessarily means that far-reaching corruption will end much sooner than it normally would, making timings unreliable.
Features list
Main menu
- Presets
- Built in states for various categories
- Items
- Modify Y-item loadout
- Equipment
- Modify A-items, combat items, health, and keys
- Game state
- Modify game progress, status, and mode
- Link state
- Modify player character attributes
- Gameplay
- Feature toggles related to gameplay
- RNG control
- Fix specific RNG calls to specific values
- HUD extras
- Toggle features that appear on the HUD
- Lite states
- Custom presets
- Room master
- Load rooms and view/edit room flags
- Shortcuts
- Modify shortcuts for quick feature access
- Preset config
- Controls how presets load
- Configuration
- Configuration toggles related to meta-operation
Collections of presets that can be loaded to practice various parts of various runs. The category listed can be changed in the preset config menu.
If a category you want to practice does not have presets, you can help by making them. Instructions for doing so are listed here.
- Bow
-
- No
- Normal
- Silver
- Boom
-
- No
- Blue
- Red
- Hookshot
- Yes/No
- Bombs
- 0–30
- Powder
-
- No
- Mushroom
- Powder
- Fire rod
- Yes/No
- Ice rod
- Yes/No
- Bombos
- Yes/No
- Ether
- Yes/No
- Quake
- Yes/No
- Lantern
- Yes/No
- Hammer
- Yes/No
- Flute
-
- No
- Shovel
- Inactive flute
- Active flute
- Net
- Yes/No
- Book
- Yes/No
- Bottles
-
For each bottle (1–4):
- No
- Unobtainable shroooom
- Empty
- Red potion
- Green potion
- Blue potion
- Fairy
- Bee
- Good bee
- Somaria
- Yes/No
- Byrna
- Yes/No
- Cape
- Yes/No
- Mirror
- Yes/No
- Health
- Current health. Fractional hearts are indicated with a bar.
- Max HP
- Max health in hearts.
- Magic
- Set magic points.
- Fill rupees
- Grants 999 rupees
- Fill everything
- Grants full equipment with just below max health and magic.
- Sword
-
- No
- Fighter
- Master
- Tempered
- Gold
- Shield
-
- No
- Fighter
- Red
- Mirror
- Armor
-
- Green jerkin
- Blue
- Red
- Gloves
-
- No
- Power glove
- Titan's mitts
- Boots
- Yes/No
- Flippers
- Yes/No
- Moon pearl
- Yes/No
- Half magic
- Yes/No
- Heart pieces
- 0–3
- Bombs
- 0–30
- Arrows
- 0–50
- Keys
- 0–9
- Big keys
- Toggle big keys for each dungeon.
- Small keys
- Key counts for each dungeon.
- Skip text
- Skips the current text box.
- Remove sprites
- Removes all sprites, overlords, and ancillae from the screen.
- Reset dungeons
- Resets every room associated with a specific dungeon (including all non-dungeon rooms as a single group) following these rules:
- Quadrants visited
- Keys collected
- Chests opened
- Doors opened
- Moving walls
- Water level
- Boss defeated
- Heart collected
- Rupee tiles collected
NOTE: This only affects the data pertaining to that specific room, but not data pertaining to the dungeon as a whole. For example, even though key collection is reset, the key count for that dungeon is left unaltered.
- Toggle bosses defeated
- Modifies the boss defeated room flag for the specific boss's room.
- Pendants and crystals
- Toggle collection status of each dungeon prize.
- Game flags
- Toggles miscellaneous SRAM flags:
- Uncle dead
- Talking to uncle in the secret passage
- Sanc priest
- Talking to the priest after mastersword
- Escaped
- Returning Zelda to sanctuary
- Uncle left
- Uncle leaving the house
- Aginah
- Aginah discussing book
- Fortune cycle
- Fortune teller hint selector
- Hobo bottle
- Got bottle from hobo
- Vendor bottle
- Bought bottle in Kakariko
- Stumpy
- Stumpy turned into a tree
- Purple chest
- Unlocked purple chest
- Smithy rescued
- Saved the frog
- Tempering
- Smiths currently have your sword for tempering
- Drops
- Submenu for controlling drop luck, rupee pulls, and prize packs.
- Follower
-
- None
- Zelda
- Garbage
- Trash
- Old man
- Zelda Text
- Blind
- Frog
- Dwarf
- Sign man
- Kiki
- ??????
- Purple chest
- Super bomb
- Sasha text
- World
- Switch between Light World and Dark World. Does not change screen ID.
- Progress
- Game mode selector:
- Started
- No progress. Game will not save.
- Uncle
- Sword and shield obtained from uncle.
- Zelda
- Zelda has been rescued.
- Agahnim
- Agahnim has been defeated.
- Map indicator
- World map marker:
- Castle
- Zelda rescue mission
- Kakariko
- Go speak to villagers to learn about the Elders
- Sahasrahla
- Go speak to Sahasrahla to learn about the Master Sword
- Pendants
- Light World dungeons
- MS
- Go collect the master sword
- ATower
- Go fight Agahnim
- Darkness
- First Dark World dungeon
- Crystals
- Remaining Dark World dungeons
- GTower
- Go fight Ganon
- Waterwalk
- Control the falling-in-pit address
- Unarmed
- 0; Link's default state
- Armed
- 1; armed as if waterwalk were set up by dashing from a pit
- Armed (2)
- 2; difficult (if not impossible) to obtain intermediate state
- Deathholed
- 3; falling state obtained after a death hole in the underworld
- Statue drag
- Toggles the fake statue address.
- Anc Index
- Set ancilla search index ($03C4); $00–$7F
- Armed EG
- Yes/No.
- EG strength
-
- Activate superbunny
- Sets Link's general state handler to default (
$00
). For safety, this will only run when Link's handler is currently set to bunny ($17
). If successful, you should hear a poof; otherwise, you will hear a beep.
- Activate Lonk
-
Sets Link's general state handler to bunny ($17
). For safety, this will only run when Link's handler is at its default value ($00
). If successful, you should hear OOF; otherwise, you will hear a beep.
Despite the labels, the Superbunny and Lonk menu options can be used to return to normal Link and normal bunny, respectively.
- Finish mirrordoor
- Sets the mirror door wait timer to finish after 11 frames. For safety reasons, this will only run when the Triforce door submodule is in effect. If successful, you should hear a VOOMP; otherwise, you will hear a beep.
- Skip Triforce
- Transitioning north from Ganon's Room will behave like a normal screen transition, allowing consistent and reliable room times for the fight.
- Disable beams
- The Master Sword and its upgrades will no longer fire sword beams at full health.
- Lit rooms
- Dark rooms will be at full brightness and visibility. Retains a faded lamp cone for cues.
- Fast walls
- Speeds up the moving wall cutscenes.
- Visible probesLAG
- Search probes used by guards, beamos, etc. will display a graphic.
- Show STC pits
- Automatically mark all pits after performing somaria door corruptions.
- Disable BG1
- Disables SNES background 1 via PPU registers. Has no effect on lag.
- Disable BG2
- Disables SNES background 2 via PPU registers. Has no effect on lag.
- OoB Mode
- Turns on the debug OoB mode, which has the following features:
- Link ignores all collision, and can walk everywhere.
- The mirror works to go from Light World to Dark World.
- Prize packs
- Modifies drop percentages. This option only affects prize packs, not other guaranteed drops such as the stun drop or keys. It will, however, affect the 100% prize packs.
- Vanilla
- Drops behave normally. 50% for most prize packs; fairy luck works.
- Always
- All enemies drop their prize packs when possible.
- Never
- No enemy drops prize packs, ever.
NOTE: toggling this option will reset existing fairy luck.
- Frame rule
- Forces the frame counter to a specific value on preset or savestate load.
- Pokeys
- Random, fixed RNG for every combination of UD/LR for each pokey
- Agahnim
-
- Random
- Yellow
- Blue
- Helmasaur
-
- Random
- No fireball
- Fireball
- Ganon warps
-
- Random
- No warp
- Warp
- Ganon warp to
-
- Random
- Far left
- Bottom left
- Bottom right
- Far right
- Eyegore walk
-
- Random
- Short
- Medium
- Long
- Arrghus walk
-
- Random
- Shortest
- Short
- Medium
- Long
- Longest
- Turtle walk
- Random, 32 fixed RNGs
- Lanmola exit
- Random, fixed {X,Y} for 0≤X≤7; 0≤Y≤7
- Moth conveyor
-
- Random
- Right
- Left
- Up
- Down
- First Vitty
-
- Random
- Slot 5
- Slot 6
- Slot 7
- Slot 8
- Slot 9
- Slot A
- Slot B
- Slot C
- Slot D
- Health displaySA1
- How to show Link's current and max health:
- Numerical
- Classic practice hack display under rupee count
- Vanilla
- Vanilla graphical display NOTICE: vanilla hearts will be drawn to the HUD first; additional HUD features may be drawn over them.
- Input displaySA1
- Visual indication of every button registered each frame.
- Off
- Disabled.
- Graphical
- Rectangle buttons arranged like a controller.
- Classic
- Original character display.
- Classic Gray
- Classic with unpressed buttons in gray.
- Sentry [1–5]SA1
- 5 sentry slots displayed on the HUD.
- Room time
- Time spent on the current screen, starting from the beginning of the last transition.
- Lag
- Count of lag frames on the current screen, starting from the beginning of the last transition.
- Idle frames
- Count of menu and text frames with no relevant input, starting from the beginning of the last transition.
- Segment time
- Time spent since the beginning of the last segment timer reset.
- Coordinates
- Absolute position of Link (X,Y)
- Room (live)
- Room time with continuous updates.
- Lag (live)
- Lag frames with continuous updates.
- Subpixels
- Current subpixel (Hexadecimal); address: $7E002A
- Room ID
- Current room ID, corrected room ID (based on coordinates), and sync. Sync not displayed on overworld; address: $7E00A0
- Quadrant
- Current quadrant, corrected quadrant (based on coordinates), and sync. Not displayed on overworld; address: $7E00A9
- Screen ID
- Current overworld screen ID, corrected screen ID (based on coordinates), and sync. Not displayed in underworld; address: $7E008A
- Tile (UW)
- Tile type Link is standing on (bottom right; only works in underworld); address: $7E0114
- Tile index
- WRAM address in bank 7F of the tile Link is standing on.
- Spooky
- Ancilla height for slot 4; address: $7E02A2
- Arc variable
- Overlord value used by Armos Knights and Ganon for circles; address: $7E0B08
- WEST SOMARIA
- West somaria door timer; address: $7E0690
- Ancilla index
- Ancilla search index; address: $7E03C4
- Pits
- Current pit destination/damage flag. Not displayed on overworld; address: $7EC000
- Hookslot
- Hookshot slot index; address: $7E039D
- Boss HP
- Health of enemy in slot 0; address: $7E0E50
- Hovering
- Number of frames A has been held, up to 29; address: $7E0374
- Line [1–4]EX
- 4 larger sentry lines of info displayed on the HUD.
- Room flags
- Boss heart, key, chest, and door flags for current room.
- UW Camera X
- Camera scroll and boundaries for X-axis.
- UW Camera Y
- Camera scroll and boundaries for Y-axis.
- OW Trans X
- Transition triggers and target screen IDs for horizontal overworld transitions.
- OW Trans Y
- Transition triggers and target screen IDs for vertical overworld transitions.
- Ancilla 0-4
- Custom ancilla property for slots 0–4 (property # corresponds to sentry #). This set of slots is indicated by a yellow triangle pointing down.
- Ancilla 5-9
- Custom ancilla property for slots 5–9. This set of slots is indicated by a green triangle pointing up.
- Ancilla MSX
- Custom ancilla property for the 5 slots preceding the current search index ($03C4). This set of slots is indicated by a blue magnifying glass.
- Ancilla prop [1–4]
- Custom property 1–4 for ancilla sets corresponding to line sentries 1–4
- ID
- Ancilla ID from $03C4,X (includes coloring for 00 and replacable particles).
- X coord
- Ancilla X-Coordinate; address: $7E0C04,X
- Y coord
- Ancilla Y-Coordinate; address: $7E0BFA,X
- Altitude
- Ancilla Z-Coordinate; address: $7E029E,X
- Layer
- Ancilla layer; address: $7E0C7C,X
- Extension
- Used both for hookshot length and item receipt ID, among other less interesting properties; address: $7E0C5E,X
- Tile prop
- Tile interaction; address: $7E03E4,X
- EG check
- Something; address: $7E03A4,X
- Direction
- Generally used for direction of ancilla; address: $7E0C72,X
- Decay
- Timer for wall arrows before disappearing; address: $7E03B1,X
- Hide linesSA1
- Removes the line sentries from the HUD without the need to disable them.
- HUD spinnerSA1
- Animated spinning icon that indicates there is potential for HUD-related lag present.
- State iconsSA1
- Displays icons along the left side of the HUD for the following properties (top to bottom): superspeed, waterwalk, door state, stair drag.
- Quick warpSA1
- Displays an icon on the HUD when the current camera will effect a quickwarp.
- Boss cyclesSA1
- Displays the cycle count of bosses.
16 custom presets that can be saved, loaded, and erased.
- To load a lite state, press A.
- To write a lite state, hold Y for 60 frames. This will create a preset at your current location with your current equipment.
- To delete a lite state, hold X for 60 frames.
- Set room
- Change the current room loaded and viewed.
- Load selected room
- Loads the currently selected room based on the configurable settings. Tries to be systematic and intelligent about positioning, camera, etc.
- Configure loading
- Configure settings that control what state rooms are loaded in.
- Equipment
- Select between current equipment, the custom preset loadout, or full equipment.
- Open shutters
- Opens all shutter doors in the loaded room.
- Kill sprites
- Kills all sprites in the loaded room.
- Peg state
- Choose the peg state when loading rooms, or leave them in their current state.
- World state
- Choose the world ID, let it take on the expected value of the room, or leave it as is.
- Dungeon ID
- Choose the dungeon ID, let it take on the expected value of the room, or leave it as is.
- Door 0, …
- View and change the various flags saved per room.
- LTTPHack menu
- R+Start - Opens the practice hack menu. NOTE: this shortcut cannot be changed.
- Load last preset
- Reloads the most recent preset or litestate used from the menu.
- Save state
- Saves current state of the game, similar to emulator savestates.
- Load state
- Loads saved savestates, similar to emulator savestates.
- Reset seg timer
- Resets the segment timer, which is not automatically reset like room timer.
- Toggle OoB
- Turns on out-of-bounds mode.
- Skip text
- Skips the current text box.
- Remove sprites
- Removes all sprites, overlords, and ancillae from the screen.
- Toggle switch
- Flips the crystal switch color in underworld.
- Fill everything
- Maxes out equipment, rupees, items, and health.
- VRAM repair
- Fixes important registers and VRAM data that have been corrupted by door glitches.WARNING: If this shortcut is triggered during a text box, the text box will disappear, but the game will remain in text mode.NOTE: this feature only repairs registers and VRAM; other areas of RAM may result in game crashes unrelated to this feature, but which are never normally encountered in vanilla runs.
- Mark all pits
- Modifies the upper layer tilemap to mark pits.NOTE: this feature is intended for finding pits created by overlay corruption, but it will mark all standard pit tiles the same way.
- Preset category
- Changes the run category listed in the presets submenu.
- Safeties
- Opens a new submenu with safety options for the currently selected category.
- Death reload
- Reloads the last preset upon death.
- Random bats
- Randomize the variable that Ganon uses to spawn bats after loading a preset.
- Use preset load
- When enabled, the current saved loadout will overwrite items and equipment when presets are loaded.
- Save loadout
- Saves your current equipment to a custom loadout for use with presets.
- Rerandomize
- When using built-in savestates and presets, this will run the RNG function to create a new value on each load. It will also randomize the frame counter.
- Music
- Sets the ADSR envelope of every instrument used by music to 0 (except the saw used by mirror warps). Nothing else changes, so this feature does not affect lag.
- Menu open
- Select whether the practice menu opens up to where you left off or resets to the top.
- HUD font
- Change the font used by HUD extras. This will not change the font for the vanilla HUD or for the HP display. Hover over options for larger preview.
- LTTP
- Klonoa
- TI-83
- Shin-chan
- SMT (Shin Megami Tensei)
- Mario World
- DKC (Donkey Kong Country)
- ZAMN (Zombies Ate My Neighbors)
- Emerald (Pokémon Emerald)
- Earthbound
- FF6 (Final Fantasy VI)
- Lufia 2
- Goonies 2
- Pac-Man (Pac-Man Arrangement)
- DOOM (GBA version)
- Undertale
- Pocky (and Rocky 2)
- Skyroads
- Yoshi's (Island)
- S. Metroid (Super Metroid)
- Tazmania
- Black Bass (Super Black Bass 3)
- Loopz
- Color config
- Personalization of the practice menu colors. The following preset colors are available:
000000
Black
F8F8F8
White
C06000
Brown
A8A8A8
Gray
C00000
Red
E0A800
Yellow
20C028
Green
4870D0
Blue
C8C8F8
Periwinkle
000090
Dark Blue
06A969
Lui green
20A8F8
Glan blue fantasy
F8B000
Orange
782878
Purple
605800
Garbage
8090A0
Blilver
F858A8
Pink
F76D61
Peach42
2AA8D9
Siriusly?
B8D850
Chartreuse
FFBFFF
Blunt pink
78886A
Igarashi Futaba