Download

Latest (SA-1)

This version should be used by any system that can properly emulate the SA-1 with 256kb of BWRAM.

Compatible systems:

  • 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.

List of shame:

  • 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

Button When Action
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 (link)

  • 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

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
  1. No
  2. Normal
  3. Silver
Boom
  1. No
  2. Blue
  3. Red
Hookshot
Yes/No
Bombs
0–30
Powder
  1. No
  2. Mushroom
  3. 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
  1. No
  2. Shovel
  3. Inactive flute
  4. Active flute
Net
Yes/No
Book
Yes/No
Bottles
For each bottle (1–4):
  1. No
  2. Unobtainable shroooom
  3. Empty
  4. Red potion
  5. Green potion
  6. Blue potion
  7. Fairy
  8. Bee
  9. 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
  1. No
  2. Fighter
  3. Master
  4. Tempered
  5. Gold
Shield
  1. No
  2. Fighter
  3. Red
  4. Mirror
Armor
  1. Green jerkin
  2. Blue
  3. Red
Gloves
  1. No
  2. Power glove
  3. 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
  1. None
  2. Zelda
  3. Garbage
  4. Trash
  5. Old man
  6. Zelda Text
  7. Blind
  8. Frog
  9. Dwarf
  10. Sign man
  11. Kiki
  12. ??????
  13. Purple chest
  14. Super bomb
  15. 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
  • EG 0
  • Strong
  • Weak
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
  1. Random
  2. Yellow
  3. Blue
Helmasaur
  1. Random
  2. No fireball
  3. Fireball
Ganon warps
  1. Random
  2. No warp
  3. Warp
Ganon warp to
  1. Random
  2. Far left
  3. Bottom left
  4. Bottom right
  5. Far right
Eyegore walk
  1. Random
  2. Short
  3. Medium
  4. Long
Arrghus walk
  1. Random
  2. Shortest
  3. Short
  4. Medium
  5. Long
  6. Longest
Turtle walk
Random, 32 fixed RNGs
Lanmola exit
Random, fixed {X,Y} for 0≤X≤7; 0≤Y≤7
Moth conveyor
  1. Random
  2. Right
  3. Left
  4. Up
  5. Down
First Vitty
  1. Random
  2. Slot 5
  3. Slot 6
  4. Slot 7
  5. Slot 8
  6. Slot 9
  7. Slot A
  8. Slot B
  9. Slot C
  10. 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