User:Cassidymoen!2979/SRAM Map: Difference between revisions

From ALttPR Wiki
Jump to navigation Jump to search
Line 350: Line 350:
* {{MemoryValue|00}} = Unset, Will put Link in his bed state at the beginning of the game. (Also can't use sword or shield)
* {{MemoryValue|00}} = Unset, Will put Link in his bed state at the beginning of the game. (Also can't use sword or shield)
* {{MemoryValue|01}} = You have a sword and start in the castle on start up.
* {{MemoryValue|01}} = You have a sword and start in the castle on start up.
* {{MemoryValue|02}} = Indicates you have completed the first Hyrule Castle dungeon.
* {{MemoryValue|02}} = Indicates you have completed [[Hyrule Castle Escape]].
* {{MemoryValue|03}} = Indicates you have beaten Agahnim and are now searching for crystals.
* {{MemoryValue|03}} = Indicates you have beaten Agahnim in [[Hyrule Castle Tower]] and are now searching for crystals.
* {{MemoryValue|04}} and above = meaningless. Though, you could write code using them to expand the event system perhaps.
* {{MemoryValue|04}} and above = meaningless. Though, you could write code using them to expand the event system perhaps.


Line 363: Line 363:


Starting Entrance to use: '''$3C8''': Abbreviations:
Starting Entrance to use: '''$3C8''': Abbreviations:
* LH = Link's House;
* LH = [[Link's House]];
* SA = Sanctuary;
* SA = [[Sanctuary]];
* MC = Mountain Cave;
* MC = [[Mountain Cave]];
* PP = Pyramid of Power in DW;   
* PP = [[Pyramid of Power]] in DW;   
      
      
* {{MemoryValue|00}} = Start the game in Link's house always.
* {{MemoryValue|00}} = Start the game in [[Link's House]] always.
* {{MemoryValue|01}} = SA.
* {{MemoryValue|01}} = [[Sanctuary|SA]].
* {{MemoryValue|02}} = Start in Zelda's Cell (entrance index sanc?).
* {{MemoryValue|02}} = Start in {{Dungeon Location|Hyrule Castle|Zelda's Cell}} (entrance index sanc?).
* {{MemoryValue|03}} = Secret passage under HC garden (near dying uncle).
* {{MemoryValue|03}} = [[Secret Passage]] under [[Hyrule Castle]] garden (near dying uncle).
* {{MemoryValue|05}} = LH or SA or MC.
* {{MemoryValue|05}} = [[Link's House|LH]] or [[Sanctuary|SA]] or [[Mountain Cave|MC]].
          
          


Progress Indicator 3 (bitwise) '''$3C9}}:
Progress Indicator 3 (bitwise) '''$3C9}}:
* {{MemoryValue|00}} = If set, means the bum gave you his bottle already.
* {{MemoryValue|00}} = [[Hobo]] gave you his item.
* {{MemoryValue|01}} = If set, means that the salesman in the village sold you a bottle already
* {{MemoryValue|01}} = [[Bottle Merchant]] gave you his item.
* {{MemoryValue|02}} =  
* {{MemoryValue|02}} =  
* {{MemoryValue|03}} = Flute Boy (DW) has been arborated
* {{MemoryValue|03}} = [[Stumpy]] (DW) has been arborated
* {{MemoryValue|04}} = Thief's Chest has been opened by the middle aged guy
* {{MemoryValue|04}} = [[Purple Chest]] has been opened
* {{MemoryValue|05}} = After you save the Smithy's partner, this bit gets set.
* {{MemoryValue|05}} = [[Blacksmith]]'s partner saved
* {{MemoryValue|06}}
* {{MemoryValue|06}}
* {{MemoryValue|07}} = Means Smithies have your sword. Once they give it back it's no longer set. (so nonpermanent)
* {{MemoryValue|07}} = [[Blacksmith]]s have your sword (unset when sword returned)


Lightworld / Darkworld '''$3CA''':
Lightworld / Darkworld '''$3CA''':
Line 392: Line 392:
* {{MemoryValue|04}}
* {{MemoryValue|04}}
* {{MemoryValue|05}}
* {{MemoryValue|05}}
* {{MemoryValue|06}} = If set, we're in dark world. Otherwise, in light world.
* {{MemoryValue|06}} = In Dark World, unset is in Light World
* {{MemoryValue|07}}
* {{MemoryValue|07}}


Line 403: Line 403:
Note: Don't use a value of {{MemoryValue|0F}} or larger here, as it will likely crash the game.
Note: Don't use a value of {{MemoryValue|0F}} or larger here, as it will likely crash the game.
      
      
* {{MemoryValue|00}} = Tagalong disabled
* {{MemoryValue|00}} = Tagalong disabled
* {{MemoryValue|01}} = Princess Zelda
* {{MemoryValue|01}} = [[Princess Zelda]]
* {{MemoryValue|02}} = ???
* {{MemoryValue|02}} = ???
* {{MemoryValue|03}} = ???
* {{MemoryValue|03}} = ???
* {{MemoryValue|04}} = Old Man?
* {{MemoryValue|04}} = Old Man?
* {{MemoryValue|05}} = Zelda (invisible) bitching at you about coming to rescue her.
* {{MemoryValue|05}} = [[Zelda]] (invisible) bitching at you about coming to rescue her.
* {{MemoryValue|06}} = Blind masquerading as a Maiden
* {{MemoryValue|06}} = Blind [[Maiden]]
* {{MemoryValue|07}} = Missing Dwarf (smithyfrog as I call him) in DW
* {{MemoryValue|07}} = [[Blacksmith]] [[Frog]] (smithyfrog as I call him) in DW
* {{MemoryValue|08}} = Missing Dwarf in LW
* {{MemoryValue|08}} = [[Blacksmith]] [[Dwarf]] in LW
* {{MemoryValue|09}} = Middle Aged Guy w/ Sign
* {{MemoryValue|09}} = Middle Aged Guy w/ Sign
* {{MemoryValue|0A}} = Kiki the monkey
* {{MemoryValue|0A}} = [[Kiki]]
* {{MemoryValue|0B}} = ???
* {{MemoryValue|0B}} = ???
* {{MemoryValue|0C}} = Thief's chest
* {{MemoryValue|0C}} = [[Purple Chest]]
* {{MemoryValue|0D}} = Super Bomb
* {{MemoryValue|0D}} = [[Super Bomb]]
* {{MemoryValue|0E}} = Activated in reaction to acquiring the Master Sword. Used to trigger a telepathic message from Zelda indicating that Agahnim's goons have come for her at Sanctuary.
* {{MemoryValue|0E}} = Activated in reaction to acquiring the Master Sword. Used to trigger a telepathic message from Zelda indicating that Agahnim's goons have come for her at Sanctuary.



Revision as of 20:16, 27 March 2020

Overview

This document is intended to be an SRAM reference for the randomizer base ROM. The base ROM expands the SRAM size to 32k and removes the last two save files. Credit to MathOnNapkins, the editors of the vanilla ALttP wiki, and the randomizer ROM developers who have documented nearly all of this information elsewhere.

Checksum

The SRAM save loading routing relies upon an "inverse" checksum. Changes to any byte in the SRAM between $00 and $4FE must be added or subtracted to this checksum or the save file will be deleted. The checksum can be computed by adding every word between the beginning of the file and $4FE and subtracting the sum from 0x5A5A*, using overflowing arithmetic for both operations.

SRAM Map

$000 to $24F - Room Data

There are 296 ($128) rooms in in the ROM. Each room's data occupies one word, or two bytes.

High Byte
128 64 32 16 8 4 2 1
d d d d b k c/k c/r
Low Byte
128 64 32 16 8 4 2 1
c c c c q q q q


  • d - door opened (either unlocked, bombed or other means)
  • b - boss battle won
  • k - key or item (such as a 300 rupee gift)
  • c - chest, big key chest, or big key lock. Any combination of them totaling to 6 is valid.
  • r - special rupee tiles, whether they've been obtained or not.
  • q - quadrants visited:

The quadrant bits corresponds to quadrants 4, 3, 2, and 1 in that order which is also how the quadrants are laid out on a tile from left to right (upper left, upper right, lower left, lower right), so if quadrants 4 and 1 have been "seen" by Link, then qqqq will look like 1001.

$250 to $27F - Unused

$280 to $2FF - Overworld Event Information

Each area occupies one byte.

? h o ? ? ? s ?

  • o - If set, the area will draw its designated overlay when you enter it. e.g. If you're triggered misery mire then the entrance shows up there the next time you enter that area. You can view overlays in the latest release of Hyrule Magic (v0.963). Other overlays include stairs leading underground, and the removal of the weather vane after it has exploded.
  • s - If set, the area will draw its secondary overlay when you enter it.
  • h - If set, heart piece has been collected in this area already. Also used for a handful of other sprites.
  • ? - Unknown, possibly unused.

$300 to $33F - Shop Purchase Counts

The randomizer ROM uses new shop code to handle loading and configuration of shops which allows the higher-level item and entrance randomizers to use clean, convenient abstractions for changing them. Through these abstractions, the randomizer can dictate a certain number of times that a shop item can be re-purchased (e.g. you can only buy capacity upgrades seven times.) The bytes here (except for $300 which is currently unknown) are used to count how many times a single item in a shop has been purchased. They are dynamically assigned at generation time, which is to say that any single byte should not be considered statically bound to a certain item in a shop. Take-Any caves as well as the old man with the sword in Retro world state are considered shops in this context.

Note 1: This is noted as a "temporary home" for the shop purchase counts in the base rom's source code

Note 2: Jumping into deep water without flippers and being placed back on land on the Hobo and Zora's Domain maps are known to overwrite $302 and $304 respectively. This has no effect if a shop item can always be repurchased, but will lead to unintended behavior if the item can only be purchased a limited amount of times.

$340 to $38B - Items & Equipment

Address Item Values Notes
$340 Bow 0x00* - Nothing 0x01* - Bow 0x02* - Bow & Arrows 0x03* - Silver Arrow Bow 0x04* - Bow & Silver Arrows
$341 Boomerang 0x00* - Nothing 0x01* - Blue 0x02* - Red
$342 Hookshot 0x00* - No 0x01* - Yes
$343 Bombs How many bombs you have   Can exceed 0x32*, up to 0xFF*.
$344 Magic Powder 0x00* - Nothing 0x01* - Mushroom 0x02* - Magic Powder
$345 Fire Rod 0x00* - No 0x01* - Yes
$346 Ice Rod 0x00* - No 0x01* - Yes
$347 Bombos Medallion 0x00* - No 0x01* - Yes
$348 Ether Medallion 0x00* - No 0x01* - Yes
$349 Quake Medallion 0x00* - No 0x01* - Yes
$34A Lamp 0x00* - No 0x01* - Yes
$34B Magic Hammer 0x00* - No 0x01* - Yes
$34C Flute 0x00* - Nothing 0x01* - Shovel 0x02* - Flute 0x03* - Flute & Bird
$34D Bug-Catching Net 0x00* - No 0x01* - Yes
$34E Book of Mudora 0x00* - No 0x01* - Yes
$34F Bottles 0x00* - Nothing 0x01* - Bottle 1 (0x7EF35C*) 0x02* - Bottle 2 (0x7EF35D*) 0x03* - Bottle 3 (0x7EF35E*) 0x04* - Bottle 4 (0x7EF35F*)
$350 Cane of Somaria 0x00* - No 0x01* - Yes
$351 Cane of Byrna 0x00* - No 0x01* - Yes
$352 Magic Cape 0x00* - No 0x01* - Yes
$353 Magic Mirror 0x00* - Nothing 0x01* - Magic Scroll 0x02* - Magic Mirror
Gloves 0x00* - Nothing 0x01* - Power Glove 0x02* - Titan's Mitt
$355 Pegasus Boots 0x00* - No 0x01* - Yes   See $379.
$356 Zora's Flippers 0x00* - No 0x01* - Yes   See $379.
$357 Moon Pearl 0x00* - No 0x01* - Yes
$358 Unused
$359 Sword 0x00* - No Sword 0x01* - Fighters' Sword 0x02* - Master Sword 0x03* - Tempered Sword 0x04* - Golden Sword
$35A Shield 0x00* - No Shield 0x01* - Fighters' Shield 0x02* - Fire Shield 0x03* - Mirror Shield
$35B Armor 0x00* - Green Mail 0x01* - Blue Mail 0x02* - Red Mail
$35C to $35F Bottle Contents 0x00* - No Bottle 0x01* - Mushroom 0x02* - Empty Bottle 0x03* - Red Potion 0x04* - Green Potion
0x05* - Blue Potion 0x06* - Fairy 0x07* - Bee 0x08* - Good Bee
$360 to $361 Wallet Capacity  
$362 to $363 Rupee Count
Item Address Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7
Compass1 $364 Unused Unused Ganon's Tower Turtle Rock Thieves' Town Tower of Hera Ice Palace Skull Woods
BigKey1 $366
Dungeon Map1 $368
Compass2 $365 Misery Mire Palace of Darkness Swamp Palace Hyrule Castle Tower Desert Palace Eastern Palace Hyrule Castle Sewer Passage
BigKey2 $367
Dungeon Map2 $369

Wishing Pond Rupee $36A

  • Unused

Heart Pieces collected:

  • $36B. Number of heart pieces (out of four) you have earned

Health: $36C

  • Health Capacity. Each increment of 0x08* is worth one heart.
  • 0x04* is a half heart. The max is generally 0xA0*. The game is coded to not accept health values beyond this.
  • $36D. Actual Health. Same as above, but this reflects your current health status rather than potential.

Magic Power: $36E

  • Magic power ranges from 0x00* to 0x80*. Each small bottle refills 0x10*. Setting Magic above 0x80* causes the magic meter to glitch and you can't use special items.

Small Keys: $36F

  • Number of Keys you have in the dungeon you are currently in. If you're in a non-keyed dungeon it will generally read 0xFF*.

Bomb Capacity Upgrades: $370

  • Number of bombs you can hold above the default value (10).

Arrow Capacity Upgrades: $371

  • Number of arrows you can hold above the default value (30)

Hearts filler: $372

  • Write to this location to fill in a set number of hearts. Make sure to write in a multiple of 0x08* Otherwise, you will end up filling the whole life meter.

Magic filler: $373

  • Write to this location how much magic power you want filled up. The maximum effective value is 0x80*.

Pendants: $374

  • Bit 0: Red Pendant
  • Bit 1: Blue Blue Pendant
  • Bit 2: Green Green Pendant

Bomb filler: $375

  • Write to this location to add X bombs to your arsenal. It will not exceed your maximum, as defined with $370.

Arrow filler: $376

  • Write to this location to add X arrows to your arsenal. It will not exceed your maximum, as defined with $371.

Arrows: $377

????: $378

  • ????

Ability Flags: $379

  • Bit 0:
  • Bit 1: Swim
  • Bit 2: Run / Dash
  • Bit 3: Pull
  • Bit 4: ----
  • Bit 5: Talk
  • Bit 6: Read
  • Bit 7: ----

Crystals: $37A

  • Bit 0: Crystal 6
  • Bit 1: Crystal 1
  • Bit 2: Crystal 5
  • Bit 3: Crystal 7
  • Bit 4: Crystal 2
  • Bit 5: Crystal 4
  • Bit 6: Crystal 3

Magic Consumption: $37B

  • 0x00*: Normal Consumption
  • 0x01*: 1/2 Consumption (1/2 Magic)
  • 0x02*: 1/4 Consumption (1/4 Magic)

Keys earned per dungeon: (TODO: confirm this and other keys-related values for rando)

Game Event Information

Progress Indicator $3C5: (TODO: Check these for rando)

  • 0x00* = Unset, Will put Link in his bed state at the beginning of the game. (Also can't use sword or shield)
  • 0x01* = You have a sword and start in the castle on start up.
  • 0x02* = Indicates you have completed Hyrule Castle Escape.
  • 0x03* = Indicates you have beaten Agahnim in Hyrule Castle Tower and are now searching for crystals.
  • 0x04* and above = meaningless. Though, you could write code using them to expand the event system perhaps.

Progress Flags $3C6 (bitflags):

  • Progress flags in the vanilla game. Usually set to 0x18* or 0x20* in randomizer.

Map Icons Indicator 2 $3C7:

  • Presumed to be unused in randomizer.

Starting Entrance to use: $3C8: Abbreviations:


Progress Indicator 3 (bitwise) $3C9}}:

Lightworld / Darkworld $3CA:

  • 0x00*
  • 0x01*
  • 0x02*
  • 0x03*
  • 0x04*
  • 0x05*
  • 0x06* = In Dark World, unset is in Light World
  • 0x07*

Unused? $3CB:

  • ?????

$3CC[0x01] - (Tagalong)

  • Tagalong Indicator (who is following you, if anyone?) (value based)

Note: Don't use a value of 0x0F* or larger here, as it will likely crash the game.

  • 0x00* = Tagalong disabled
  • 0x01* = Princess Zelda
  • 0x02* = ???
  • 0x03* = ???
  • 0x04* = Old Man?
  • 0x05* = Zelda (invisible) bitching at you about coming to rescue her.
  • 0x06* = Blind Maiden
  • 0x07* = Blacksmith Frog (smithyfrog as I call him) in DW
  • 0x08* = Blacksmith Dwarf in LW
  • 0x09* = Middle Aged Guy w/ Sign
  • 0x0A* = Kiki
  • 0x0B* = ???
  • 0x0C* = Purple Chest
  • 0x0D* = Super Bomb
  • 0x0E* = Activated in reaction to acquiring the Master Sword. Used to trigger a telepathic message from Zelda indicating that Agahnim's goons have come for her at Sanctuary.

$03CD[0x02] -

  • Cached Y coordinate of Tagalong after it has been lost by the player. Applies to the old man and to the super bomb, at the very least. This is intended to be used not as a save game variable, but rather as a means of picking the Tagalong back up by getting in contact with it.

$03CF[0x02] -

  • Cached X coordinate of Tagalong after it has been lost by the player. Applies to the old man and to the super bomb, at the very least. This is intended to be used not as a save game variable, but rather as a means of picking the Tagalong back up by getting in contact with it.

$3D1:

  • ????

$3D2:

$3D3:

  • Set to 0x00* normally. Set to 0x80* if a Super Bomb is going off.

$3D4 to $3D8:

  • ????

Player's Name (first four characters) $3D9 to $3E4:

  • The randomizer base ROM does not use the 2nd and 3rd save files, so the player can use all 12 characters for their name. The first four are here. The remaining characters can be found in two locations: immediately after the following checksum validity value and at 0x500* - 0x50F*
  • Note each of the six letters is represented by a 16-bit number.

Validity (Checksum) of the File: $3E5 to $3E6:

  • There is a subroutine in the ROM that checks to make sure this word value is 0x55AA*. If changed, the save file will be deleted when the game boots.

$3E7 to $3F0

  • Characters 6-12 of the file name. Note that the above validity value occupies the space where the 6th character would be if the full name were present here.

$3F1 to $467 - Game Stats

$3F1 to $402

  • In vanilla this and some previous bytes stored death totals for each dungeon.
  • TODO: investigate this


Life/Save Counter: $403}} to $404

  • Counts the number of times your saved or died in the game, before you beat it.

PostGame Death Counter: $405 to $406

  • When you start the game this is written to with the value -1 (0xFFFF*). On the game select screen, it will only display a number if this is not 0xFFFF*. The max displayable number is 999.

When you beat the game, the number of times you died gets recorded here.

$407 to $467

  • TODO: Fill this in

Inverse Checksum: $4FE to $4FF

TODO: These character values are very different in JP1.0

Character Codes:

Alpha-numeric

00 = A
01 = B
02 = C
03 = D
04 = E
05 = F
06 = G
07 = H
08 = I^
09 = J
0A = K
0B = L
0C = M
0D = N
OE = O
OF = P
10 = ??
20 = Q
21 = R
22 = S
23 = T
24 = U
25 = V
26 = W
27 = X
28 = Y
29 = Z
2A = a
2B = b
2C = c
2D = d
2E = e
2F = f
40 = g
41 = h
42 = k
43 = j
44 = i
45 = l
46 = m
47 = n
48 = o
49 = p
4A = q
4B = r
4C = s
4D = t
4E = u
4F = v
60 = w
61 = x
62 = y
63 = z
64 = 0
65 = 1
66 = 2
67 = 3
68 = 4
69 = 5
6A = 6
6B = 7
6C = 8
6D = 9
6E = "?"
6F = "!"
80 = " = "
81 = "."
82 = ","

85 = "("
86 = ")"

Special characters (not normally accessible. This is by far an incomplete listing)

0xA0* small right Arrow
0xA1* "'" (apostrophe)
0xA2* HPiece Again
0xA3* "empty right hand heart cont."
0xA4* see
0xA7*
0xA5* Same As
0xA7*
0xA6* "Quarter Heart piece, top right corner."
0xA7* "Heart piece,left half"
0xA8* "Heart piece, right half"
0xA9* blank
0xAA* "left Arrow"


SNES Button Alphabet:

0xAB* A
0xAC* B
0xAD* X
0xAE* Y
0xAF* I
0xB1* blank^

^This code is not the canon encoding of this character. ex. 0xAF* is the proper "I". 0x08* is not.