SMW Memory Map
Displaying 150 out of 840 addresses.
View: moderated | waiting (19)
RAM Address | Length | Type | Description | Details |
---|---|---|---|---|
$7E0000 | 16 bytes | Misc. | Scratch RAM, is and can be used for a big number of purposes. The general purpose is temporarily preserving a value for later use in a routine. Of note is the following address, used in LM ASM hacks: $7E:0003 (16-bit) - Block number from LM Map16 editor. Also used in the custom Map16 tile change routine. |
|
$7E0010 | 1 byte | Flag | If the value in it is not zero, run the actual game; otherwise, loop forever. It's set to a non-zero value during NMI, and it's set to zero after the game mode has been run, so that the game runs exactly once a frame - one NMI trigger per frame. | |
$7E0011 | 1 byte | Flag | Used to distinguish IRQ #1 from IRQ #2's code. (Inside the Morton/Ludwig/Roy room, where IRQ is used twice, although it can be used in other areas that run IRQ as well.) #$00 = IRQ #1; #$01 = IRQ #2. | |
$7E0012 | 1 byte | Graphics | Stripe image loader - value must be divisible by 3. | Valid Values |
$7E0013 | 1 byte | Counter | "True" frame counter. Increments once per frame, except when the game is lagging. Note that $7E:0014 is better suited for most purposes. | |
$7E0014 | 1 byte | Counter | "Effective" frame counter. Stops when, for example, RAM addresses such as $7E:009D are not zero (lock sprite flag, usually indicates the player is dying, grabbing a powerup, or something similar). Inside sprite code, this address is often preferred over $7E:0013, especially in graphics routines, as graphics will not be updated when the player dies if this address is used as an index to the tilemap. | |
$7E0015 | 1 byte | I/O | Controller buttons currently held down. Format: byetUDLR. b = A or B; y = X or Y; e = select; t = Start; U = up; D = down; L = left, R = right. |
|
$7E0016 | 1 byte | I/O | Controller buttons newly pressed this frame. Format: byetUDLR. b = B only; y = X or Y; e = select; t = Start; U = up; D = down; L = left, R = right. |
|
$7E0017 | 1 byte | I/O | Controller buttons currently held down. Format: axlr----. a = A; x = X; l = L; r = R, - = null/unused. |
|
$7E0018 | 1 byte | I/O | Controller buttons newly pressed this frame. Format: axlr----. a = A; x = X; l = L; r = R, - = null/unused. |
|
$7E0019 | 1 byte | Player | Current player powerup status. | Valid Values |
$7E001A | 2 bytes | Hardware mirror | Layer 1 X position, current frame. Mirror of SNES register $210D. For autoscrolling Layer 1, see $1462 instead. |
|
$7E001C | 2 bytes | Hardware mirror | Layer 1 Y position, current frame. Mirror of SNES register $210E. For autoscrolling Layer 1, see $1464 instead. |
|
$7E001E | 2 bytes | Hardware mirror | Layer 2 X position, current frame. Mirror of SNES register $210F. For autoscrolling Layer 2, see $1466 instead. |
|
$7E0020 | 2 bytes | Hardware mirror | Layer 2 Y position, current frame. Mirror of SNES register $2110. For autoscrolling Layer 2, see $1468 instead. |
|
$7E0022 | 2 bytes | Hardware mirror | Layer 3 X position. Mirror of SNES register $2111. | |
$7E0024 | 2 bytes | Hardware mirror | Layer 3 Y position. Mirror of SNES register $2112. | |
$7E0026 | 2 bytes | Misc. | If Layer 3 tides are disabled, this is the X offset of Layer 2 from Layer 1, calculated as $1466 - $1462. If Layer 3 tides are enabled, it is instead the X offset of Layer 3 from Layer 1, calculated as $22 - $1462. Used for handling interaction with Layer 2/3. |
|
$7E0028 | 2 bytes | Misc. | If Layer 3 tides are disabled, this is the Y offset of Layer 2 from Layer 1, calculated as $1468 - $1464. If Layer 3 tides are enabled, it is instead the Y offset of Layer 3 from Layer 1, calculated as $24 - $1464. Used for handling interaction with Layer 2/3. |
|
$7E002A | 2 bytes | Hardware mirror | Mode 7 Center X position. Mirror of SNES register $211F, + #$0080. | |
$7E002C | 2 bytes | Hardware mirror | Mode 7 Center Y position. Mirror of SNES register $2120, + #$0080. | |
$7E002E | 2 bytes | Hardware mirror | Mode 7 matrix parameter A. Mirror of SNES register $211B. | |
$7E0030 | 2 bytes | Hardware mirror | Mode 7 matrix parameter B. Mirror of SNES register $211C. | |
$7E0032 | 2 bytes | Hardware mirror | Mode 7 matrix parameter C. Mirror of SNES register $211D. | |
$7E0034 | 2 bytes | Hardware mirror | Mode 7 matrix parameter D. Mirror of SNES register $211E. | |
$7E0036 | 2 bytes | Misc. | Mode 7 rotation. Its values are calculated and stored into the respective Mode 7 parameter mirrors at $7E:002E through $7E:0035. Values #$0000 through #$01FF are all different values, after that it's the same pattern - that is, if you add this 16-bit address with #$0200, there is a 360 degree rotation. Furthermore, this address is used in the brown chained platform code as an index to the sine and cosine tables at $07:F7DB. |
|
$7E0038 | 2 bytes | Misc. | Mode 7 scaling; that is, making Layer 1 shrink or grow. Its values are calculated and stored into the respective Mode 7 parameter mirrors at $7E:002E through $7E:0035. The first byte - $7E:0038 - is used for horizontal scaling, whereas the second byte - $7E:0039 - is used for vertical scaling. Default value is #$20. The closer to #$00, the more the layer grows, the further from #$00, the more the layer shrinks. Value #$10 makes the layer twice as large as value #$20, value #$40 makes the layer twice as small as value #$20, etc. |
|
$7E003A | 2 bytes | Hardware mirror | Mode 7 Layer 1 X position. Mirror of SNES register $210D. | |
$7E003C | 2 bytes | Hardware mirror | Mode 7 Layer 1 Y position. Mirror of SNES register $210E. | |
$7E003E | 1 byte | Hardware mirror | Background mode select applied with IRQ below status bar (so the area above IRQ is not affected by this). Format: 4321pmmm. 4321 = Layer 1/2/3/4 uses 8x8 tiles when clear, 16x16 tiles when set; p = Layer 3 absolute priority (only in background mode 1); mmm = background mode # (0-7). Mirror of SNES register $2105. |
|
$7E003F | 1 byte | Hardware mirror | OAM Address, low byte. Also known as the mirror of SNES register $2102. High byte is at $00846B. Is sometimes used to alter priority of various sprite tiles, such as with the sprite backgrounds in the boss rooms. | |
$7E0040 | 1 byte | Hardware mirror | CGADSUB settings. Format: shbo4321. s = 0 for adding color layer, 1 for subtracting color layer; h = half-color enable; b = backdrop enable; o = object (aka sprite) enable; 4321 = enable Layer 4, 3, 2, 1 (Layer 3 is only affected below the status bar). Mirror of SNES register $2131. |
|
$7E0041 | 3 bytes | Hardware mirror | Window mask settings. These control which window is for which layer active as well as whether a window is inverted for that layer. Format of each register: ABCDabcd where A/a: Enable window 2 B/b: Invert window 2 C/c: Enable window 1 D/d: Invert window 1 Lower case apply for BG1, BG3 and OBJ (layer 1, 3 and sprites) and upper case apply for BG2, BG4 and COL (layer 2, 4 and colour 0 / fixed colour). $41 (mirror of W12SEL $2123) controls BG1 and BG2 $42 (mirror of W34SEL $2124) controls BG3 and BG4 $43 (mirror of WOBJSEL $2125) controls OBJ and COL |
|
$7E0044 | 1 byte | Hardware mirror | Color addition select. Format: ccmm--sd. cc = clip colors to black before math mm = color math prevention s = add subscreen (replaces fixed color) d = enables direct color mode for 8bpp graphics (modes 3, 4, and 7) For cc and mm, the values they are set to determine when they apply: 00 = never, 01 = outside color window only, 10 = inside color window only, 11 = always. Mirror of SNES register $2130. |
|
$7E0045 | 2 bytes | Camera | Column/row of Map16 tiles to use for VRAM upload when layer 1 is scrolling left/up. Its value is equal to $7E:001A (or $7E:001C if vertical) divided by #$10, minus #$08. | |
$7E0047 | 2 bytes | Camera | Column/row of Map16 tiles to use for VRAM upload when layer 1 is scrolling right/down. Its value is equal to $7E:001A (or $7E:001C if vertical) divided by #$10, plus #$17. | |
$7E0049 | 2 bytes | Camera | Column/row of Map16 tiles to use for VRAM upload when interactive layer 2 is scrolling left/up. Its value is equal to $7E:001E (or $7E:0020 if vertical) divided by #$10 (16), minus #$08. | |
$7E004B | 2 bytes | Camera | Column/row of Map16 tiles to use for VRAM upload when interactive layer 2 is scrolling right/down. Its value is equal to $7E:001E (or $7E:0020 if vertical) divided by #$10, plus #$17. | |
$7E004D | 2 bytes | Camera | Last X/Y value of layer 1 where VRAM upload of Map16 tiles was performed when scrolling left/up. The low 4 bits are forced to zero (AND #$FFF0) in order to get scroll values on a 16 pixel boundary. It is used to determine if a VRAM update is necessary during scrolling. |
|
$7E004F | 2 bytes | Camera | Last X/Y value of layer 1 where VRAM upload of Map16 tiles was performed when scrolling right/down. The low 4 bits are forced to zero (AND #$FFF0) in order to get scroll values on a 16 pixel boundary. It is used to determine if a VRAM update is necessary during scrolling. |
|
$7E0051 | 2 bytes | Camera | Last X/Y value of interactive layer 2 where VRAM upload of Map16 tiles was performed when scrolling left/up. The low 4 bits are forced to zero (AND #$FFF0) in order to get scroll values on a 16 pixel boundary. It is used to determine if a VRAM update is necessary during scrolling. |
|
$7E0053 | 2 bytes | Camera | Last X/Y value of interactive layer 2 where VRAM upload of Map16 tiles was performed when scrolling right/down. The low 4 bits are forced to zero (AND #$FFF0) in order to get scroll values on a 16 pixel boundary. It is used to determine if a VRAM update is necessary during scrolling. |
|
$7E0055 | 1 byte | Camera | Direction of scrolling for Layer 1. #$00 = left (or up); #$02 = right (or down). Used to index the various camera tables at $7E0045 to $7E0048 and $7E004D to $7E0050. When handling routine $00F70D, it is set to $00 if the player's on-screen X position is less than the value of $142A and $02 otherwise. This is used to determine which side to enable spawning sprites depending which side the player is on compared to $142A. It is also temporarily set to #$01 during level load for loading onscreen sprites. |
|
$7E0056 | 1 byte | Camera | Direction of scrolling for Layer 2. #$00 = left (or up); #$02 = right (or down). Used to index the various camera tables at $7E:0049 through $7E:004C and $7E:0051 through $7E:0054. |
|
$7E0057 | 1 byte | Blocks | Used in the level loading code. It's the position within the subscreen. Format: yyyyxxxx, where yyyy is the Y position (units of 16 pixels) and xxxx is the X position. |
|
$7E0058 | 1 byte | Empty | Empty. Cleared on reset, titlescreen load and overworld load. | |
$7E0059 | 1 byte | Blocks | Used in the level loading routine as an indicator for the size of the object, or extended object type depending on what object is being loaded. Could be used as scratch RAM (except in ObjecTool and similar codes). | |
$7E005A | 1 byte | Blocks | Used in the level loading routine as the object number. Could be used as scratch RAM (except in ObjecTool and similar codes). | |
$7E005B | 1 byte | Misc. | Screen mode: CD----Vv. C = Collision with either Layer 2 or Layer 3. D = Disable collision with Layer 1. V = Vertical Layer 2. v = Vertical Layer 1. - = unused. For the most part, this address is managed by a table at $058417, which is indexed by the level mode setting. The only exception to this is that the C bit may also get set if Layer 3 tides are active. |
|
$7E005C | 1 byte | Empty | Empty. Cleared on reset, titlescreen load and overworld load. | |
$7E005D | 1 byte | Misc. | Number of screens in level (equivalent to the "number of screens" setting in Lunar Magic). Note that there is no differentiation here between horizontal and vertical levels, so you will need to check that seperately before using this address to handle the maximum X or Y position of something. See $5E instead for specifically horizontal levels, or $5F for specifically vertical levels. Also set to FF in Ludwig and Reznor's boss rooms. Instead, those rooms used a fixed width of 1.5 screens. |
|
$7E005E | 1 byte | Camera | In horizontal levels, used as the level's width in screens, i.e. the screen number (plus 1) at which the camera should stop scrolling rightwards. Equivalent to the "number of screens" dropdown in Lunar Magic's "Change Properties in Header" dialogue. Not used in vertical levels, where it is always set to 01; see $5F instead. Also set to 00 in Ludwig and Reznor's boss rooms. Instead, those rooms used a fixed width of 1.5 screens. |
|
$7E005F | 1 byte | Camera | In vertical levels, used as the level's height in screens, i.e. the screen number (plus 1) at which the camera should stop scrolling downwards. Equivalent to the "number of screens" dropdown in Lunar Magic's "Change Properties in Header" dialogue. Not used in horizontal levels, where it is always set to 01; see $5E instead. | |
$7E0060 | 4 bytes | Empty | Empty. Cleared on reset, titlescreen load and overworld load. | |
$7E0064 | 1 byte | Misc. | Properties (YXPPCCCT) byte for most sprites inside levels - including the player. Exceptions to this include sprites that mess with sprite priority in a different way, such as Piranha Plants, items coming out of a box (and inside the item box) and Net Koopas behind the nets. | |
$7E0065 | 3 bytes | Pointer | 24-bit pointer to layer 1 data - both level and overworld. Also used during the staff roll sequence of the credits to hold some data about the current line being uploaded to VRAM: - $65-$66 is used to hold the first two bytes of the stripe image header for the current line (in little endian), mainly for keeping track of the Y position. - $67 tracks the current line number being written, with a line defined as two consecutive 8x8 rows. |
|
$7E0068 | 3 bytes | Pointer | 24-bit pointer to layer 2 data. | |
$7E006B | 3 bytes | Pointer | 24-bit pointer to low byte of Map16 block data. Used during level load. | |
$7E006E | 3 bytes | Pointer | 24-bit pointer to high byte of Map16 block data. Used during level load. | |
$7E0071 | 1 byte | Player | Player animation trigger states. When nonzero, the player character is performing an action and cannot be controlled by the player. Often used for cutscenes. | Valid values |
$7E0072 | 1 byte | Player | Player is in the air flag, as well as the actual pose value to store to $13E0 while the player is in midair. This is set to a certain value depending on how the player got in the air in the first place, and in what state they are currently (rising or sinking). This address is not affected by phases such as climbing. It is, however, also used in swimming animation. Notable values: #$0B = Jumping/swimming upwards. #$0C = Shooting out of a slanted pipe, running at maximum speed. #$24 = Descending/sinking. NOTE: Hitting bottom-solid sprites like invisible solid block, message block etc. does NOT set $72 to this value as cape mario. The address in general is used in many instances. For example, the game checks if this address is #$0C. If not, the player cannot ascend properly with the cape. Furthermore, the Layer 3 smash won't hurt the player if they're not on the ground (any non-zero value) and this address prevents the player from locking in place when still airborne during the Morton/Roy/Ludwig battle. |
|
$7E0073 | 1 byte | Flag | Player is ducking flag. #$00 = No; #$04 = Yes. However, any value that is not zero also counts as 'Yes', SMW just stores that specific value to it. | |
$7E0074 | 1 byte | Player | Player is climbing flag: format: n--sifhb n: Net/vine flag. 1 - net, 0 - vine. Determines whether Mario can move diagonally. s: Side body collision point with climbing. If clear, block horizontal movement. i: Side head collision point with climbing. f: Feet collision point with climbing. h: Head collision point with climbing. b: Body collision point with climbing. |
|
$7E0075 | 1 byte | Flag | Player is in water flag. #$00 = No; #$01 = Yes. | |
$7E0076 | 1 byte | Player | Player direction. #$00 = Left; #$01 = Right. | |
$7E0077 | 1 byte | Player | Player blocked status - Used to check if player is blocked in a certain direction. Format: SxxMUDLR The M bit means that the player is in the middle of a block. The S bit indicates that the player is touching the side of the screens while horizontal screen scrolling is disabled. UDLR = up, down, left, right (contact with walls). L is checked each 4 frames when the player have negative X speed. Others frames is zero. R is checked each 4 frames when the player have positive X speed. Others frames is zero. |
|
$7E0078 | 1 byte | Player | Used to hide the player partially or fully. Format: dlucapLU. d = used in conjunction with all other set bits in order to disable processes such as the star timer decrementing. l = hide lower extra player tile when in flight (hovering with the cape). u = hide upper extra player tile when in flight (hovering with the cape). c = hide regular cape tile. a = hide attributive 8x8 tile. p = hide extra player tile that is shown during the inflated P-balloon pose (does not apply if the player is small). L = hide lower half of the body. U = hide upper half of the body. |
|
$7E0079 | 1 byte | Empty | Empty. Cleared on reset, titlescreen load, overworld load and level load. | |
$7E007A | 1 byte | Player | Accumulating fraction bits for fixed point player X speed (fractions of 256, see code around $00D792, this handles horizontal movement with the player and when the player is on the slope). Not to be confused with $7E13DA, which handles X position. |
|
$7E007B | 1 byte | Player | Player X speed (8-bit, signed), in 1/16s of a pixel per frame. Positive speeds (01-7F) are rightwards while negative speeds (80-FF) are leftwards. | |
$7E007C | 1 byte | Empty | Empty. Cleared on reset, titlescreen load, overworld load and level load. | |
$7E007D | 1 byte | Player | Player Y speed (8-bit, signed), in 1/16s of a pixel per frame. Positive speeds (01-7F) are downwards while negative speeds (80-FF) are upwards. SMW generally restricts Mario's downwards speed to a maximum of #$40, although because the game applies gravity after capping the speed, the actual maximum downwards speed is either #$43 (holding A/B) or #$46 (not holding A/B). |
|
$7E007E | 2 bytes | Player | Player X position (16-bit), within the borders of the screen. | |
$7E0080 | 2 bytes | Player | Player Y position (16-bit), within the borders of the screen. Note that this value may be displaced by $1888 (the screen shake), in addition to small one-pixel displacements based on Mario's powerup status and walking animation frame. |
|
$7E0082 | 3 bytes | Pointer | Points to how steep the various slopes are and which parts of the slopes they represent. Points to $00:E5C8 in tilesets 0 and 7, and $00:E55E in others. The table this one points to has one byte per block, from tile 16E to tile 1D7. The value in these tables is then multiplied by 16, the lowest nibble of the sprite/player X position is added, and this is then used as an index to $00:E632 to tell how many pixels the sprite/player should move down from the nearest 16x16 tile. |
|
$7E0085 | 1 byte | Flag | Water level flag. #$00 = No; #$01 = Yes. | |
$7E0086 | 1 byte | Flag | Slippery level flag. #$00 = No; #$01 through #$7F = Half-slippery; #$80 through #$FF = Yes. Possible values in the clean ROM are #$00 and #$80. | |
$7E0087 | 1 byte | Empty | Empty. Cleared on reset, titlescreen load, overworld load and level load. Note that this address is used as freeram by the SA-1 patch. |
|
$7E0088 | 1 byte | Player | How long the player goes into a pipe until they warp to another level. Also used as a timer in the castle destruction scenes for holding inputs. |
|
$7E0089 | 1 byte | Player | Action to take when the player enters or exits from a pipe (see valid values). It also serves as a timer for the No Yoshi cutscenes for each controller command (for the table at $00:C848). |
Valid Values |
$7E008A | 3 bytes | Misc. | Used for scratch RAM in multiple locations:
|
|
$7E008D | 3 bytes | Misc. | Used as scratch RAM in multiple locations:
|
|
$7E0090 | 1 byte | Player | Player Y position within a block. Calculated with $7E:0096 & #$0F. Indicates whether the player is touching the top or the bottom of the block. | |
$7E0091 | 1 byte | Player | Y position of the player's head and feet within a block. For the head interaction, this is calculated by taking the player's Y position, adding it with the interaction point offset of MarioAbove, and limiting it to the lowest four bits. For the feet interaction, this is handled by simply storing $7E0090 (the player's Y position within the block) to this address. This is used to calculate how far the interaction points are inside of a block (values of $00 - $07 denotes the top half while $08 - $0F denotes the bottom half) and to determine which direction the player should be pushed out if the block is solid. |
|
$7E0092 | 1 byte | Player | Player X position within a block. Calculated with $7E:0094 + #$08 & #$0F. | |
$7E0093 | 1 byte | Player | The side of a block the player is on. It's set to #$00 for the right side and #$01 for the left side. This address is relative to the block the player is currently inside. | |
$7E0094 | 2 bytes | Player | Player X position (16-bit) within the level, next frame (calculates player position one frame ahead, as opposed to $D1). It's also used as a player X position on-screen on the overworld border. NOTE: During player interaction with blocks on Layer 2, this value is modified to be relative to Layer 2's position rather than Layer 1. This can be checked via $1933, and can be offset back to Layer 1 by subtracting $26. |
|
$7E0096 | 2 bytes | Player | Player Y position (16-bit) within the level, next frame (calculates player position one frame ahead, as opposed to $D3). It's also used as a player Y position on-screen on the overworld border. NOTE: the player's Y position is not affected by their powerup, nor whether they are crouching; the point will always be 32 pixels above their feet. However, if riding on Yoshi, their Y position does get offset 16 pixels upwards. Additionally, during player interaction with blocks on Layer 2, this value is modified to be relative to Layer 2's position rather than Layer 1. This can be checked via $1933, and can be offset back to Layer 1 by subtracting $28. |
|
$7E0098 | 4 bytes | Misc. | Position (in pixels) of the collision point currently being processed for player interaction with blocks in the level. Also used in the creation of various sprite types/other blocks. $98-$99: 16-bit Y position $9A-$9B: 16-bit X position Note that this position is with respect to the top left of the layer being processed. Hence, if Layer 1 and Layer 2 are offset from each other, this value will differ between the two, even when Mario is at the same position with respect to the level. Also note that, in vertical levels, the X and Y position may be swapped after running certain block changing routines (e.g. $00BEB0 or the ChangeMap16 routine included with various tools). |
|
$7E009C | 1 byte | Blocks | Map16 tile to generate (used with $00:BEB0). | Valid Values |
$7E009D | 1 byte | Flag | Lock animation and sprites flag. Most codes will still run if this is set, but almost nothing will move or animate. Set by a number of events such as screen scrolling, entering pipes, dying, and more. Notably, not set when the game is actually paused by $13D4, since most resource processing is skipped altogether by that flag. However, UberASM codes still run prior to that flag being checked, so in those you'll need to check both to prevent any unwanted code from running while the game is frozen. |
|
$7E009E | 12 bytes | Sprites | Sprite number, or Acts Like setting for custom sprites. To check the actual sprite ID for custom sprites, see $7FAB9E instead. | |
$7E00AA | 12 bytes | Sprites | Sprite Y speed table. | |
$7E00B6 | 12 bytes | Sprites | Sprite X speed table. | |
$7E00C2 | 12 bytes | Sprites | Miscellaneous sprite table. In SMW, it's commonly used as a pointer to different parts of a sprite. More information can be found here. | |
$7E00CE | 3 bytes | Pointer | 24-bit pointer to level's sprite data. | |
$7E00D1 | 2 bytes | Player | Player X position (16-bit) within the level, current frame (as opposed to $7E:0094). | |
$7E00D3 | 2 bytes | Player | Player Y position (16-bit) within the level, current frame (as opposed to $7E:0096). | |
$7E00D5 | 3 bytes | Pointer | Pointer to X and Y positions of Wiggler segments. Table at $7F9A7B. | |
$7E00D8 | 12 bytes | Sprites | Sprite Y position, low byte. | |
$7E00E4 | 12 bytes | Sprites | Sprite X position, low byte. | |
$7E00F0 | 16 bytes | Empty | Empty. Cleared on reset, titlescreen load and overworld load. Lunar Magic makes use of a portion of this space (currently $F9-$FF, though subject to change) for various purposes; see details for a list. Most notably, $FE is set to the current level ID plus 1 (so Yoshi's Island 1 would store #$0106 here), with #$0000 being used for non-standard levels like the No Yoshi entrance. |
Details |
$7E0100 | 1 byte | Misc. | Game Mode. | Valid Values |
$7E0101 | 4 bytes | Misc. | Currently loaded sprite GFX files - stored in reverse order. | |
$7E0105 | 4 bytes | Misc. | Currently loaded FG/BG GFX files - stored in reverse order. | |
$7E0109 | 1 byte | Misc. | When set to a non-zero value, the overworld loading routine is overridden by loading a level value stored here, minus #$24 if it's above #$24. For example, the intro level (level C5) is loaded this way by storing #$E9 to this address. Depending on whether the player is on the main overworld or a submap, the level in question is either in the 0xx or 1xx area. |
|
$7E010A | 1 byte | Misc. | Current save file number. | |
$7E010B | 245 bytes | Misc. | Stack. The first two bytes is the current level number in most hacks. | |
$7E0200 | 544 bytes | I/O | OAM table. Used to handle all sprite tile data, with 0x80 (128) slots for tiles. Generally, the table is indexed from either $0200 or $0300, with $0300 being used for normal sprites (and Mario) and $0200 being used for various other sprite types. Tiles are drawn to the screen from top to bottom of the table; that is, a sprite in slot 0 will always appear visually in front of a sprite in slot 1. The table actually consists of two sub-tables:
Various tiles are documented here. Note that: Code $7E0310-$7E0313 is for the player's upper half $7E0314-$7E0317 for the player's lower half $7E0318-$7E031B is for the player's hand. |
$0400 layout |
$7E0420 | 128 bytes | Sprites | OAM Extra bits table. Each Byte (also each of the 128-slot table) here contains two bits of: %000000SX, where: S: Size: 0 = 8x8, 1 = 16x16 X: High bit of the x position (9th bit). Needed to allow sprites going past the left edge of the screen. This gets copy-then-converted via routine at $008494 to write each 4 bytes of $0420 into each single byte of $0400 (%SXSXSXSX). Note: bits 2-7 here MUST all be zeroes, else other OAM slots' extra bits will be affected when running $008494. |
|
$7E04A0 | 448 bytes | Misc. | HDMA table for windowing effects, such as with the keyhole, level ending and titlescreen. | |
$7E0660 | 32 bytes | Misc. | Gets overwritten by the HDMA table for the level ending circle. If the player gets above or below the borders of the screen, it can even run into $7E:0680 and beyond. Otherwise cleared on reset and titlescreen load, but usage as empty RAM is definitely not recommended. |
|
$7E0680 | 1 byte | Palettes | Index to the palette updating tables, that are uploaded every frame. #$00 = Use table at $7E:0682. #$03 = Use table at $7E:0905. #$06 = Use table at $7E:0703. |
|
$7E0681 | 1 byte | Palettes | Index to the table at $7E:0682 during the time when data is stored to this table in the lightning, Magikoopa and Big Boo Boss codes. | |
$7E0682 | 19 bytes | Palettes | Used for uploading palettes dynamically. SMW uses this in the lightning/Magikoopa/Big Boo Boss palette effects. $7E:0682 holds the amount of bytes to transfer, $7E:0683 holds the color number (stored to SNES register $2121), the bytes afterwards hold the actual color values transferred to the CGRAM. Further, this table may be indexed by $7E:0681 to add more color destinations; it's terminated by a #$00. The format is the same as before, just at the new location. This table doesn't actually have to end at $7E:0694, but SMW never goes beyond this. As such, the area after this address is listed as "empty". |
|
$7E0695 | 108 bytes | Empty | 100 bytes used in LM 1.70+ for VRAM modification. In the clean ROM, it's empty (cleared on reset and titlescreen load). |
|
$7E0701 | 2 bytes | Palettes | Background color. Used during gameplay in conjunction with $2132. | |
$7E0703 | 512 bytes | Palettes | The entire palette. It is only uploaded to CGRAM during the level loading routine. Also used during overworld load, but not all of it. | |
$7E0903 | 2 bytes | Palettes | Copy of background color $7E:0701/2. | |
$7E0905 | 496 bytes | Palettes | Copy of palettes 0-F from $0703-$08F2. Only the first half of palette F is included. It is used in overworld path events fading in ($04:EAA0), and level ending fade in/out ($00:AF9D). | |
$7E0AF5 | 1 byte | Empty | Cleared on reset and titlescreen load. Also cleared after a boss had been beaten - this can be disabled by changing [9C 5C 0A] at $00:B08D to [80 01 EA]. | |
$7E0AF6 | 256 bytes | Misc. | Used for three different things: 1. Decompressed overworld graphics, animated tiles. For that it also cooperates with $7E:0BF6-$7E:0C55. 2. Iggy's/Larry's platform interaction. (16x16 tiles in a 16x16 square.) 3. Various tables for the Yoshi eggs at the credits, such as how much time must be waited until a new egg breaks, Y speed tables. See this post. In addition, Lunar Magic 3.00+ uses part of this region to support the expanded horizontal level system. Addresses are as follows: $0BE6-$0BED: Used in Lunar Magic (not related to horizontal level system). $0BEE: Used if the Smart Spawn option is set to check if the screen has scrolled horizontally this frame. $0BEF: Used if the Smart Spawn option is set to check if the screen has scrolled vertically this frame. $0BF0-$0BF1: Minimum Y offset from the screen that a sprite can be in order to spawn. Set depending on the spawn range index. $0BF2-$0BF3: Maximum Y offset from the screen that a sprite can be in order to spawn. Set depending on the spawn range index. $0BF4: Extra flags for sprites, s-----rr. s = Smart Spawn flag, rr = spawn range index, - = unused bits. $0BF5: Extra flags and horizontal level mode, tbnmmmmm. t = flags the level as using a non-background Layer 2 or 3, b = show the bottom row of the level, n = use the new sprite system, mmmmm = horizontal level mode (see here for more info). |
|
$7E0BF6 | 384 bytes | Misc. | Decompressed GFX for tiles #$4A-#$4F, #$5A-#$5F of SP1. In addition, Lunar Magic 3.00+ uses this region to support the expanded horizontal level system. Addresses are used as follows: $0BF6-$0C55: Table of up to 32 24-bit pointers to the low byte of the object data in each screen. These point to locations in $7EC800. $0C26-$0C55 is used for Layer 2/3 data in levels with a Layer 2/3 foreground. $0C56-$0CB5: Table of up to 32 24-bit pointers to the high byte of the object data in each screen. These point to locations in $7FC800. $0C86-$0CB5 is used for Layer 2/3 data in levels with a Layer 2/3 foreground. $0CB6-$0CD5: Copy of the low bytes of the table at $0BF6. $0CC6-$0CD5 is used for Layer 2/3 data in levels with a Layer 2/3 foreground. $0CD6-$0CF5: Copy of the low bytes of the table at $0C56. $0CE6-$0CF5 is used for Layer 2/3 data in levels with a Layer 2/3 foreground. $0CF6-$0D35: Table of up to 32 16-bit pointers to the sprite data in each screen. These are used to change $CE-$CF. $0D36-$0D75: Table of up to 32 16-bit values, one for each screen. The low byte is used to modify the sprite's Y position, while the high byte indicates the number of the sprite within the level (or the number of sprites that have been processed in the level so far). |
|
$7E0D76 | 2 bytes | Graphics | Used during the GFX33 DMA routine. It holds the first of three possible source addresses for the animated graphics. | |
$7E0D78 | 2 bytes | Graphics | Used during the GFX33 DMA routine. It holds the second of three possible source addresses for the animated graphics. | |
$7E0D7A | 2 bytes | Graphics | Used during the GFX33 DMA routine. It holds the third of three possible source addresses for the animated graphics. | |
$7E0D7C | 2 bytes | Graphics | Used during the GFX33 DMA routine. It holds the first of three possible VRAM addresses for the animated graphics. | |
$7E0D7E | 2 bytes | Graphics | Used during the GFX33 DMA routine. It holds the second of three possible VRAM addresses for the animated graphics. | |
$7E0D80 | 2 bytes | Graphics | Used during the GFX33 DMA routine. It holds the third of three possible VRAM addresses for the animated graphics. | |
$7E0D82 | 2 bytes | Pointer | 16-bit pointer to the player palette. #$B2C8 = regular Mario; #$B2DC = regular Luigi; #$B2F0 = fire Mario; #$B304 = fire Luigi. Always uses #$00 for bank byte (the first bank). | |
$7E0D84 | 1 byte | Misc. | Used in Player Graphics DMA routine. This holds the amount of tiles to load. Is #$0A in levels (because of Yoshi) and #$06 on the overworld. If it's set to zero, the player palette isn't reloaded. The presents screen makes use of that. |
|
$7E0D85 | 20 bytes | Sprites | 16-bit pointers in bank $7E for uploading the player's, Yoshi's and Podoboo's on-screen tiles. They're divided in two sets of 10 bytes, each two bytes being used for two 8x8 tiles. The first 10 bytes are for the top half of each 16x16 tile (player's head, player's bottom, cape, Yoshi's head/Podoboo, Yoshi's bottom), while the latter 10 bytes are for the bottom half of each 16x16 tile (same order). The format to calculate the tile used is as follows: ([8x8 tile number] - $900 * $20) + $2000. NOTE: The tile number is only applicable to page 9 onwards. |
|
$7E0D99 | 2 bytes | Graphics | Holds the lower two bytes of the 24-bit RAM address (bank byte is $7E) of tile 7F's graphics; used during the player graphics DMA routine. | |
$7E0D9B | 1 byte | Misc. | Activates different IRQ/NMI behavior for various game modes, depending on the following values: #$00 = Regular level. #$01 = Mario Start, Time Up, etc. + Title Screen + Castle destruction scene. #$02 = Overworld. #$80 = Iggy's and Larry's battle mode. #$C0 = Reznor's, Morton's, Roy's, and Ludwig's battle mode. #$C1 = Bowser's battle mode. |
|
$7E0D9C | 1 byte | Empty | Empty. Cleared on reset and titlescreen load. | |
$7E0D9D | 1 byte | Hardware mirror | Main Screen and Window logic mask setting of current level mode (000abcde - a = Object layer; b = Layer 4; c = Layer 3; d = Layer 2; e = Layer 1). Appears as TM in Lunar Magic. Mirror of SNES registers $212C and $212E; transfer only occurs on level load. | |
$7E0D9E | 1 byte | Hardware mirror | Sub Screen and Window logic mask setting of current level mode (000abcde - a = Object layer; b = Layer 4; c = Layer 3; d = Layer 2; e = Layer 1). Appears as TD in Lunar Magic. Mirror of SNES registers $212D and $212F; transfer only occurs on level load. | |
$7E0D9F | 1 byte | Hardware mirror | HDMA Channel Enable: abcdefgh a = Channel 7 .. h = Channel 0: 1 = Enable 0 = Disable. Mirror of SNES register $420C. | |
$7E0DA0 | 1 byte | Misc. | Which controllers are plugged in (00 = port 1, 01 = port 2). Used to determine which port to accept data from when only one controller is plugged in. If the high bit is set, then both controller ports are plugged in and $0DB3 will be used instead to determine the active controller. |
|
$7E0DA1 | 1 byte | Empty | Empty. Cleared on reset and titlescreen load. | |
$7E0DA2 | 1 byte | I/O | Copy of controller data 1 ($7E:0015). Format: byetUDLR. b = B, y = Y, e = Select, t = Start, UDLR = Up/Down/Left/Right. Used by player 1 (Mario). |
|
$7E0DA3 | 1 byte | I/O | Copy of controller data 1 ($7E:0015). Format: byetUDLR. b = B, y = Y, e = Select, t = Start, UDLR = Up/Down/Left/Right. Used by player 2 (Luigi). |
|
$7E0DA4 | 1 byte | I/O | Copy of controller data 2 ($7E:0017). Format: axlr----. a = A; x = X; l = L; r = R, 0 = null/unused. Note that the upper two bits are also used by controller data 1 at $7E:0015, so that A/B and X/Y are combined. Used by player 1 (Mario). |
|
$7E0DA5 | 1 byte | I/O | Copy of controller data 2 ($7E:0017). Format: axlr----. a = A; x = X; l = L; r = R, 0 = null/unused. Note that the upper two bits are also used by controller data 1 at $7E:0015, so that A/B and X/Y are combined. Used by player 2 (Luigi). |
|
$7E0DA6 | 1 byte | I/O | Copy of controller data 1, one frame ($7E:0016). Format: byetUDLR. b = B, y = Y, e = Select, t = Start, UDLR = Up/Down/Left/Right. Used by player 1 (Mario). |
|
$7E0DA7 | 1 byte | I/O | Copy of controller data 1, one frame ($7E:0016). Format: byetUDLR. b = B, y = Y, e = Select, t = Start, UDLR = Up/Down/Left/Right. Used by player 2 (Luigi). |
|
$7E0DA8 | 1 byte | I/O | Copy of controller data 2, one frame ($7E:0018). Format: axlr----. a = A; x = X; l = L; r = R, 0 = null/unused. Note that the sixth bit is also used by controller data 1 at $7E:0016, so that X/Y are combined. Used by player 1 (Mario). |
|
$7E0DA9 | 1 byte | I/O | Copy of controller data 2, one frame ($7E:0018). Format: axlr----. a = A; x = X; l = L; r = R, 0 = null/unused. Note that the sixth bit is also used by controller data 1 at $7E:0016, so that X/Y are combined. Used by player 2 (Luigi). |
|
$7E0DAA | 1 byte | I/O | Controller 1 button disable flags ($4219), one frame. If a bit is set here, that bit will be disabled in $16/$0DA6 (but not $15). Format: byetUDLR. b = B, y = Y, e = Select, t = Start, UDLR = Up/Down/Left/Right. |
|
$7E0DAB | 1 byte | I/O | Controller 2 button disable flags ($421B), one frame. If a bit is set here, that bit will be disabled in $16/$0DA7 (but not $15). Format: byetUDLR. b = B, y = Y, e = Select, t = Start, UDLR = Up/Down/Left/Right. |
|