Files
alttpr-baserom/sram.asm
cassidy 2e97329250 Refactor inventory code and add more labels
Refactored highest sword, shield, and mail counting
Refactored how heart pieces, heart containers, and crystals are counted
Moved quickswap lock bit to high byte of InventoryTracking
Fixed sword and shield item downgrade
Added PreFluteLocations counter
2021-12-07 20:49:58 -05:00

581 lines
40 KiB
NASM

;================================================================================
; SRAM Labels & Assertions
;--------------------------------------------------------------------------------
; Labels for values in SRAM and assertions that ensure they're correct and
; at the expected addresses. All values larger than one byte are little endian.
;--------------------------------------------------------------------------------
; $7EF000 - $7EF4FF in WRAM maps to the first $4FF bytes in SRAM (Bank $70)
; $7F6000 - $7F6FFF in WRAM maps to the next 4k bytes, occupying the 2nd and 3rd vanilla
; save file locations. ($700500 - $701500)
;--------------------------------------------------------------------------------
;================================================================================
; Room Data ($7EF000 - $7EF27F
;--------------------------------------------------------------------------------
; Each room has two bytes. There are 296 ($128) rooms in the ROM. The data beyond
; $7EF24F is unused. The current room index is located at $A0 in WRAM (16-bits.)
;
; The quadrant bits from left to right correspond to quadrants
; 4 (northwest), 3 (northeast), 2 (southwest), and 1 (southeast), which is the same
; as they are laid out on the screen from left to right, top to bottom.
;
; Example: We can use RoomData[$37].Low to read or write the pot key in the first
; floodable room in Swamp Palace ($04)
;--------------------------------------------------------------------------------
; Low Byte: d d d d b k u r
; High Byte: c c c c q q q q
;
; d = Door opened (key, bomb wall, etc)
; b = Boss kill / Heart Piece
; k = Key
; u = Second key
; t = Chest 4 / Rupee floor / Swamp drains
; s = Chest 3 / Bomable floor / PoD or Desert wall
; e = Chest 2
; h = Chest 1
; c = Chest 0
; q = Quadrant visits
;--------------------------------------------------------------------------------
struct RoomData $7EF000
.Low: skip 1
.High: skip 1
endstruct align 2
;================================================================================
; Overworld Event Data ($7EF280 - $7EF33F)
;--------------------------------------------------------------------------------
; Each overworld area has one byte. The overworld screen index is located at $8A
; in WRAM (16-bits.)
;
; This label can be indexed with a plus symbol (e.g. The Hyrule Castle screen would
; be OverworldData+$1B or OverworldData+27)
;--------------------------------------------------------------------------------
; - i o - - - b -
;
; i = Free-standing item collected. Also used for sprites like the castle tower barrier
; o = Overlay active
; b = Secondary overlay active
;--------------------------------------------------------------------------------
OverworldData = $7EF280
;================================================================================
; Items & Equipment ($7EF340 - $7EF38B)
;--------------------------------------------------------------------------------
; Current equipment labels & values
; Values will represent current menu selection in cases where player can switch
; items (e.g. holding powder and mushroom at the same time.)
;
; $00 = None
;--------------------------------------------------------------------------------
base $7EF340
SRAMEquipment: ;
BowEquipment: skip 1 ; $01 = Bow | $02 = Bow & Arrows
; $03 = Silver Arrow Bow | $04 = Bow & Silver Arrows
BoomerangEquipment: skip 1 ; $01 = Blue | $02 = Red
HookshotEquipment: skip 1 ; $01 = Hookshot
BombsEquipment: skip 1 ; Number of bombs currently held (8-bit integer)
PowderEquipment: skip 1 ; $01 = Mushroom | $02 = Powder
FireRodEquipment: skip 1 ; $01 = Fire Rod
IceRodEquipment: skip 1 ; $01 = Ice Rod
BombosEquipment: skip 1 ; $01 = Bombos Medallion
EtherEquipment: skip 1 ; $01 = Ether Medallion
QuakeEquipment: skip 1 ; $01 = Quake Medallion
LampEquipment: skip 1 ; $01 = Lamp
HammerEquipment: skip 1 ; $01 = Hammer
FluteEquipment: skip 1 ; $01 = Shovel | $02 = Inactive Flute | $03 = Active Flute
BugNetEquipment: skip 1 ; $01 = Bug Net
BookOfMudoraEquipment: skip 1 ; $01 = Book of Mudora
BottleIndex: skip 1 ; Current bottle in menu. 1-based index into BottleContents below
SomariaEquipment: skip 1 ; $01 = Cane of Somaria
ByrnaEquipment: skip 1 ; $01 = Cane of Byrna
CapeEquipment: skip 1 ; $01 = Magic Cape
MirrorEquipment: skip 1 ; $01 = Scroll (graphic only) | $02 = Mirror
GloveEquipment: skip 1 ; $01 = Power Gloves | $02 = Titan's Mitts
BootsEquipment: skip 1 ; \ $01 = Boots/Flippers | These only show menu item
FlippersEquipment: skip 1 ; / Correct bits must be set in AbilityFlags to dash/swim
MoonPearlEquipment: skip 1 ; $01 = Moon Pearl
skip 1 ; Not used
SwordEquipment: skip 1 ; $01 = Fighter | $02 = Master | $03 = Tempered | $04 = Gold
ShieldEquipment: skip 1 ; $01 = Fighter | $02 = Red | $03 = Mirror
ArmorEquipment: skip 1 ; $00 = Green | $01 = Blue | $02 = Red
BottleContents: ; \ Bottle Contents
BottleContentsOne: skip 1 ; |
BottleContentsTwo: skip 1 ; | $00 = No Bottle | $01 = Mushroom | $02 = Empty Bottle
BottleContentsThree: skip 1 ; | $03 = Red Potion | $04 = Green Potion | $05 = Blue Potion
BottleContentsFour: skip 1 ; / $06 = Fairy | $07 = Bee | $08 = Good Bee
TargetRupees: skip 2 ; \ CurrentRupees will always increment or decrement to match
CurrentRupees: skip 2 ; / TargetRupees if not equal (16-bit integer)
;--------------------------------------------------------------------------------
CompassField: skip 2 ; Dungeon item bitfields
BigKeyField: skip 2 ; Low byte: - - g r t h i s
MapField: skip 2 ; g = Ganon's Tower | r = Turtle Rock | t = Thieves' Town
; h = Tower of Hera | i = Ice Palace | s = Skull Woods
;------------------------------------------------
; High Byte: m d s a t e h p
; m = Misery Mire | d = Palace of Darkness | s = Swamp Palace
; a = Aga Tower | t = Desert Palace | e = Eastern Palace
; h = Hyrule Castle | s = Sewer Passage
;--------------------------------------------------------------------------------
; HUD & other equipment
skip 1 ; Wishing Pond Rupee (Unused)
HeartPieceQuarter: skip 1 ; Heart pieces of four for health upgrade. Wraps around to $00 after $03.
HealthCapacity: skip 1 ; \ Health Capacity & Current Health
CurrentHealth: skip 1 ; / Max value is $A0 | $04 = half heart | $08 = heart
CurrentMagic: skip 1 ; Current magic | Max value is $80
CurrentSmallKeys: skip 1 ; Number of small keys held for current dungeon (integer)
BombCapacityUpgrades: skip 1 ; \ Bomb & Arrow Capacity Upgrades
ArrowCapacityUpgrades: skip 1 ; / Indicates flatly how many can be held above vanilla max (integers)
HeartsFiller: skip 1 ; Hearts collected yet to be filled. Write in multiples of $08
MagicFiller: skip 1 ; Magic collected yet to be filled
PendantsField: skip 1 ; - - - - - g b r (bitfield)
; g = Green (Courage) | b = Blue (Power) | r = Red (Wisdom)
BombsFiller: skip 1 ; Bombs collected yet to be filled (integer)
ArrowsFiller: skip 1 ; Arrows collected yet to be filled (integer)
CurrentArrows: skip 1 ; Current arrows (integer)
skip 1 ; Unknown
AbilityFlags: skip 1 ; - r t - p d s - (bitfield)
; r = Read | t = Talk | p = Pull | d = Dash
; s = Swim
CrystalsField: skip 1 ; - 3 4 2 7 5 1 6 (bitfield)
MagicConsumption: skip 1 ; $00 = Normal | $01 = Half Magic | $02 = Quarter Magic
;--------------------------------------------------------------------------------
; Small keys earned per dungeon (integers)
SewerKeys: skip 1 ; \ Hyrule Castle and Sewer keys typically increment
DungeonKeys: ; | and decrement together
HyruleCastleKeys: skip 1 ; /
EasternKeys: skip 1 ; Eastern Palace small keys
DesertKeys: skip 1 ; Desert Palace small keys
CastleTowerKeys: skip 1 ; Agahnim's Tower small keys
SwampKeys: skip 1 ; Swamp Palace small keys
PalaceOfDarknessKeys: skip 1 ; Palace of Darkness small keys
MireKeys: skip 1 ; Misery Mire small keys
SkullWoodsKeys: skip 1 ; Skull Woods small keys
IcePalaceKeys: skip 1 ; Ice Palace small keys
HeraKeys: skip 1 ; Tower of Hera small keys
ThievesTownKeys: skip 1 ; Thieves' Town small keys
TurtleRockKeys: skip 1 ; Turtle Rock small keys
GanonsTowerKeys: skip 1 ; Ganon's Tower small keys
skip 1 ; Unused
CurrentGenericKeys: skip 1 ; Generic small keys
;================================================================================
; Tracking & Indicators ($7EF38C - $7EF3F0)
;--------------------------------------------------------------------------------
InventoryTracking: skip 2 ; b r m p n s k f - - - - - - - q (bitfield)
; b = Blue Boomerang | r = Red Boomerang | m = Mushroom Current
; p = Magic Powder | n = Mushroom Past | s = Shovel
; k = Inactive Flute | f = Active Flute | q = Quickswap locked
BowTracking: skip 2 ; b s p - - - - - (bitfield)
; b = Bow | s = Silver Arrows Upgrade | p = Second Progressive Bow
; The front end writes two distinct progressive bow items. p
; indicates whether the "second" has been found independent of
; the first
ItemLimitCounts: skip 10 ; Keeps track of limited non-progressive items such as lamp.
; See: ItemSubstitutionRules in tables.asm
skip 43 ;
ProgressIndicator: skip 1 ; $00 = Pre-Uncle | $01 = Post-Uncle item | $02 = Zelda Rescued
; $03 = Agahnim 1 defeated
; $04 and above don't do anything. $00-$02 used in standard mode
ProgressFlags: skip 1 ; - - - u - z - s (bitfield)
; u = Uncle left house | z = Mantle | s = Uncle item obtained
MapIcons: skip 1 ; Used for deciding which icons to display on OW map
; $03 = Pendants | $04 = Master Sword | $05 = Skull at Hyrule Castle
; $06 = Crystal 1 | $07 = All Crystals | $08 = Skull at Ganon's Tower
StartingEntrance: skip 1 ; Starting entrance to use
; $00 = Link's House | $01 = Menu or Pyramid w/ Aga dead & mirror
; $02 = Zelda's Cell | $03 = Secret Passage or HC if entered (escape)
; $04 = Throne Room (escape) | $05 = Old Man Cave w/ Old Man
NpcFlagsVanilla: skip 1 ; - - b p s - m h (bitfield)
; b = Frog rescued | p = Purple Chest | s = Stumpy (tree kid)
; m = Bottle Merchant | h = Hobo
CurrentWorld: skip 1 ; $00 = Light World | $40 = Dark World
skip 1 ; Unused
FollowerIndicator: skip 1 ; $00 = No Follower | $01 = Zelda | $04 = Old Man
; $06 = Blind Maiden | $07 = Frog | $08 = Dwarf
; $09 = Locksmith | $0A = Kiki | $0C = Purple Chest
; $0D = Big Bomb
FollowerXCoord: skip 2 ; \ Cached X and Y overworld coordinates of dropped follower
FollowerYCoord: skip 2 ; / (16-bit integers)
DroppedFollowerIndoors: skip 1 ; $00 = Dropped follower outdoors | $01 = Dropped follower indoors
DroppedFollowerLayer: skip 1 ; $00 = Upper layer | $01 = Lower layer
FollowerDropped: skip 1 ; Set to $80 when a follower exists and has been dropped somewhere
; $00 otherwise
skip 5 ; Unused
skip 8 ; Unused
FileValidity: skip 2 ; Always $55AA. Don't write.
;================================================================================
; Rando-Specific Assignments & Game Stats ($7EF3F1 - $7EF4FF)
;--------------------------------------------------------------------------------
skip 28 ; Unused
GameCounter: skip 2 ; Number of deaths and save + quits (16-bit integer)
PostGameCounter: skip 2 ; Initialized to $FFFF, replaced with GameCounter on goal completion
; Number is displayed on file select when not $FFFF. Max 999 (16-bit integer)
skip 13 ;
NpcFlagsOne: skip 1 ; l - c s t k z o (bitfield)
; l = Library | c = Catfish | s = Sahasrahla | t = Stumpy
; k = Sick Kid | z = King Zora | o = Old Man
NpcFlagsTwo: skip 1 ; b - p m f s b e (bitfield)
; b = Magic Bat | p = Potion Shop (Powder) | m = Lost Woods (Mushroom)
; f = Fairy (unused) | s = Smith | b = Bombos Tablet
; e = Ether Tablet
skip 2 ; Unused
MapOverlay: skip 2 ; Used to reveal dungeon prizes on the map in modes where maps,
; Saha, and the bomb shop guy reveal dungeon prizes (bitfield)
; \ - - g r t h i s
; | g = Ganon's Tower | r = Turtle Rock | t = Thieves' Town
; / h = Tower of Hera | i = Ice Palace | s = Skull Woods
; \ m d s a t e h p
; | m = Misery Mire | d = Palace of Darkness | s = Swamp Palace
; | a = Aga Tower | t = Desert Palace | e = Eastern Palace
; / h = Hyrule Castle | s = Sewer Passage
GeneralFlags: skip 1 ; - - h - p i - g (bitfield)
; h = HUD Flag | p = Force pyramid
; i = Ignore faeries | g = Has diggable grove item
HighestSword: skip 1 ; Highest sword level (integer)
GoalCounter: skip 2 ; Goal items collected (16-bit integer)
ProgrammableItemOne: skip 2 ; \ Reserved for programmable items
ProgrammableItemTwo: skip 2 ; |
ProgrammableItemThree: skip 2 ; /
BonkCounter: skip 1 ; Number of times the player has bonked (integer)
YAItemCounter: skip 1 ; y y y y y a a a (packed integers)
; Number of Y and A items collected represented as packed integers
HighestShield: skip 1 ; Highest Shield level
TotalItemCounter: skip 2 ; Total items collected (integer)
TemperedGoldBosses: skip 1 ; t t t t g g g g (packed integers)
; t = Tempered Sword boss kills | g = Gold Sword boss kills
FighterMasterBosses: skip 1 ; f f f f m m m m (packed integers)
; f = Fighter Sword boss kills | m = Master Sword boss kills
BigKeysBigChests: skip 1 ; k k k k c c c c (packed integers)
; k = Big Keys collected | c = Big Chests opened
MapsCompasses: skip 1 ; m m m m c c c c (packed integers)
; m = Maps collected | c = Compasses collected
PendantCounter: skip 1 ; Number of pendants collected (integer)
PreGTBKLocations: skip 1 ; Locations checked in GT before finding the big key
; b = Big Bomb Acquired | s = Silver Arrows Acquired
; c = GT locations collected before big key
RupeesSpent: skip 2 ; Rupees spent (16-bit integer)
SaveQuits: skip 1 ; Number of times player has saved and quit (integer)
LoopFrames: skip 4 ; Frame counter incremented during frame hook (32-bit integer)
PreBootsLocations: skip 2 ; Number of locations checked before getting boots (integer)
PreMirrorLocations: skip 2 ; Number of locations checked before getting mirror (integer)
PreFluteLocations: skip 2 ; Number of locations checked before getting flute (integer)
skip 2 ; Unused
OverworldMirrors: skip 1 ; Number of times mirror used on overworld (integer)
UnderworldMirrors: skip 1 ; Number of times mirror used in underworld (integer)
ScreenTransitions: skip 2 ; Number of screen transitions (16-bit integer)
NMIFrames: skip 4 ; Frame counter incremented during NMI hook (32-bit integer)
ChestsOpened: skip 1 ; Number of chests opened. Doesn't count NPC, free standing items etc (integer)
StatsLocked: skip 1 ; Set to $01 when goal is completed; game stops counting stats.
MenuTime: skip 4 ; Total menu time in frames (32-bit integer)
HeartContainerCounter: skip 1 ; Total number of heart containers collected (integer)
DeathCounter: skip 1 ; Number of deaths (integer)
skip 1 ; Reserved
FluteCounter: skip 1 ; Number of times fluted (integer)
skip 4 ;
RNGItem: skip 2 ; RNG Item
SwordlessBosses: skip 1 ; Number of bosses killed without a sword (integer)
FaerieRevivalCounter: skip 1 ; Number of faerie revivals (integer)
ChallengeTimer: skip 4 ; Timer used for OHKO etc
SwordTime: skip 4 ; Time first sword found in frames (32-bit integer)
BootsTime: skip 4 ; Time boots found in frames (32-bit integer)
FluteTime: skip 4 ; Time flute found in frames (32-bit integer)
MirrorTime: skip 4 ; Time mirror found in frames (32-bit integer)
ChestTurnCounter: skip 1 ; Number of chest turns (integer)
CapacityUpgrades: skip 1 ; Number of capacity upgrades collected (integer)
DamageCounter: skip 2 ; Damage taken by player (16-bit integer)
MagicCounter: skip 2 ; Magic used by player (16-bit integer)
HighestMail: skip 1 ; Highest mail level
SmallKeyCounter: skip 1 ; Total Number of small keys collected (integer)
HeartPieceCounter: skip 1 ; Total Number of heartpieces collected (integer)
CrystalCounter: skip 1 ; Total Number of crystals collected (integer)
skip 46 ; Unused
ServiceSequence: skip 1 ; Service sequence value. See servicerequest.asL
skip 49 ; Unused
; \ Dungeon locations checked counters (integers)
HCLocations: skip 1 ; | Hyrule Castle
SewerLocations: skip 1 ; | Sewer Passage
EPLocations: skip 1 ; | Eastern Palace
DPLocations: skip 1 ; | Desert Palace
CTLocations: skip 1 ; | Agahnim's Tower
SPLocations: skip 1 ; | Swamp Palace
PDLocations: skip 1 ; | Palace of Darkness
MMLocations: skip 1 ; | Misery Mire
SWLocations: skip 1 ; | Skull Woods
IPLocations: skip 1 ; | Ice Palace
THLocations: skip 1 ; | Tower of Hera
TTLocations: skip 1 ; | Thieves' Town
TRLocations: skip 1 ; | Turtle Rock
GTLocations: skip 1 ; / Ganon's Tower
; \ Chest Key Counters. Only counts keys placed in chests. (integers)
HCChestKeys: skip 1 ; | Hyrule Castle
SewerChestKeys: skip 1 ; | Sewer Passage
EPChestKeys: skip 1 ; | Eastern Palace
DPChestKeys: skip 1 ; | Desert Palace
CTChestKeys: skip 1 ; | Agahnim's Tower
SPChestKeys: skip 1 ; | Swamp Palace
PDChestKeys: skip 1 ; | Palace of Darkness
MMChestKeys: skip 1 ; | Misery Mire
SWChestKeys: skip 1 ; | Skull Woods
IPChestKeys: skip 1 ; | Ice Palace
THChestKeys: skip 1 ; | Tower of Hera
TTChestKeys: skip 1 ; | Thieves' Town
TRChestKeys: skip 1 ; | Turtle Rock
GTChestKeys: skip 1 ; / Ganon's Tower
skip 2 ; Unused
FileMarker: skip 1 ; $FF = Active save file | $00 = Inactive save file
skip 13 ; Unused
InverseChecksum: skip 2 ; Vanilla Inverse Checksum. Don't write unless computing checksum.
;================================================================================
; Expanded SRAM ($7F6000 - $7F6FFF)
;--------------------------------------------------------------------------------
; This $1000 byte segment is saved beginning where the second save file was in SRAM
; beginning at $700500
;--------------------------------------------------------------------------------
base $7F6000 ; $1000 byte buffer we place beginning at second save file
ExtendedFileNameSRAM = $706000 ; We read and write the file name directly from and to SRAM
ExtendedFileNameWRAM: skip 24 ; File name, 12 word-length characters.
VERSION: skip 4 ; $0000 = Default TODO
RoomPotData: skip 592 ; Table for expanded pot shuffle
PurchaseCounts: skip 96 ; Keeps track of shop purchases
DummyValue: skip 1 ; $01 if you're a real dummy
;--------------------------------------------------------------------------------
base $7F1000 ;
RomName: ; ROM name from $FFC0, burned in during init (21 bytes)
; If value in the ROM doesn't match SRAM, save is cleared.
base off
;================================================================================
; Vanilla Assertions
;--------------------------------------------------------------------------------
; All of these need to pass for the base rom to build or something is probably
; very wrong.
;--------------------------------------------------------------------------------
assert SRAMEquipment = $7EF340, "SRAMEquipment labeled at incorrect address"
assert BowEquipment = $7EF340, "BowEquipment labeled at incorrect address"
assert BoomerangEquipment = $7EF341, "BoomerangEquipment labeled at incorrect address"
assert HookshotEquipment = $7EF342, "HookshotEquipment labeled at incorrect address"
assert BombsEquipment = $7EF343, "BombsEquipment labeled at incorrect address"
assert PowderEquipment = $7EF344, "PowderEquipment labeled at incorrect address"
assert FireRodEquipment = $7EF345, "FireRodEquipment labeled at incorrect address"
assert IceRodEquipment = $7EF346, "IceRodEquipment labeled at incorrect address"
assert BombosEquipment = $7EF347, "BombosEquipment labeled at incorrect address"
assert EtherEquipment = $7EF348, "EtherEquipment labeled at incorrect address"
assert QuakeEquipment = $7EF349, "QuakeEquipment labeled at incorrect address"
assert LampEquipment = $7EF34A, "LampEquipment labeled at incorrect address"
assert HammerEquipment = $7EF34B, "HammerEquipment labeled at incorrect address"
assert FluteEquipment = $7EF34C, "FluteEquipment labeled at incorrect address"
assert BugNetEquipment = $7EF34D, "BugNetEquipment labeled at incorrect address"
assert BookOfMudoraEquipment = $7EF34E, "BookOfMudoraEquipment labeled at incorrect address"
assert BottleIndex = $7EF34F, "BottleIndex labeled at incorrect address"
assert SomariaEquipment = $7EF350, "SomariaEquipment labeled at incorrect address"
assert ByrnaEquipment = $7EF351, "ByrnaEquipment labeled at incorrect address"
assert CapeEquipment = $7EF352, "CapeEquipment labeled at incorrect address"
assert MirrorEquipment = $7EF353, "MirrorEquipment labeled at incorrect address"
assert GloveEquipment = $7EF354, "GloveEquipment labeled at incorrect address"
assert BootsEquipment = $7EF355, "BootsEquipment labeled at incorrect address"
assert FlippersEquipment = $7EF356, "FlippersEquipment labeled at incorrect address"
assert MoonPearlEquipment = $7EF357, "MoonPearlEquipment labeled at incorrect address"
assert SwordEquipment = $7EF359, "SwordEquipment labeled at incorrect address"
assert ShieldEquipment = $7EF35A, "ShieldEquipment labeled at incorrect address"
assert ArmorEquipment = $7EF35B, "ArmorEquipment labeled at incorrect address"
assert BottleContentsOne = $7EF35C, "BottleContentsOne labeled at incorrect address"
assert BottleContentsTwo = $7EF35D, "BottleContentsTwo labeled at incorrect address"
assert BottleContentsThree = $7EF35E, "BottleContentsThree labeled at incorrect address"
assert BottleContentsFour = $7EF35F, "BottleContentsFour labeled at incorrect address"
assert TargetRupees = $7EF360, "TargetRupees labeled at incorrect address"
assert CurrentRupees = $7EF362, "CurrentRupees labeled at incorrect address"
;--------------------------------------------------------------------------------
assert CompassField = $7EF364, "Compass bitfield labeled at incorrect address"
assert BigKeyField = $7EF366, "Big Key item bitfield labeled at incorrect address"
assert MapField = $7EF368, "Map item bitfield labeled at incorrect address"
;--------------------------------------------------------------------------------
assert HeartPieceQuarter = $7EF36B, "HeartPieceQuarter labeled at incorrect address"
assert HealthCapacity = $7EF36C, "HealthCapacity labeled at incorrect address"
assert CurrentHealth = $7EF36D, "CurrentHealth labeled at incorrect address"
assert CurrentMagic = $7EF36E, "CurrentMagic labeled at incorrect address"
assert CurrentSmallKeys = $7EF36F, "CurrentSmallKeys labeled at incorrect address"
assert BombCapacityUpgrades = $7EF370, "BombCapacityUpgrades labeled at incorrect address"
assert ArrowCapacityUpgrades = $7EF371, "ArrowCapacityUpgrades labeled at incorrect address"
assert HeartsFiller = $7EF372, "HeartsFiller labeled at incorrect address"
assert MagicFiller = $7EF373, "MagicFiller labeled at incorrect address"
assert PendantsField = $7EF374, "PendantsField labeled at incorrect address"
assert BombsFiller = $7EF375, "BombsFiller labeled at incorrect address"
assert ArrowsFiller = $7EF376, "ArrowsFiller labeled at incorrect address"
assert CurrentArrows = $7EF377, "CurrentArrows labeled at incorrect address"
assert AbilityFlags = $7EF379, "AbilityFlags labeled at incorrect address"
assert CrystalsField = $7EF37A, "CrystalsField labeled at incorrect address"
assert MagicConsumption = $7EF37B, "MagicConsumption labeled at incorrect address"
;--------------------------------------------------------------------------------
assert SewerKeys = $7EF37C, "SewerKeys labeled at incorrect address"
assert HyruleCastleKeys = $7EF37D, "HyruleCastleKeys labeled at incorrect address"
assert EasternKeys = $7EF37E, "EasternKeys labeled at incorrect address"
assert DesertKeys = $7EF37F, "DesertKeys labeled at incorrect address"
assert CastleTowerKeys = $7EF380, "CastleTowerKeys labeled at incorrect address"
assert SwampKeys = $7EF381, "SwampKeys labeled at incorrect address"
assert PalaceOfDarknessKeys = $7EF382, "PalaceOfDarknessKeys labeled at incorrect address"
assert MireKeys = $7EF383, "MireKeys labeled at incorrect address"
assert SkullWoodsKeys = $7EF384, "SkullWoodsKeys labeled at incorrect address"
assert IcePalaceKeys = $7EF385, "IcePalaceKeys labeled at incorrect address"
assert HeraKeys = $7EF386, "HeraKeys labeled at incorrect address"
assert ThievesTownKeys = $7EF387, "ThievesTownKeys labeled at incorrect address"
assert TurtleRockKeys = $7EF388, "TurtleRockKeys labeled at incorrect address"
assert GanonsTowerKeys = $7EF389, "GanonsTowerKeys labeled at incorrect address"
assert CurrentGenericKeys = $7EF38B, "CurrentGenericKeys labeled at incorrect address"
;--------------------------------------------------------------------------------
assert ProgressIndicator = $7EF3C5, "ProgressIndicator labeled at incorrect address"
assert ProgressFlags = $7EF3C6, "ProgressFlags labeled at incorrect address"
assert MapIcons = $7EF3C7, "MapIcons labeled at incorrect address"
assert StartingEntrance = $7EF3C8, "StartingEntrance labeled at incorrect address"
assert NpcFlagsVanilla = $7EF3C9, "NpcFlagsVanilla labeled at incorrect address"
assert CurrentWorld = $7EF3CA, "CurrentWorld labeled at incorrect address"
assert FollowerIndicator = $7EF3CC, "FollowerIndicator labeled at incorrect address"
assert FollowerXCoord = $7EF3CD, "FollowerXCoord labeled at incorrect address"
assert FollowerYCoord = $7EF3CF, "FollowerYCoord labeled at incorrect address"
assert DroppedFollowerIndoors = $7EF3D1, "DroppedFollowerIndoors labeled at incorrect address"
assert DroppedFollowerLayer = $7EF3D2, "DroppedFollowerLayer labeled at incorrect address"
assert FollowerDropped = $7EF3D3, "FollowerDropped labeled at incorrect address"
assert FileValidity = $7EF3E1, "FileValidity labeled at incorrect address"
assert InverseChecksum = $7EF4FE, "InverseChecksum labeled at incorrect address"
;================================================================================
; Randomizer Assertions
;--------------------------------------------------------------------------------
; Trackers and other third party consumers may depend on these values
;--------------------------------------------------------------------------------
assert InventoryTracking = $7EF38C, "InventoryTracking labeled at incorrect address"
assert BowTracking = $7EF38E, "BowTracking labeled at incorrect address"
assert ItemLimitCounts = $7EF390, "ItemLimitCounts labeled at incorrect address"
;--------------------------------------------------------------------------------
assert GameCounter = $7EF3FF, "GameCounter labeled at incorrect address"
assert PostGameCounter = $7EF401, "PostGameCounter labeled at incorrect address"
assert NpcFlagsOne = $7EF410, "NPCFlagsOne labeled at incorrect address"
assert NpcFlagsTwo = $7EF411, "NPCFlagsTwo labeled at incorrect address"
assert MapOverlay = $7EF414, "MapOverlay labeled at incorrect address"
assert GeneralFlags = $7EF416, "GeneralFlags labeled at incorrect address"
assert HighestSword = $7EF417, "HighestSword labeled at incorrect address"
assert GoalCounter = $7EF418, "GoalCounter labeled at incorrect address"
assert ProgrammableItemOne = $7EF41A, "ProgrammableItemOne labeled at incorrect address"
assert ProgrammableItemTwo = $7EF41C, "ProgrammableItemTwo labeled at incorrect address"
assert ProgrammableItemThree = $7EF41E, "ProgrammableItemThree labeled at incorrect address"
assert BonkCounter = $7EF420, "BonkCounter labeled at incorrect address"
assert YAItemCounter = $7EF421, "YAItemCounter labeled at incorrect address"
assert HighestShield = $7EF422, "SwordsShields labeled at incorrect address"
assert TotalItemCounter = $7EF423, "TotalItemCounter labeled at incorrect address"
assert TemperedGoldBosses = $7EF425, "TemperedGoldBosses labeled at incorrect address"
assert FighterMasterBosses = $7EF426, "FighterMasterBosses labeled at incorrect address"
assert BigKeysBigChests = $7EF427, "BigKeysBigChests labeled at incorrect address"
assert MapsCompasses = $7EF428, "MapsCompasses labeled at incorrect address"
assert PendantCounter = $7EF429, "PendantCounter labeled at incorrect address"
assert PreGTBKLocations = $7EF42A, "PreGTBKLocations labeled at incorrect address"
assert RupeesSpent = $7EF42B, "RupeesSpent labeled at incorrect address"
assert SaveQuits = $7EF42D, "SaveQuits labeled at incorrect address"
assert LoopFrames = $7EF42E, "LoopFrames labeled at incorrect address"
assert PreBootsLocations = $7EF432, "PreBootsLocations labeled at incorrect address"
assert PreMirrorLocations = $7EF434, "PreMirrorLocations labeled at incorrect address"
assert PreFluteLocations = $7EF436, "PreFluteLocations labeled at incorrect address"
assert OverworldMirrors = $7EF43A, "OverworldMirrors labeled at incorrect address"
assert UnderworldMirrors = $7EF43B, "UnderworldMirrors labeled at incorrect address"
assert ScreenTransitions = $7EF43C, "ScreenTransitions labeled at incorrect address"
assert NMIFrames = $7EF43E, "NMIFrames labeled at incorrect address"
assert ChestsOpened = $7EF442, "ChestsOpened labeled at incorrect address"
assert StatsLocked = $7EF443, "StatsLocked labeled at incorrect address"
assert MenuTime = $7EF444, "MenuTime labeled at incorrect address"
assert HeartContainerCounter = $7EF448, "HeartContainerCounter labeled at incorrect address"
assert DeathCounter = $7EF449, "DeathCounter labeled at incorrect address"
assert FluteCounter = $7EF44B, "FluteCounter labeled at incorrect address"
assert RNGItem = $7EF450, "FluteCounter labeled at incorrect address"
assert SwordlessBosses = $7EF452, "SwordlessBosses labeled at incorrect address"
assert FaerieRevivalCounter = $7EF453, "FaerieRevivalCounter labeled at incorrect address"
assert ChallengeTimer = $7EF454, "ChallengeTimer labeled at incorrect address"
assert SwordTime = $7EF458, "SwordTime labeled at incorrect address"
assert BootsTime = $7EF45C, "BootsTime labeled at incorrect address"
assert FluteTime = $7EF460, "FluteTime labeled at incorrect address"
assert MirrorTime = $7EF464, "MirrorTime labeled at incorrect address"
assert ChestTurnCounter = $7EF468, "ChestTurnCounter labeled at incorrect address"
assert CapacityUpgrades = $7EF469, "CapacityUpgrades labeled at incorrect address"
assert DamageCounter = $7EF46A, "DamageCounter labeled at incorrect address"
assert MagicCounter = $7EF46C, "MagicCounter labeled at incorrect address"
assert HighestMail = $7EF46E, "HighestMail labeled at incorrect address"
assert SmallKeyCounter = $7EF46F, "SmallKeyCounter labeled at incorrect address"
assert HeartPieceCounter = $7EF470, "HeartPieceCounter labeled at incorrect address"
assert CrystalCounter = $7EF471, "CrystalCounter labeled at incorrect address"
;--------------------------------------------------------------------------------
assert ServiceSequence = $7EF4A0, "ServiceSequence labeled at incorrect address"
;--------------------------------------------------------------------------------
assert HCLocations = $7EF4D2, "HCLocations labeled at incorrect address"
assert SewerLocations = $7EF4D3, "SewersLocations labeled at incorrect address"
assert EPLocations = $7EF4D4, "EPLocations labeled at incorrect address"
assert DPLocations = $7EF4D5, "DPLocations labeled at incorrect address"
assert CTLocations = $7EF4D6, "CTLocations labeled at incorrect address"
assert SPLocations = $7EF4D7, "SPLocations labeled at incorrect address"
assert PDLocations = $7EF4D8, "PDLocations labeled at incorrect address"
assert MMLocations = $7EF4D9, "MMLocations labeled at incorrect address"
assert SWLocations = $7EF4DA, "SWLocations labeled at incorrect address"
assert IPLocations = $7EF4DB, "IPLocations labeled at incorrect address"
assert THLocations = $7EF4DC, "THLocations labeled at incorrect address"
assert TTLocations = $7EF4DD, "TTLocations labeled at incorrect address"
assert TRLocations = $7EF4DE, "TRLocations labeled at incorrect address"
assert GTLocations = $7EF4DF, "GTLocations labeled at incorrect address"
assert HCChestKeys = $7EF4E0, "HCChestKeys labeled at incorrect address"
assert SewerChestKeys = $7EF4E1, "SewerChestKeys labeled at incorrect address"
assert EPChestKeys = $7EF4E2, "EPChestKeys labeled at incorrect address"
assert DPChestKeys = $7EF4E3, "DPChestKeys labeled at incorrect address"
assert CTChestKeys = $7EF4E4, "ATChestKeys labeled at incorrect address"
assert SPChestKeys = $7EF4E5, "SPChestKeys labeled at incorrect address"
assert PDChestKeys = $7EF4E6, "PDChestKeys labeled at incorrect address"
assert MMChestKeys = $7EF4E7, "MMChestKeys labeled at incorrect address"
assert SWChestKeys = $7EF4E8, "SWChestKeys labeled at incorrect address"
assert IPChestKeys = $7EF4E9, "IPChestKeys labeled at incorrect address"
assert THChestKeys = $7EF4EA, "THChestKeys labeled at incorrect address"
assert TTChestKeys = $7EF4EB, "TTChestKeys labeled at incorrect address"
assert TRChestKeys = $7EF4EC, "TRChestKeys labeled at incorrect address"
assert GTChestKeys = $7EF4ED, "GChestKeys labeled at incorrect address"
assert FileMarker = $7EF4F0, "FileMarker labeled at incorrect address"
;--------------------------------------------------------------------------------
assert ExtendedFileNameWRAM = $7F6000, "Filename labeled at incorrect address"
assert VERSION = $7F6018, "VERSION labeled at incorrect address"
assert RoomPotData = $7F601C, "RoomPotData labeled at incorrect address"
assert PurchaseCounts = $7F626C, "PurchaseCounts labeled at incorrect address"
assert DummyValue = $7F62CC, "DummyValue labeled at incorrect address"
;--------------------------------------------------------------------------------
assert RomName = $7F1000, "RomName at incorrect address"
;--------------------------------------------------------------------------------
; MOVED TODO
;--------------------------------------------------------------------------------
; CapacityUpgrades: 7ef452 -> 7ef469
; file name: 3e3-3f0, -> 7ef500
; shop purchase counts: 7ef302 -> 7ef51a - 7ef579
; GoalCounter: 7ef418 -> 7ef418 (2 bytes)
; HighestMail: 7ef424 -> 7ef470
; HighestShield: 7ef422 -> swords using HighestSword, shields removed from general flags
; SmallKeyCounter: 7ef424 -> 7ef471
; ServiceSequence: 7ef419 -> 7ef418 (two bytes reserved)
; SwordsShields: 7ef422 -> swords using HighestSword
; PreMirrorLocations: 7ef432 -> 7ef434, PreBoots and PreMirror now 2 bytes
; Heart Pieces: 7ef429 -> 7ef470
; Pendant counter: 7ef429, now an integer
; SwordlessBosses: 7ef452, now an integer
;
; DungeonLocations values and labels moved to block right before ChestKeys block
; starting at address 7ef472
;
; bombs (?), silvers, and pre gtbk at $7ef42a now just pre gtbk
;
; whole file name now at $7F6000/706000, first four still at vanilla location
;--------------------------------------------------------------------------------
; ADDED
;--------------------------------------------------------------------------------
;
; PreFluteLocations = $7EF436
; VERSION = $7F6018
; RoomPotData = $7F601C
; PurchaseCounts = $7F601C
; DummyValue = $7F607C
;
;--------------------------------------------------------------------------------