From fcd9b949e8b3637726bf94ac95a7f73545115191 Mon Sep 17 00:00:00 2001 From: cassidy Date: Wed, 1 Dec 2021 19:48:18 -0500 Subject: [PATCH] Initial SRAM module check in Changes to save.asm and fileselect.asm to account for new WRAM buffer at $7F6000 saved at $700500, length $1000. Moves and additions noted at bottom of sram.asm, to be removed later. --- fileselect.asm | 17 +- save.asm | 25 ++- sram.asm | 569 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 592 insertions(+), 19 deletions(-) create mode 100644 sram.asm diff --git a/fileselect.asm b/fileselect.asm index a494226..8aed309 100644 --- a/fileselect.asm +++ b/fileselect.asm @@ -1,4 +1,3 @@ -!ExtendedPlayerName = "$700500" !ValidKeyLoaded = "$7F509E" ;FS prefix means file_select, since these defines and macros are specific to this screen @@ -136,22 +135,22 @@ DrawPlayerFileShared: LDA.b #FileSelectItems>>16 : PHA : PLB REP #$20 ; restore 16 bit accumulator - LDA !ExtendedPlayerName+$00 : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$08 : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,5) - LDA !ExtendedPlayerName+$02 : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$0A : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,6) - LDA !ExtendedPlayerName+$04 : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$0C : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,7) - LDA !ExtendedPlayerName+$06 : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$0E : ORA.w #!FS_COLOR_BW %fs_draw8x16(6,8) - LDA !ExtendedPlayerName+$08 : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$10 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,5) - LDA !ExtendedPlayerName+$0A : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$12 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,6) - LDA !ExtendedPlayerName+$0C : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$14 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,7) - LDA !ExtendedPlayerName+$0E : ORA.w #!FS_COLOR_BW + LDA ExtendedFileNameSRAM+$16 : ORA.w #!FS_COLOR_BW %fs_draw8x16(9,8) JSR FileSelectDrawHudBar diff --git a/save.asm b/save.asm index 1b41061..da75292 100644 --- a/save.asm +++ b/save.asm @@ -27,6 +27,11 @@ RTL ;-------------------------------------------------------------------------------- ClearExtendedWRAMSaveFile: STA $7EF400, X ; what we wrote over +; STA $7F6000, X + STA $7F6100, X + STA $7F6200, X + STA $7F6300, X + STA $7F6400, X STA $7F6500, X STA $7F6600, X STA $7F6700, X @@ -55,16 +60,16 @@ CopyExtendedSaveFileToWRAM: LDA #$80 : STA $4301 ; set bus B source to WRAM register - LDA #$00 : STA $2181 ; set WRAM register source address - LDA #$65 : STA $2182 - LDA #$7F : STA $2183 + LDA #$00 : STA $2181 ; set WRAM register source address + LDA #$60 : STA $2182 + LDA #$7F : STA $2183 STZ $4302 ; set bus A destination address to SRAM - LDA #$05 : STA $4303 - LDA #$70 : STA $4304 + LDA #$05 : STA $4303 + LDA #$70 : STA $4304 LDA #$00 : STA $4305 ; set transfer size to 0xB00 - LDA #$0B : STA $4306 ; STZ $4307 + LDA #$10 : STA $4306 ; STZ $4307 LDA #$01 : STA $420B ; begin DMA transfer ;-------------------------------------------------------------------------------- @@ -97,15 +102,15 @@ CopyExtendedWRAMSaveFileToSRAM: STA $4301 ; set bus B source to WRAM register - LDA #$00 : STA $2181 ; set WRAM register source address - LDA #$65 : STA $2182 - LDA #$7F : STA $2183 + LDA #$00 : STA $2181 ; set WRAM register source address + LDA #$60 : STA $2182 + LDA #$7F : STA $2183 STZ $4302 ; set bus A destination address to SRAM LDA #$05 : STA $4303 LDA #$70 : STA $4304 - LDA #$00 : STA $4305 ; set transfer size to 0xB00 + LDA #$10 : STA $4305 ; set transfer size to 0xB00 LDA #$0B : STA $4306 ; STZ $4307 LDA #$01 : STA $420B ; begin DMA transfer diff --git a/sram.asm b/sram.asm new file mode 100644 index 0000000..d7bea70 --- /dev/null +++ b/sram.asm @@ -0,0 +1,569 @@ +;================================================================================ +; 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 +BottleContentsOne: skip 1 ; \ Bottle Contents +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) +;-------------------------------------------------------------------------------- + ; Dungeon item bitfields +CompassFieldOne: skip 2 ; \ - - g r t h i s +BigKeyFieldOne: skip 2 ; | g = Ganon's Tower | r = Turtle Rock | t = Thieves' Town +MapFieldOne: skip -3 ; / h = Tower of Hera | i = Ice Palace | s = Skull Woods +CompassFieldTwo: skip 2 ; \ m d s a t e h p +BigKeyFieldTwo: skip 2 ; | m = Misery Mire | d = Palace of Darkness | s = Swamp Palace +MapFieldTwo: skip 1 ; | a = Aga Tower | t = Desert Palace | e = Eastern Palace + ; / h = Hyrule Castle | s = Sewer Passage +;-------------------------------------------------------------------------------- + ; HUD & other equipment +skip 1 ; Wishing Pond Rupee (Unused) +HeartPieceFraction: skip 1 ; Heart pieces of four for 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) +HeartFiller: 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) +BombFiller: skip 1 ; Bombs collected yet to be filled (integer) +ArrowFiller: 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 +CurrentCrystals: 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 +HyruleCastleKeys: skip 1 ; / and decrement together +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 2 ; Unused + +;================================================================================ +; Tracking & Indicators ($7EF38C - $7EF3F0) +;-------------------------------------------------------------------------------- +InventoryTracking: skip 2 ; b r m p n s k f (bitfield) + ; b = Blue Boomerang | r = Red Boomerang | m = Mushroom Current + ; p = Magic Powder | n = Mushroom Past | s = Shovel + ; k = Inactive Flute | f = Active Flute +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 3 ; Keeps track of limited non-progressive items such as lamp. + ; See: ItemSubstitutionRules in tables.asm +skip 50 ; +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 +HeartPiecesPendants: skip 1 ; h h h h - - p p (packed integers) + ; h = Heart Pieces collected | p = Pendants collected +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) +HeartPieces: skip 1 ; Total number of heart pieces collected (integer) +DeathCounter: skip 1 ; Number of deaths (integer) +skip 1 ; Reserved +FluteCounter: skip 1 ; Number of times fluted (integer) +skip 6 ; +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) +skip 48 ; 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 CompassFieldOne = $7EF364, "Compass bitfield labeled at incorrect address" +assert CompassFieldTwo = $7EF365, "Compass bitfield labeled at incorrect address" +assert BigKeyFieldOne = $7EF366, "Big Key item bitfield labeled at incorrect address" +assert BigKeyFieldTwo = $7EF367, "Big Key item bitfield labeled at incorrect address" +assert MapFieldOne = $7EF368, "Map item bitfield labeled at incorrect address" +assert MapFieldTwo = $7EF369, "Map item bitfield labeled at incorrect address" +;-------------------------------------------------------------------------------- +assert HeartPieceFraction = $7EF36B, "HeartPieceFraction 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 HeartFiller = $7EF372, "HeartFiller labeled at incorrect address" +assert MagicFiller = $7EF373, "MagicFiller labeled at incorrect address" +assert PendantsField = $7EF374, "PendantsField labeled at incorrect address" +assert BombFiller = $7EF375, "BombFiller labeled at incorrect address" +assert ArrowFiller = $7EF376, "ArrowFiller labeled at incorrect address" +assert CurrentArrows = $7EF377, "CurrentArrows labeled at incorrect address" +assert AbilityFlags = $7EF379, "AbilityFlags labeled at incorrect address" +assert CurrentCrystals = $7EF37A, "CurrentCrystals 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 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 HeartPiecesPendants = $7EF429, "HeartPiecesPendants 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 HeartPieces = $7EF448, "HeartPieces labeled at incorrect address" +assert DeathCounter = $7EF449, "DeathCounter labeled at incorrect address" +assert FluteCounter = $7EF44B, "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 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 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 +; +; 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 +; +;-------------------------------------------------------------------------------- +