Language…
15 users online: Buzbee, enbee_beee, Green, Green Jerry, Heitor Porfirio, Hidincuzimsmokin, hotfist.com, Link13, MarioriaM, NeXuS15, NixKillsMyths, OrangeRock57, Specsifier, zAce08xZ, Ziz - Guests: 124 - Bots: 180
Users: 62,969 (2,681 active)
Latest user: Sweaty

SMW Memory Map

Displaying 840 out of 840 addresses.

View: moderated | waiting (20)

Filter

Link
  • Pages:
  • 1
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.
$7E001C 2 bytes Hardware mirror Layer 1 Y position, current frame. Mirror of SNES register $210E.
$7E001E 2 bytes Hardware mirror Layer 2 X position, current frame. Mirror of SNES register $210F.
$7E0020 2 bytes Hardware mirror Layer 2 Y position, current frame. Mirror of SNES register $2110.
$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. Depending on Layer 3 tides being activated or not, it's either:

Not activated:
Layer 2 X position minus Layer 1 X position.
Activated:
Layer 3 X position minus Layer 1 X position.

Used for various things, among which interaction with multiple layers is included.
$7E0028 2 bytes Misc. Depending on Layer 3 tides being activated or not, it's either:

Not activated:
Layer 2 Y position minus Layer 1 Y position.
Activated:
Layer 3 Y position minus Layer 1 Y position.

Used for various things, among which interaction with multiple layers is included.
$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 layer 2.
D = Disable collision with layer 1.
V = Vertical layer 2.
v = Vertical layer 1.
- = unused.

This address is set by a table at $05:8417, which is indexed by the level mode setting.
$7E005C 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E005D 1 byte Misc. Number of screens in level.
Note: Set to $FF during Ludwig and Reznor boss battles, in these cases, the screen scroll range is X=$0000 to X=$0080 (1 and a 1/2 screen wide area)
$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; see $5F instead.
Note: During Ludwig and Reznor boss battles, this is set to $00, in these cases, the screen scroll range is X=$0000 to X=$0080 (1 and a 1/2 screen wide area)
$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; 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, 2-complement signed), in 1/16s of a pixel per frame.
  • $80-$FF: leftwards speed, with $80 fastest.
  • $00: Not moving horizontally.
  • $01-$7F: rightwards speed, with $7F fastest.

Note: Player's maximum X speeds, while holding left or right oscillates between (inclusively) $13-$15 (walking) and $2F-$31 (dashing). The oscillation is due to the code applying deceleration when Mario is at or above the max speed, rather than just setting his speed to the max value.
$7E007C 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E007D 1 byte Player Player Y speed (8-bit, 2-complement signed), in 1/16s of a pixel per frame:

  • $80-$FF: Upwards speed, with $80 being the fastest (launches the player the highest)
  • $00: Not moving vertically.
  • $01-$7F: Downwards speed, with $7F being the fastest.

Note: $43 (when holding jump) $46 (not holding jump) is the maximum fall speed. Although $40 is the intended max speed (see at $00D7AF), the code first caps the downwards speed, and then apply the gravitational acceleration (increases Y speed by $03 or $06) afterwards.

When jumping, $B3 is the normal jump speed, and #$A4 is the jump speed when fully running.
$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 by various routines. Most notably:
- On the title screen, $8A is used to hold the number of options in the current menu.
- When decompressing GFX files, these hold a 24-bit pointer to current position in the compressed data.
- During the interaction routine between the player and Map16 tiles, $8A specifically holds flags for which points are in water, $8B holds flags for which points are touching a climbable tile, and $8C holds a single flag for which side of the block the current point is touching. For $8A/$8B see $74, while for $8C see $93.
$7E008D 3 bytes Misc. This forms a 24-bit pointer to part of the decompressed graphics; starts at $7E:ACFE/F and keeps decrementing.
The three seperate RAM addresses have multiple purposes, however.

Notes:
-During code at $00E940, $8F is a backup of $72 (player in the air flag). The code at $00EC06 is used for detecting when entering doors.
$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.
$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 Used by Lunar Magic for various purposes.
$7E:00FE is the current level number plus 1 (so Yoshi's Island 1 would store #$0106 here). It's used for the custom palette loading code. #$0000 means that the custom palette won't be loaded (this is probably used for castle intros and/or credits).
The rest is unknown.

Originally, this address is empty, and it's cleared at reset, titlescreen and overworld load.
$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 layer 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:

  • $0200-$03FF (512 bytes): Each slot gets four bytes in the order of: X position, Y position, tile number, YXPPCCCT. Unused tiles are generally marked by giving them a Y position of #$F0 (which is offscreen).
  • $0400-$041F (32 bytes): Each slot gets 2 bits %SX, with the X bit used to handle a 9th bit of the X position (for handling sprite tiles that go past the left edge of the screen) and the S bit acting as a "size bit" which (generally) controls whether the tile is 8x8 (0) or 16x16 (1). Since each tile only requires 2 bits, each byte of this table actually handles four separate tiles; see the details table for more information. It is not recommended that you write to this table directly, though, and you should use the table at $0420-$049F instead. The routine at $008494 is responsible for then packing the data from that table back into $0400.

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 and Roy'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.
$7E0DAC 1 byte I/O Controller 1 button disable flags ($4218), one frame. If a bit is set here, that bit will be disabled in $18/$0DA8 (but not $17).
Format: axlr----.
a = A, x = X, l = L, r = R, 0 = null/unused.
$7E0DAD 1 byte I/O Controller 2 button disable flags ($421A), one frame. If a bit is set here, that bit will be disabled in $18/$0DA9 (but not $17).
Format: axlr----.
a = A, x = X, l = L, r = R, 0 = null/unused.
$7E0DAE 1 byte Hardware mirror Handles brightness and force blank. Format: f---bbbb. f = force blank flag, --- = unused bits, bbbb = brightness setting. Mirror of SNES register $2100.
$7E0DAF 1 byte Misc. Mosaic direction. #$00 = shrinking mosaic; #$01 = growing mosaic.
$7E0DB0 1 byte Hardware mirror Current mosaic pixel size on level load. Mirror of SNES register $2106, though bits 0 and 1 are always set ($2106 = $7E:0DB0 | #$03).
$7E0DB1 1 byte Timer Is used to keep a mode active. If the respective value is positive, the game mode doesn't change. This is primarily used in the fading routines (example: from overworld to level and vice versa).
$7E0DB2 1 byte Flag Two player game flag. #$00 = No; #$01 = Yes.
$7E0DB3 1 byte Player Which character is in play. #$00 = Mario; #$01 = Luigi. If you prefer Luigi to be #$04, use $7E:0DD6.
$7E0DB4 1 byte Player Mario's lives. Note that this is only used in two player games, you'll want $7E:0DBE in 99% of the cases.
$7E0DB5 1 byte Player Luigi's lives. Note that this is only used in two player games, you'll want $7E:0DBE in 99% of the cases.
$7E0DB6 1 byte Player Mario's coins. Note that this is only used in two player games, you'll want $7E:0DBF in 99% of the cases.
$7E0DB7 1 byte Player Luigi's coins. Note that this is only used in two player games, you'll want $7E:0DBF in 99% of the cases.
$7E0DB8 1 byte Player Mario's powerup/status. Note that this is only used in two player games, you'll want $7E:0019 in 99% of the cases.
$7E0DB9 1 byte Player Luigi's powerup/status. Note that this is only used in two player games, you'll want $7E:0019 in 99% of the cases.
$7E0DBA 1 byte Yoshi Mario's Yoshi color. #$04=yellow; #$06=blue; #$08=red; #$0A=green
$7E0DBB 1 byte Yoshi Luigi's Yoshi color. #$04=yellow; #$06=blue; #$08=red; #$0A=green
$7E0DBC 1 byte Player Item in Mario's item box. #$00 = None; #$01 = Mushroom; #$02 = Fire Flower; #$03 = Star; #$04 = Feather. Note that you'll want $7E:0DC2 in most cases.
$7E0DBD 1 byte Player Item in Luigi's item box. #$00 = None; #$01 = Mushroom; #$02 = Fire Flower; #$03 = Star; #$04 = Feather. Note that you'll want $7E:0DC2 in most cases.
$7E0DBE 1 byte Player Current player lives, minus one (#$04 here means that the player has 5 lives).
$7E0DBF 1 byte Player Current player coin count.
$7E0DC0 1 byte Counter Green star block coin counter. Starts at 30 (#$1E) at the beginning of a level, and decrements for each coin that is collected. Adjusts content of green star block when it hits zero. (A 1-Up mushroom comes out, instead of a spinning coin.)
It is also used in Chocolate Island 2 to count how many coins have been collected since the start of the level, and determine what sublevel data should be loaded.
$7E0DC1 1 byte Yoshi Player can carry Yoshi over levels flag. #$00 = can't carry over levels; #$01 = can carry over levels.
$7E0DC2 1 byte Player Item in current player's item box. #$00 = None; #$01 = Mushroom; #$02 = Fire Flower; #$03 = Star; #$04 = Feather.
$7E0DC3 4 bytes Empty Empty. Cleared on reset and titlescreen load. $7E:0DC3 is also cleared when selecting how many players to use, but this can be disabled with no known side effects by setting $00:9E48 to [80 01 EA].
$7E0DC7 2 bytes Player Overworld X position where Mario should be going to. Is used by overworld path tiles to indicate Mario's direction. Updated as soon as Mario starts moving - zero otherwise.
$7E0DC9 2 bytes Player Overworld Y position where Mario should be going to. Is used by overworld path tiles to indicate Mario's direction. Updated as soon as Mario starts moving - zero otherwise.
$7E0DCB 2 bytes Player Overworld X position where Luigi should be going to. Is used by overworld path tiles to indicate Luigi's direction. Updated as soon as Luigi starts moving - zero otherwise.
$7E0DCD 2 bytes Player Overworld Y position where Luigi should be going to. Is used by overworld path tiles to indicate Luigi's direction. Updated as soon as Luigi starts moving - zero otherwise.
$7E0DCF 2 bytes Player Player X speed on the overworld. Added with $7E:13D5, which does happen to be zero all the time.
$7E0DD1 2 bytes Player Player Y speed on the overworld. Added with $7E:13D7, which is zero most of the time.
$7E0DD3 1 byte Overworld Player direction. #$00 = up; #$02 = down; #$04 = left; #$06 = right.
$7E0DD4 1 byte Should be 00 This address is effectively the high byte of $0DD3 on the overworld and should not be touched there, though in levels it is unused. It is also referenced once as the low byte of $0DD5, though its value isn't used there.
Cleared on reset and titlescreen load, and when Mario starts walking on an overworld path.
$7E0DD5 1 byte Misc. Used to indicate how a level has been exited, and hence what events to activate on the overworld. Valid Values
$7E0DD6 1 byte Player Which character is in play. Used on the overworld. The value of this address is actually $7E:0DB3 * 4.
#$00 = Mario; #$04 = Luigi.
$7E0DD7 1 byte Should be 00 An address that is expected to be #$00 throughout the entire game. $7E:0DD6 (current player) is sometimes used in 16bit mode, so using this address for different purposes is a bad idea.
$7E0DD8 1 byte Flag Used to tell if the game is currently switching between Mario and Luigi or not.
#$00 = Not switching between Mario and Luigi.
#$01 = Switching between Mario and Luigi, during the fade-out.
$7E0DD9 1 byte Empty Empty. Cleared on reset and titlescreen load.
$7E0DDA 1 byte Misc. Back-up of the music register. Gets its value from the level music table at $05:84DB.
Bit 7 of this address is set when the player has a star powerup or presses a P-switch; when this is cleared again, the music ends.
This address is also set to #$FF when the level ends, either by beating it or by dying.
Bit 6 is similar but is used to not reupload all music. This is used when changing from the Mario start screen to the level game mode.
$7E0DDB 3 bytes Empty Empty. Cleared on reset and titlescreen load.
$7E0DDE 1 byte Misc. Which files to delete on the erase file screen. Format: xxxxx123. It is also used as an overworld sprite index.
$7E0DDF 1 byte Sprites Starting OAM index for overworld sprites. Appears to be used only by the cloud sprites.
$7E0DE0 5 bytes Sprites Used for the overworld cloud sprites. This table is used in such a way that clouds check each other's 16-bit Y positions. By doing this, they can maintain their speed, making it the same for all clouds on-screen.
$7E0DE5 16 bytes Sprites Overworld sprite number. Valid Values
$7E0DF5 16 bytes Sprites Miscellaneous overworld sprite table.
$7E0E05 16 bytes Sprites Miscellaneous overworld sprite table.
$7E0E15 16 bytes Sprites Miscellaneous overworld sprite table.
$7E0E25 16 bytes Sprites Miscellaneous overworld sprite table.
$7E0E35 16 bytes Sprites Overworld sprite X position, low byte.
$7E0E45 16 bytes Sprites Overworld sprite Y position, low byte.
$7E0E55 16 bytes Sprites Overworld sprite Z position, low byte; distance that the sprite is from the ground.
$7E0E65 16 bytes Sprites Overworld sprite X position, high byte.
$7E0E75 16 bytes Sprites Overworld sprite Y position, high byte.
$7E0E85 16 bytes Sprites Overworld sprite Z position, high byte; distance that the sprite is from the ground. Probably has no real purpose in the original SMW; it may not be anything but #$00.
$7E0E95 16 bytes Sprites Overworld sprite X speed.
$7E0EA5 16 bytes Sprites Overworld sprite Y speed.
$7E0EB5 16 bytes Sprites Overworld sprite Z speed.
$7E0EC5 16 bytes Sprites Accumulating fraction bits for overworld sprite X speed.
$7E0ED5 16 bytes Sprites Accumulating fraction bits for overworld sprite Y speed.
$7E0EE5 16 bytes Sprites Accumulating fraction bits for overworld sprite Z speed.
$7E0EF5 1 byte Overworld Bits 5 through 7 of this address are used to keep track of which overworld Koopa Kids have been defeated (i.e. they pulled Mario into a level and the level was beaten). If set, the corresponding sprite will not respawn.
$7E0EF6 1 byte Overworld Indicates which of the koopa kid triggers you are standing on. By default the tiles are: #$49, #$4A and #$4B. These correspond to index #$00, #$01 and #$02 respectively. This address is unused in the original SMW and can be used as empty free RAM, it is cleared on reset and titlescreen load.
$7E0EF7 1 byte Overworld If bit 7 is set (#$80-#$FF) and the player is located on a level tile, they will enter it directly without user input.

The Koopa Kid and Piranha Plant overworld sprites also write their sprite index to this address while the player is in contact with them. The Piranha Plant in particular uses this to erase itself if Mario beats the level the sprite is on top of.
$7E0EF8 1 byte Flag Yoshi has been saved for the first time flag - used for Yoshi's thank message.
$7E0EF9 55 bytes Misc. Status bar tilemap. View tiles as a table Diagram
$7E0F30 1 byte Counter Timer frame counter. Starts at $28 and decreases by 1 every frame. When this value becomes negative (by reaching $FF), one second is subtracted from SMW's game timer, and the counter is reset to $28. This means that an SMW second is 41 frames. At the NTSC refresh rate of about 60Hz, one SMW second is just over 2/3 of a real second (about 0.684s).
$7E0F31 3 bytes Counter Timer.
$7E:0F31 = Hundreds.
$7E:0F32 = Tens.
$7E:0F33 = Ones.
$7E0F34 6 bytes Counter 24-bit player score:

$7E0F34-$7E0F36: Mario.
$7E0F37-$7E0F39: Luigi.

Note: SMW stores the scores internally as the number displayed on the status bar divided by 10 ("1234560" shown is 123456 ($01E240) stored in memory).

Note: This number is stored in little endian the same way 16-bit values are stored ($01E240 is [$40, $E2, $01]).
$7E0F3A 6 bytes Empty Empty. Cleared on reset and titlescreen load.
$7E0F40 2 bytes Counter Amount of score to add up to the score total, at level end. Decrements as total score increments.
$7E0F42 6 bytes Empty Empty. Cleared on reset and titlescreen load.
$7E0F48 1 byte Counter Mario Bonus stars.
$7E0F49 1 byte Counter Luigi Bonus stars.
$7E0F4A 20 bytes Sprites Cluster sprite table. Is used for the castle background flame's frame to display, as well as Boo ring's speed - #$00 = still; #$01-#$7F = counter-clockwise; #$80-#$FF = clockwise.
Is also used for several other sprites that are generated, such as the ghost ceiling, but not necessarily for the same purpose.
$7E0F5E 20 bytes Empty Empty. Cleared on reset and titlescreen load. This table was probably meant to function as a cluster sprite table, but it was never used as such.
$7E0F72 20 bytes Sprites Cluster sprite table. Could be used for any purpose - in the original SMW, it holds the index of each individual Boo in a Boo ring (#$00-#$09). It is also used in the death bat ceiling to keep track of the bats' Y position.
$7E0F86 20 bytes Sprites Cluster sprite table, used for various purposes including determining which Boo ring is which and determining whether or not a particular "death bat" is visible.
$7E0F9A 20 bytes Sprites Cluster sprite table. Its purpose in SMW are the following: act as a timer for determining when death bats will fly, and as a timer to freeze an active Boo in the ghost ceiling.
$7E0FAE 2 bytes Sprites Low byte of the angle of the Boo rings. $7E:0FAE is for the first Boo ring active; $7E:0FAF is for the second Boo ring active.
Note that this is not reset on level or overworld load.
$7E0FB0 2 bytes Sprites High byte of the angle of the Boo rings. $7E:0FB0 is for the first Boo ring active; $7E:0FB1 is for the second Boo ring active.
Note that this does not reset on level or overworld load.
$7E0FB2 2 bytes Sprites Boo ring center X position, low byte. $7E:0FB2 is for the first active Boo ring; $7E:0FB3 is for the second active Boo ring.
$7E0FB4 2 bytes Sprites Boo ring center X position, high byte. $7E:0FB4 is for the first active Boo ring; $7E:0FB5 is for the second active Boo ring.
$7E0FB6 2 bytes Sprites Boo ring center Y position, low byte. $7E:0FB6 is for the first active Boo ring; $7E:0FB7 is for the second active Boo ring.
$7E0FB8 2 bytes Sprites Boo ring center Y position, high byte. $7E:0FB8 is for the first active Boo ring; $7E:0FB9 is for the second active Boo ring.
$7E0FBA 2 bytes Sprites Offscreen flag for the Boo ring. If a byte is set to 01, the ring is offscreen and doesn't show up. $7E:0FBA is for the first Boo ring active; $7E:0FBB is for the second.
$7E0FBC 2 bytes Sprites Boo ring index to level table (see $7E:1938). They are never erased, though, so they will always be reloaded.
$7E0FBE 1024 bytes Pointer 16-bit pointer table, indexed by Map16 tile number*2. Points to the image to use for a certain Map16 tile. Usually starts with #$8000 or $9100 (levels) or #$D000 (overworld) and the value counts up with eight per two RAM addresses. Bank byte should be #$0D (levels) or #$05 (overworld).
$7E13BE 1 byte Misc. Item memory settings from header.
$7E13BF 1 byte Misc. Translevel number, set during transfer from world map to level. This identifies the first room of the current level. To convert this to a room number (the "level number" in Lunar Magic), if > #$24, then add #$DC.

In the clean ROM, the actual formula is more complex. If translevel number > #$24, then subtract #$24. Then check RAM $7E:1F11 or $7E:1F12. If the player is in a submap (not the big world map), then add #$100. The submaps of SMW use translevel numbers > #$24, and the big map uses numbers <= #$24, so the simplication is that #$100 - #$24 is #$DC; Lunar Magic forces this simplification to remain.
$7E13C0 1 byte Should be 00 While this is never non-zero in the original SMW, $7E:13BF (level number) is sometimes used in 16bit mode, so using this address for different purposes is a bad idea
To make this one become useful free RAM, change $05:D9C9 to [E2 10 AC BF 13 B9 08 D6 8D EA 1D] (header : lorom : org $05D9C9 : SEP #$10 : LDY $13BF : LDA $D608,y : STA $1DEA).
$7E13C1 1 byte Overworld Current Layer 1 overworld tile the player is standing on.
$7E13C2 1 byte Should be 00 Used occasionally on the overworld as the high byte of $13C1, and thus should be kept as #$00 there. It is safe to use in levels, however.
Cleared on reset, title screen load, and when walking onto a new overworld tile.
$7E13C3 1 byte Overworld Current player submap. #$00 = Main map; #$01 = Yoshi's Island; #$02 = Vanilla Dome; #$03 = Forest of Illusion; #$04 = Valley of Bowser; #$05 = Special World; #$06 = Star World.
Note that it is sometimes inaccurate. It is wiser to use $7E:0DB3 and $7E:1F11.
$7E13C4 1 byte Should be 00 An address that is expected to be #$00 throughout the entire game. $7E:13C3 (current player submap) is often used in 16-bit mode, so using this address for different purposes is a bad idea, unless you make sure it's cleared on overworld load. Is also cleared during the switch between Mario and Luigi. Furthermore, cleared on reset and titlescreen load.
$7E13C5 1 byte Counter Increments each time a 3-Up moon is collected, serves no other purpose. (Its value is never loaded.)
$7E13C6 1 byte Misc. Used by SMW's cutscenes. Goes from #$01 to #$08 and these values are in the order of the boss battles, e.g. #$01 = Iggy's castle, #$02 = Morton's castle. #$08 is the value used for the credits.
Set to #$FF (in conjunction with $7E1493) to end the level as a boss fight: Mario won't walk during the fanfare, and it will trigger the boss cutscene set in Lunar Magic for the current level (if any). This also works for triggering the credit sequence.
$7E13C7 1 byte Yoshi Yoshi color. #$04=yellow; #$06=blue; #$08=red; #$0A=green. Refreshes on level change
$7E13C8 1 byte Empty Empty. Cleared on reset and titlescreen load.
$7E13C9 1 byte Flag Show "Continue/End" menu flag.
#$00 = Don't show it; #$01 = freeze player, but don't load the text yet; #$02 = freeze player, load "Continue/End" menu.
$7E13CA 1 byte Flag Show save prompt flag. It actually triggers when you get on a new level tile. #$00 = Don't show save prompt; #$01 = show save prompt.
$7E13CB 1 byte Misc. This has been left out in the current SMW version.

When you hit a goal tape, and spawn a starman (which never happens), this is set to #$01. Now each time you switch an area in a level, this gets multiplied by 2. When this reaches #$80 (changed area seven times), you will start the area with the star power. The instruction which sets this address to #$01 is located at $00:FB5C.
$7E13CC 1 byte Counter The value you store here is the amount of coins that are being added up, once per frame, to the total (done by incrementing the coin count and decrementing $13CC until 0). This is originally to allow the coin incrementing animation instead of instantly showing the total. This is handled by a code at $008F1D-$008F27.

Usually, $7E:13CC is either #$00 or #$01 (Sprite $7E (unused flying red coin)), but it can be set to other values in order to add up multiple coins at once.
$7E13CD 1 byte Misc. If set to #$00, the midway point won't trigger if grabbed (it'll still make you big, but it won't set the midway flag). Never has any effect in the original SMW, probably left over from a beta.
Lunar Magic disables this effect (see $00F2DB) and uses this for different purposes. For example, it's used during level load, in the routine at $03BCDC and during level scroll code.
$7E13CE 1 byte Flag Midway Point flag. #$00 = Midway Point not crossed; #$01 = Midway Point crossed.

Also used on the overworld as a flag to to indicate the level should activate an event.
$7E13CF 1 byte Flag Used to override the castle/ghost house entrance cutscene after you collect the midway point.

#$00 = Show castle/ghost house entrance cutscene after collecting midway point.
#$40 = Don't show castle/ghost house entrance cutscene after collecting midway point. Note that any non-zero value will work, this is just what SMW uses.

Change $05:D9DE to #$9C to make the cutscene play regardless.
$7E13D0 1 byte Overworld Index to what tile should be stored to VRAM during the castle/switch palace/fortress destruction sequence.
#$00 = Pressed green switch.
#$01 = Pressed yellow/red/blue switch.
#$02 = Destroyed fortress.
#$03 = Destroyed castle with exit.
#$04 = Destroyed castle without exit.
The tile data is then read from $04:EE7A through a 24-bit pointer at $7E:000A (scratch RAM).
$7E13D1 1 byte Overworld Holds the value of the listed castle/fortress/switch tile that must be destroyed, by checking which event it uses (table at $04E5D6). For example, event #$06 (Iggy's Castle destroyed) makes this address hold value #$00 (it's the first slot in the table).
This address is then used as index to the address where the destroyed tile is uploaded to VRAM.
$7E13D2 1 byte Misc. Color of the currently pressed switch palace, or #$00 for None. It's set to #$01 when the player hits a switch palace, and then set to the correct color (#$01 for Yellow, #$02 for Blue, #$03 for Red and #$04 for Green, others are oddly colored and/or flipped) by the message box routine. It creates both the ! blocks in the message boxes and on the overworld.
$7E13D3 1 byte Flag Timer that disables Start from flipping the Pause flag when its value is not #$00 (thus, #$01-#$FF). If it is #$00, being able to press Start to get into the Pause mode is possible.
$7E13D4 1 byte Flag The pause flag for levels, and the "look around the map" flag on the overworld.

In a level: #$00 = off, #$01 = Paused
On the overworld: #$00 = off, #$01 = Look around, #$02 = Return to Mario
$7E13D5 1 byte Misc. A flag that determines whether or not Layer 3 should scroll with the screen. If this is zero, Layer 3 will scroll depending on the tileset and tide setting; if it is any other value, Layer 3 will always be at the same position relative to Layer 1.
Also used on the overworld as accumulating fraction bits for player X speed (see $04:9801).
$7E13D6 1 byte Timer Amount of time to wait until the score-incrementing drumroll begins when you beat a level. Any time you enter a level, this address is set to #$50. Once you beat the level and the number of bonus stars you won and the score is displayed (or just the score if you didn't cut the goal tape), this timer will decrement itself once per frame. Once it reaches a negative value or zero, the drumroll will commence.
Once the drumroll ends, this is set to #$30, and then set to zero upon going to the overworld. It serves the same purpose after you beat a boss as well.
$7E13D7 2 bytes Overworld Y position fraction bits for the intro march (walking to Yoshi's House). Treated as 16-bit, but the high byte is effectively unused outside of being written to.

With Lunar Magic v3.00, this address gains a new purpose in horizontal levels, being used to hold the height of the level data (in units of pixels).
For example, in the original level sizes, this value is set to 0x01B0 (for 0x1B blocks tall). Because the level screen is always 16 blocks wide, this is also the number of blocks per screen column.
$7E13D9 1 byte Pointer A pointer to various processes running on the overworld.
Also used in the level end march.
Valid Values (Overworld) Valid Values (Level end)
$7E13DA 1 byte Player Accumulating fraction bits (fractions of 16; bits 4-7 used while bits 0-3 are always zero; #%XXXX0000) for fixed point player X position (not to be confused with $7E007A). This is used mainly for player's X speed position movement to enable increments for less-than a pixel.

Handled via a routine at $00DC4F.
$7E13DB 1 byte Player Player walking frame pose.

While walking, it gets the values from the table at $00:DC78, indexed by $7E:0019, which eventually becomes the player pose if the player does nothing else. The duration of each frame is read from $00:DC7C, though $7E:13DB plays no role in this. Note that this never is #$02 if the player is small.
$7E:13DB plays a role in determining which walking frame should be raised one pixel - see $00E35D.
$7E13DC 1 byte Player Accumulating fraction bits for fixed point player Y position. Same format as $7E13DA but Y position instead of X.
$7E13DD 1 byte Player Pose used while the player is on the ground and turning around with a non-zero X speed. Uses same format as $13E0.

This address can be used as a flag for when the player is turning, but note that it only gets set if the player is moving horizontally already; if the player turns from a stand-still, it will not be set. $1499 can be used to check this instead if the player is also holding an item.
$7E13DE 1 byte Player Poses used on overworld map and during credits by the player. The animation uses three frames, namely: this value, this value + 1, and this value + 2.
Can also be used as a "Player is looking up" flag. That's cleared every frame, and it's set to #$03 when holding the Up arrow and standing still. The graphics routine is the only code that actually reads it.
$7E13DF 1 byte Player This address controls which image must be shown of the cape. This obviously only has effect when the player has a cape at all.

While walking and sprint-jumping, frames 3 through 6 are cycled through, while 7 through A are used when falling downward. Pose zero is used for both standing still and jumping straight upwards, but is never shown without being preceded by frames 2 and 1.

Note that when the player is swooping/flying with his cape, $7E:13E0 will override the cape image. See also the diagram shown under $7E:13E0, poses #$2A through #$2F. Whatever value $7E:13DF has will be irrelevant during this phase.

Cape images beyond #$0A are not recommended for usage, as they are glitched.
Diagram
$7E13E0 1 byte Player This address controls the "main" poses of Mario and Luigi. Adjusting it will adjust the player's image as such.

Of note are the following poses. Poses #$40 and #$41 are blank - the player is "invisible". These are indicated with a large red cross in the diagram. Poses #$2A through #$2F absolutely require the player to have a cape powerup, otherwise they aren't shown correctly. Pose #$42 (inflated, small) can be shown regardless of powerup. It is obviously not recommended to be used as such. The same can be said about pose #$43 (inflated, big). Poses #$00, #$3D and #$46 are all used in the powerup animation. Poses #$14, #$20, #$21, #$27, #$28 and #$29 are all used during Yoshi riding. Any pose beyond #$46 is not recommended to use, as they can be glitchy.
Diagram
$7E13E1 1 byte Player What kind of slope the player is on (also set when flying with a cape). Valid Values
$7E13E2 1 byte Player Spinjump fireball timer. It increments every frame when the player spinjumps, if they have fire power. If the lowest four bits are clear, the player will throw out a fireball. The fourth bit (#$10) is the direction in which that fireball will move.
$7E13E3 1 byte Player Player is wall-running flag. Valid Values
$7E13E4 1 byte Player Player dash timer/P-meter. Increments with #$02 every frame the player is walking on the ground with the dash button held, otherwise decrements until it is zero. #$70 indicates that the player is at its maximum running speed, and also means that the player is able to fly with a cape.
$7E13E5 1 byte Player This is the index used to index the table at $00DC7C, to determine how many frames to store to the player animation timer, at $7E:1496. It changes depending on the surface the player is standing/walking/running on. Possible values
$7E13E6 2 bytes Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E13E8 1 byte Flag Cape spin interacts with sprites flag.
#$00 = don't interact; #$01 = do interact.
$7E13E9 2 bytes Player Cape interaction X position within the level. It's adjusted when the cape attack is used.
$7E13EB 2 bytes Player Cape interaction Y position within the level. It's adjusted when the cape attack is used.
$7E13ED 1 byte Player Player pose on a slope when sliding, is set to #$1C.
This value is also negative (bit 7 set) when landing from flying, which allows the player to slide.
$7E13EE 1 byte Player What kind of slope the player is on. Valid Values
$7E13EF 1 byte Player Player is on ground flag. Set to #$01 on Layer 1, #$02 on Layer 2, and #$03 when on both. If they're running fast enough up a slope, that value is doubled.

Is only set when touching an actual floor, and not when running up walls. Does not work correctly in blocks, as the value still has to be calculated at that point. Instead, the value is copied over to $7E008D during that time. If Layer 1 interaction is enabled, that address is also doubled.
$7E13F0 1 byte Player Used to calculate the index to the direction the player faces while using a climbing net door. The formula is $7E:149D << 1 & #$0E | $7E:13F0. This address gets its value from $7E:13F9.
$7E13F1 1 byte Flag Vertical Scroll enable flag. #$00 = disabled; #$01 = enabled. Not to be confused with $7E1412 (for most ASM codes, to enable/disable vertical scrolling, using $1412 is recommended instead).
$7E13F2 1 byte Empty Cleared on reset, titlescreen, overworld, and cutscene load, as well as at $00F8A7 (the routine that handles vertical scrolling).
$7E13F3 1 byte Timer When you get a P-balloon, this is set to #$09. Each frame afterwards, this is decremented until it gets to #$01, at which point the player will begin to show his inflated frame.
$7E13F4 5 bytes Blocks A byte assigned to each row of blocks in the coin bonus game. Updated as blocks are chosen by the player to decide whether a life is given or not. If the value is #$FF, a life will be handed out. $7E:13F4 is for the uppermost row, $7E:13F5 for the one below that, etc.
$7E13F9 1 byte Player Flag that sends Mario behind layers.
01 will send him behind objects, 02 will send him behind objects and sprites, and 03 will only send him behind sprites.

Setting to 01 also treats Mario as if he's behind a net, meaning he'll only interact with sprites also behind nets. 02 and 03 will disable sprite interaction altogether.
$7E13FA 1 byte Player Whether the player is capable of jumping out of the water immediately or not (so just below the surface). #$00 = No; #$01 = Yes.
$7E13FB 1 byte Player Player is frozen flag. This includes controls and animation. Other sprites still move and can interact with the player, but contact with them should be avoided, as it would freeze the game. This may be useful for cutscenes to eliminate the jumping sound.

Mainly used for the Yoshi growing animation from a baby to an adult, as well as while Yoshi is laying an egg or eating a berry. It's also used during the keyhole animation and at the start of Morton/Roy's fight.
$7E13FC 1 byte Misc. Currently active boss. Used for determining which graphics to load, as well as checking for various other purposes (like when the player should have priority over certain sprite backgrounds, that can be found in the boss rooms).
#$00 = Morton; #$01 = Roy; #$02 = Ludwig; #$03 = Bowser; #$04 = Reznor
Note that Iggy, Lemmy, Wendy and Larry don't make use of this. Cleared on level->overworld transitions, and possibly at other times too.
$7E13FD 1 byte Flag When the L/R button is pressed, this address gets set to #$01 which briefly freezes the screen while the screen scrolls in whatever direction you pressed. It's cleared again when scrolling is done.
$7E13FE 1 byte Misc. #$02 = scroll right, #$04 = scroll left. Used when L/R is pressed.
$7E13FF 1 byte Player Player direction ($7E:0076) times 2. Used in the L/R screen-scrolling routine to determine when the screen will stop scrolling.
$7E1400 1 byte Camera Controls if the camera should move to be at the proper place compared to the player. If this is set, L and R are ignored.
#$00 = normal case, don't move camera automatically, keep it in place (assuming L/R aren't used).
#$08 = move camera right.
#$0A = move camera left.
$7E1401 1 byte Timer Increments with one each time one of the L/R buttons is pressed, until the timer hits #$10 (at which the L/R screen scroll is activated) or if the buttons are released.
$7E1402 1 byte Blocks A flag that is set when the player is on a note block that is currently going down, i.e. the bounce sprite is moving downwards. If this wouldn't be set, the player would be pushed away from tile 152 (the tile that temporarily comes into place of the note block).
$7E1403 1 byte Misc. Settings for current layer 3 tide.
#$00 - Not a tide image
#$01 - Water level changes
#$02 - Water level doesn't change
$7E1404 1 byte Flag If "vertical scroll at will" is enabled, then this flag controls if the screen should scroll up to the player. If you set this to a non-zero value every frame, it can be seen as a temporary alternative to setting $00:F878/0x7A78 to #$80, since the latter is permanent.
$7E1405 1 byte Flag Indicates that the player is just about to warp to another level via a pipe, and whether or not Yoshi should be drawn at that point. It is set as soon as $7E:0088 reaches zero, and if Yoshi is inside the warp pipe too, his graphics will be hidden.
$7E1406 1 byte Camera This is set to #$80 if you bounce off of a springboard or a purple triangle (while on Yoshi, that is), and is cleared when touching the ground.
The game uses this, along with some other RAM addresses, to determine if the screen should scroll up with the player or not.
$7E1407 1 byte Player Player flying with cape phase.
Controls player pose as well (table at $00:CE79).
Valid Values
$7E1408 1 byte Player Used to index the cape gliding table at $00:D7D4 to see what the next step should be in the cape gliding phase. That value is (eventually) stored in $7E:1407.
#$00 = Make player rise.
#$01 = Make player sink (eventually swoop down).
#$02 = Holding off left/right button, make player sink, but not swoop down.
#$03 = Holding off left/right button, swooping down, make player sink less.
#$04 = Holding off left/right and X/Y buttons, terminate cape gliding.
$7E1409 1 byte Player Keeps track of the furthest stage the player has been diving during flight. Possible values are:
#$F8: the stage when not holding the right or left button
#$F4: Partially aiming towards floor
#$F0: Almost completely diving
#$C8: Diving completely, the stage where you cause an earthquake where you land.

When set to #$C8, the player will gain the large upwards boost (instead of the little normal boost) when cathing air.
$7E140A 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and during part of the cape flight routine.
$7E140B 2 bytes Empty Empty. Cleared on reset, titlescreen load, overworld load, cutscene load and level load.
$7E140D 1 byte Flag Spin Jump flag. #$00 = normal jump (or on ground); any other value = spinjumping.
$7E140E 1 byte Sprites Layer 2 is touched flag, which is used in the Layer 2 sinking/rising upon touch scroll sprite. #$00 = Layer 2 not touched; #$01 = Layer 2 touched.
$7E140F 1 byte Flag Keeps incrementing in the Reznor battle room. It is used as a flag to determine that a different OAM index needs to be used for a smoke sprite or a puff of smoke, to make sure there's no conflict with the platform tiles.
However, since this keeps incrementing and thus sometimes hits #$00 again, it can occur that a platform tile disappears for one frame when a smoke sprite is shown.
$7E1410 1 byte Flag Yoshi has wings flag #1 (the other is $7E:141E). #$01 would mean that the player with a fire flower powerup can shoot fireballs while on Yoshi (never occurs in the game), whereas #$02 indicates Yoshi has wings.
Note that this one only handles graphics of the wings (value #$02), and that it disables the Yoshi tongue action (value #$01).
The value from $7E:141E is stored here each frame.
$7E1411 2 bytes Camera Vertical and horizontal scroll settings from header:
$1411: Horizontal scroll settings from header flag. #$00 = Disable; #$01 = Enable.
$1412: Vertical scroll settings from header. #$00 = Disable; #$01 = Enable; #$02 = Enable if flying/climbing/etc.

Note that setting these to zero will merely disable the screen from scrolling within the player, as well checking the scroll limits to prevent it from escaping the level boundaries. It is disabled by auto-scroll sprite generators to prevent the code at $00F713 and $00F7F4 from interfering with the generator from moving the screen.
$7E1413 1 byte Misc. Horizontal scroll setting for Layer 2. #$00 = none; #$01 = constant; #$02 = variable.
$7E1414 1 byte Misc. Vertical scroll setting for Layer 2.
Lunar Magic v3.00 and above add values 04-07; the original game and older versions only allow 00-03.
Valid Values
$7E1415 2 bytes Empty Empty. Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E1417 2 bytes Camera The base vertical offset of Layer 2 from Layer 1, when vertical scrolling is enabled for it. This is calculated based on the type of vertical scrolling set in $1414, using the initial FG/BG positions stored to $1C and $20:

If $1414 is #$01 (constant), then this is: $20 - $1C
If $1414 is #$02 (variable), then this is: $20 - ($1C / 2)
If $1414 is #$03 (slow), then this is: $20 - ($1C / 8)
$7E1419 1 byte Sprites How sprites enter pipes with the player. This handles carried sprites and riding yoshi, and is always set regardless whether or not the player is carrying a sprite and whether or not is riding yoshi. When this RAM is set to any non-zero and the sprite is being carried and/or yoshi is being ridden on, they're placed behind layer 1 and yoshi's tongue is not shown (when licking).
  • $01 = Horizontal pipes (duck a little on yoshi and carrying sprites facing left or right).
  • $02 = Vertical pipes (face the screen).
  • $FF = Don't change image, only go behind layer (shooting out of slanted pipe). Note that this will probably work with all values #$03-#$FF.


Note: Yoshi always show his pipe animation pose regardless if the player is mounted on Yoshi or not, consider using this patch to fix it.
$7E141A 1 byte Counter Counter that increments every time a new level is entered (with a door or pipe) - this enables you to distinguish the 'mother'-level from sublevels, as this always is zero at the start of a level. Note: Don't enter a sublevel within a level 256 times, or a glitch will occur.
$7E141B 1 byte Flag Determines if you have played the bonus game before in the same level before. If it is non-zero (meaning you've played the game before), all blocks in the coin game will always be incorrect.
Note that if you don't hit a single block the first time playing the game, then this will be zero, and you can play the game again.
$7E141C 1 byte Flag What type of goal tape has just been hit, for deciding which event to activate after the goal walk is finished.
Although this value will still be written in vertical levels, it has no effect due to the goal walk not occurring.
Valid Values
$7E141D 1 byte Flag Whether "Mario/Luigi Start!" should be shown or not. Used for castle entrances and the likes.
#$00 = enable; #$01 = disable.
$7E141E 1 byte Yoshi Yoshi has wings flag. The only possible value for this address in the original is #$02, but setting to #$01 will allow the player to throw fireballs if on Yoshi, even if they don't have fire power. This will, however, disable flight as well as Yoshi's tongue attack.
It's recalculated each frame.
$7E141F 1 byte Flag Disable No Yoshi Intro flag.
#$00 = regular behavior (depending on the tileset, the No Yoshi Intro is either shown or not).
#$80 = the No Yoshi Intro is disabled, regardless of tileset.
$7E1420 1 byte Counter Yoshi Coins collected. Does not affect amount of Yoshi Coins on status bar.
$7E1421 1 byte Counter Counter used by the invisible 1-Up checkpoints. Starts at zero, and increments with one every time the next checkpoint has been touched. Resets to zero when a checkpoint has been touched that can't be checked yet, for example checkpoint #2 when #1 hasn't been touched yet.
$7E1422 1 byte Counter Amount of Yoshi Coins to display on the status bar. Values #$01 through #$04 are the values where it will display that number of Yoshi Coins, otherwise none are displayed.
$7E1423 1 byte Misc. Indicates which switch palace switch is being pressed.
Its value also varies depending on which side of the switch was pressed. (Left side -> it uses the first value, right side -> it uses the second.)
01/02 = green, 05/06 = yellow, 09/0A = blue, 0D/0E = red.
The bottom halves also set this, but this doesn't trigger anything.
$7E1424 1 byte Timer Used to determine whether or not the victory walk should display the number of collected bonus stars. If it is zero (see also $7E:1900), the amount of collected bonus stars is not displayed. Otherwise, it is. $7E:1900 is stored to it, causing this address to decrement as well. Also note that this value does NOT have any effect on the rest of the bonus text.
$7E1425 1 byte Flag Bonus game flag. If anything non-zero, the bonus game will commence after the level has been cleared.
$7E1426 1 byte Misc. Message box trigger. #$00 = none; #$01 = message 1; #$02 = message 2; #$03 = Yoshi thanks message.
$7E1427 1 byte Misc. Bowser clown car image.
#$00 = Regular.
#$01 = Blinking.
#$02 = Hurt.
#$03 = Angry face.
Higher values makes it cycle through the above ones.
$7E1428 1 byte Sprites Used as an index for the frames of the Bowser propeller. Valid frames range from #$00-#$03.
$7E1429 1 byte Sprites Used to calculate which palette to use for Bowser. Valid values range from #$00-#$07. This value is calculated based on the Mode 7 scale factor, with the table at $03:A265.
$7E142A 6 bytes Camera A set of RAM addresses used to determine the horizontal static camera region, which defines the size and position of the area in which Mario's movement should not cause the screen to scroll horizontally. There are three different 16-bit values involved in this:
- $142A: The origin position of the region.
- $142C: The left edge of the region (by default equal to $142A - #$000C).
- $142E: The right edge of the region (by default equal to $142A + #$000C).

It is worth noting that writing to $142C/$142E will not actually do anything, as those values are automatically recalculated every frame (at $00F6E0).
$7E1430 1 byte Blocks Lowest tile that's solid for sprites from below (in addition to 111 through 16D). It's on page 1.
$7E1431 1 byte Blocks Highest tile that's solid for sprites from below (in addition to 111 through 16D) plus 1. It's on page 1.
$7E1432 1 byte Flag Directional coin activation flag. This is set to #$01 when the sprite changes the music, and it is used to prevent the player being able to spawn any more than one instance of the sprite in an entire level, as it carries across sublevels.
$7E1433 1 byte Timer Scaling factor of the circle for the windowing HDMA effects used with the titlescreen, level ending and keyhole.
The closer to zero, the smaller the circle.
Loads titlescreen when value becomes #$F0 or higher.
$7E1434 1 byte Timer Set to #$30 to end level via keyhole. Works as a timer of some sorts, to indicate how long the keyhole sequence should last - but in SMW, this value is never set to anything other than #$00 or #$30. Also, this address freezes player and sprites by storing its value to $7E:13FB, resp. $7E:009D.
$7E1435 1 byte Flag Keyhole growing/shrinking flag. #$00 = growing; #$01 = shrinking.
$7E1436 2 bytes Misc. Used for multiple purposes.
Keyholes use it as the X position of the keyhole animation.
The Iggy/Larry boss fight uses it to control the player's X position when on the ground.

The overworld also uses it when spawning switch palace blocks.
$1436 is used as the current base index to the tables at $7EB900; it increments by 0x08 with each set of blocks up to 0x28, at which point it resets to 0x00.
$1437 is used as a timer for waiting between spawning each set of switch blocks.
$7E1438 2 bytes Misc. Used for multiple purposes.
Keyholes use it as the Y position of the keyhole animation.
The Iggy/Larry boss fight uses it to control the player's Y position when on the ground.

The overworld also uses it when spawning switch palace blocks.
$1438 is the base OAM index of the current block set. Increments by 0x20 with each set of blocks, then resets to 0x00 once it reaches 0xA0.
$1439 is a counter for how many sets of blocks have been spawned. It stops spawning at 0x08, but keeps counting up to 0x0C, at which point the spawn routine ends.
$7E143A 1 byte Flag When set to a value that is not zero, this will make the game overwrite tiles #$00 through #$05, #$10 through #$15, #$4A through #$4F and #$5A through #$5F with data it gets from $7F:977B-$7F:9A7A. These are uploaded during V-blank (NMI).
Is used to write the graphics for "MARIO START!", "LUIGI START!", "TIME UP!", "GAME OVER" and "BONUS GAME".
$7E143B 1 byte Misc. Which death message must be displayed. #$14 = "GAME OVER"; #$1D = "TIME UP!".
$7E143C 1 byte Timer Death message animation timer. Amount of time until the two segments come together, such as with "GAME OVER", where the animation goes like this: GAME --> <-- OVER.
Is set to #$C0, decrements by four at a time.
$7E143D 1 byte Timer Timer for the "TIME UP!"/"GAME OVER" death message - how long it should stay active after the two words have come together. Is set to #$FF, decrements by one at a time.
$7E143E 1 byte Sprites Scroll command number.

Also used during castle cutscenes. Iggy/Ludwig/Roy use it to indicate the switch was hit, Wendy uses it to indicate when the castle is fully erased, and Morton/Lemmy/Larry use it for deciding how to move the castle.
Valid Values
$7E143F 1 byte Sprites Scroll command number used on layer 2. This address serves as a complement to $7E:143E. This address is set by the init routine of the layer one of each scroll address.

Also used during castle destruction cutscenes as a timer for animations, as well as a few miscellaneous wait timers.
$7E1440 1 byte Sprites The starting Y-position of the current scroll sprite, left-shifted twice and with the extra bits still added. (Format: --YYYYEE, where Y = Y position and EE = extra bits).
Regularly adjusted inside the scroll sprites. It can be particularly useful for determining what type of scrolling should be applied with this scroll sprite.
This address is used for Layer 1 scrolling.

Also used during the castle destruction cutscenes as a frame number for various animations.
$7E1441 1 byte Sprites The starting Y-position of the current scroll sprite, left-shifted twice and with the extra bits still added. (Format: --YYYYEE, where Y = Y position and EE = extra bits).
Regularly adjusted inside the scroll sprites. It can be particularly useful for determining what type of scrolling should be applied with this scroll sprite.
This address is used for Layer 2 scrolling.

Also used during Iggy, Ludwig, and Roy's castle destruction scenes as a timer for the explosion.
$7E1442 1 byte Misc. Various flags used in the Yoshi's House portion of the credits scene. Used values:
#$00 = Player and companion walks in
#$01 = Various Yoshis duck and watch in excitement.
#$02 = Eggs are shattering, one by one.
#$03 = Yoshis get up and "THANK YOU" appears on Yoshi's house.
#$04 = Yoshis jump in excitement, then screen fades out.
24-bit pointers for these actions are located at SNES $0C:A1DE.

Also used in the castle destruction sequence as a pointer to what actions should be taken. Each castle destruction has its own pointer table for this address. $0C:C9A5 is a pointer table which points the the pointer tables of each castle.

Used in scroll sprites for tracking what type of scroll it is currently doing, usually depending on $7E:1440/$7E:1441. This is the Layer 1 counterpart of $7E:1443.
Castle Sequences Actions
$7E1443 1 byte Sprites Used in scroll sprites for tracking what type of scroll it is currently doing, usually depending on $7E:1440/$7E:1441. This is the Layer 2 counterpart of $7E:1442.

It's also a castle destruction sequence text timer. Starts at #$FF when the 'Welcome' music starts, and a new line of text appears every #$20 frames after that. (#$DF, #$BF, #$9F, etc.)
$7E1444 1 byte Misc. Layer 1 scroll command pointer/timer. This timer serves no defined purpose on itself, but is generally used for waiting a specific number of frames before updating scroll properties such as speed. For example, with the Layer 1 auto-scroll, this value being #$00 indicates the auto-scroll has finished.

Also used during the castle destruction scenes as an indicator to show the white surrender flag.

Also used as a flag on the overworld to indicate if the player is on a level tile. Value is #$00 when on a path tile, and #$01 when on a level tile.
$7E1445 1 byte Sprites Layer 2 scroll command pointer/timer. This timer serves no defined purpose on itself, but is generally used for waiting a specific number of frames before updating scroll properties such as speed.

Also used during the castle destruction cutscenes for various purposes. Lemmy uses it as a timer for the hammer animation, Ludwig and Roy uses it as a counter for the ? marks (0-3 for Roy and 4-7 for Ludwig), and Wendy uses it to decide how the broom should move.
$7E1446 2 bytes Sprites Layer 1 X speed used in the scrolling codes.
#$0001-#$7FFF = move left; #$8000-#$FFFF = move right. #$0000 means there is no movement.
Effectively, it's the X speed to give the player when they're touching the side of a screen, during a level which does not have regular Layer 1 scrolling. Values are different depending on the type of (auto-)scroll.
This value divided by #$10/#16 is stored into $7E:007B.

Additionally used during the castle destruction cutscenes for various purposes. $1446 is used in Morton/Roy's scenes to show the huff cloud at the end and as the Y position of the broom in Wendy's scene.
$1447 is used in Ludwig's scene as the vertical speed of the castle as well as a counter for the dust animation when it hits the hill, and in Larry's as the vertical speed of the castle as well as a timer for when it crashes.
$7E1448 2 bytes Sprites Layer 1 Y speed used in the scrolling codes.
#$0001-#$7FFF = move upwards; #$8000-#$FFFF = move downwards. #$0000 means there is no movement.

$1449 specifically is also used as a timer in Wendy's castle destruction scene for pausing between shifting broom directions or moving Mario to the side.
$7E144A 2 bytes Sprites Layer 2 X speed used in the scrolling codes.
#$0001-#$7FFF = move left; #$8000-#$FFFF = move right. #$0000 means there is no movement.

$144A specifically is also used in the castle destruction cutscenes to indicate what sprite Mario is holding, if any, 00 indicates the egg, 01 indicates nothing, and anything greater indicates something else (e.g. the hammer or broom).
$7E144C 2 bytes Sprites Layer 2 Y speed used in the scrolling codes, particularly in the Layer 2 scroll command (sprite EA).
#$0001-#$7FFF = move upwards; #$8000-#$FFFF = move downwards. #$0000 means there is no movement.

$7E:144D also controls the time until you can press a button to end the castle destruction sequence (after all text has been generated on-screen).
$7E144E 2 bytes Sprites This is used internally by the scroll sprites for updating the layer 1 X position. In particular, the routine at $05:C4F9 uses it to add the current speed to.

Furthermore, $7E:144E is used on the overworld to determine after how many frames the player should face the screen again after settling on a level tile.

$7E:144E is also used in the credits, as a timer that is set to #$06 and decrements every frame. If this is zero, bit 0 of $7E:144F will get flipped, causing Peach's image during the walking phase to bounce.

$7E:144F is a flag that makes Peach bounce during the time she walks in the credits.
#$00 = Peach frame 1, upright; #$01 = Peach frame 2, one pixel lower.
$7E1450 2 bytes Sprites This is used internally by the scroll sprites for updating the layer 1 Y position. In particular, the routine at $05:C4F9 uses it to add the current speed to.
$7E1452 2 bytes Sprites This is used internally by the scroll sprites for updating the layer 2 X position. In particular, the routine at $05:C4F9 uses it to add the current speed to.
$7E1454 2 bytes Sprites This is used internally by the scroll sprites for updating the layer 2 Y position. In particular, the routine at $05:C4F9 uses it to add the current speed to.
$7E1456 1 byte Sprites Used by the scroll sprites as an index for what layer to process. #$00 is Layer 1, and #$04 is Layer 2. The RAM addresses indexed include the entire area of $7E:1446-$7E:1455.
$7E1457 1 byte Flag This flag is set and used to determine whether to upload the multicolor Yoshis in the ending cutscene. The surprised Yoshi image (when the eggs are hatching) will appear regardless of this address, but the jumping Yoshi images require this flag to be #$01.
If anything else, they will not be drawn on-screen.
$7E1458 2 bytes Misc. Used in the Layer 3 images to control the X speed of Layer 3. This address is primarily used for the tileset specific images (not #$01 or #$03), for example the goldfish and the ghost house fog.
$7E145A 2 bytes Misc. Used in the Layer 3 images to control the Y speed of Layer 3. This address is used primarily for the rising/falling Layer 3 tide.

$7E145B is also used during the credits sequence for different purposes. During the Yoshi House portion, it's used as a counter for the number of Yoshi eggs hatched. It's also used as a timer to transition from the Yoshi House cutscene to the enemy roll, and subsequently as a timer for each enemy credit screen.
$7E145C 2 bytes Misc. This is used internally by Layer 3 images for updating the Layer 3 X position, which is used in (for example) the goldfish and ghost house fog.
It's also used as accumulating fraction bits for the Layer 3 Y speed during the rising/sinking Layer 3 tide.

$7E:145D is also used as a timer to determine when to move to the next game mode after the Yoshi house credits scene. Is set to #$F0 the moment all eggs hatched.
$7E145E 2 bytes Misc. Used by Lunar Magic to hold various settings, mainly related to Layer 3:

$145E: yyyyyose
- yyyyy: Initial Layer 3 Y position. Equal to the value shown in the "Initial Y Position/Offset" box divided by 2.
- o: Make sprites beyond level boundaries interact with air instead of water.
- s: Enable Layer 3 scroll sync fix.
- e: Enable advanced Layer 3 bypass settings.

$145F: yyyyxxxx
- yyyy: Vertical Layer 3 scroll setting.
- xxxx: Horizontal Layer 3 scroll setting.

Empty in original game. Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E1460 1 byte Misc. Layer 3 vertical scrolling direction. #$00 = downwards; #$01 = upwards.
Also used by Lunar Magic when a level is set for auto layer 3 vertical scrolling, in which case it combines with $7E:1461 to hold Y accumulation bits.
$7E1461 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and cutscene load.
This byte functions as the "high byte" of $7E:1460. SMW does not actually use this byte, however it is overwritten during level load (see $05:BE92).
Cleared on reset, titlescreen, overworld, level (with the exception of boss rooms) and cutscene load.
$7E1462 2 bytes Misc. Layer 1 X position, next frame.
Much similar to $7E:001A, maintaining the exact same values, with the difference being the usage of their values.
This is more notable in auto-scroll commands, for example, if $7E:1462 were to remain static while there was a Layer 2 auto-scroll going, the image would stay, but the level would move.
Is also used for temporary storage to determine how much the screen has moved horizontally in the current frame. ($7E:001A - $7E:1462 = $7E:17BD)

Also used during the credits scene for the second layer 1 X position, where the output is separated in two halves, each with their own scrolling.
$7E1464 2 bytes Misc. Layer 1 Y position, next frame.
Much similar to $7E:001C.
Is also used for temporary storage to determine how much the screen has moved vertically in the current frame. ($7E:001C - $7E:1464 = $7E:17BC)
$7E1466 2 bytes Misc. Layer 2 X position, next frame.
Much similar to $7E:001E.
Is also used for temporary storage to determine how much the screen has moved horizontally in the current frame. ($7E:001E - $7E:1466 = $7E:17BF)
$7E1468 2 bytes Misc. Layer 2 Y position, next frame.
Much similar to $7E:0020.
Is also used for temporary storage to determine how much Layer 2 has moved vertically in the current frame. ($7E:0020 - $7E:1468 = $7E:17BE)
$7E146A 2 bytes Misc. Used to determine how much layer 3 has moved horizontally in the current frame. This address is only used during the credits while displaying the enemies for the windowing HDMA.
Also used by Lunar Magic to hold the Layer 3 Initial X position/offset.
$7E146C 2 bytes Misc. When the level is using the advanced Layer 3 bypass, Lunar Magic (v3.10+) uses this to hold the initial Layer 3 Y position/offset (multiplied by #$10). This value is then used during the level to calculate the position of Layer 3 after scrolling.
$7E146E 2 bytes Empty Empty. Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E1470 1 byte Flag Carrying something flag. Very similar to $7E:148F, with the difference that, if this flag is set, the player's graphics don't change, and throw blocks can still be picked up as long as $7E:148F remains zero. If used in a carryable custom sprite to check if the player is already carrying something, definitely combine it with $7E:148F to assure there are no exceptions.
#$00 = Carrying nothing; #$01 = carrying something.
$7E1471 1 byte Misc. Whether the player is on top of a solid sprite, and what kind of sprite that is.

#$01 = Standing on top of a floating rock, floating grass platform, floating skull, Mega Mole, carrot top lift, etc. This one calculates the player's position based on the next frame.
#$02 = Standing on top of a springboard, pea bouncer. This one calculates the player's position based on the next frame.
There's a check at $00:D60B so that the player can hold the jump button pressed for a longer while to jump higher.
#$03 = Standing on top of a brown chained platform, gray falling platform. This one calculates the player's position based on the current frame.
$7E1472 1 byte Sprites Left window X position of the top of the spotlight. It's always #$78. This is the value stored that is stored to $7E:147A every four frames.
$7E1473 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E1474 1 byte Sprites Right window X position of the top of the spotlight. It's always #$87. This is the value that is stored to $7E:147C every four frames.
$7E1475 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E1476 1 byte Sprites Left window X position of the extreme bottom of the spotlight.
Please note that this position is for the imaginary scanline #$FF, whereas there are normally only #$E0 scanlines on a screen.
That means that the value here is never equal to the left window X position on the very bottom of the screen, unless $7E:1476 is equal to $7E:1472, forming a straight vertical line.
$7E1477 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E1478 1 byte Sprites Right window X position of the extreme bottom of the spotlight.
Please note that this position is for the imaginary scanline #$FF, whereas there are normally only #$E0 scanlines on a screen.
That means that the value here is never equal to the right window X position on the very bottom of the screen, unless $7E:1478 is equal to $7E:1474, forming a straight vertical line.
$7E1479 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E147A 1 byte Sprites In the spotlight code, the left window X position of each scanline is calculated and temporarily stored here, after which this address stores its value to an even byte of $7E:04A0.
What is left at the end of every frame is the left window X position on the very bottom scanline.
This is used once in every four frames, probably to reduce lag.
$7E147B 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E147C 1 byte Sprites In the spotlight code, the right window X position of each scanline is calculated and temporarily stored here, after which this address stores its value to an odd byte of $7E:04A0.
What is left at the end of every frame is the right window X position on the very bottom scanline.
This address used once in every four frames, probably to reduce lag.
$7E147D 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E147E 1 byte Sprites Used by the spotlight to calculate whether or not to move the left window on a particular scan line into the direction of the resulting X position on the bottom left.
It works by adding the width from $7E:1480 to itself (starting at #$00 initially), and if the resulting value is higher than #$CF (or even overflows, setting the carry bit), the left window moves a pixel into the direction of the resulting X position on the bottom left.
$7E147F 1 byte Sprites Used by the spotlight to calculate whether or not to move the right window on a particular scan line into the direction of the resulting X position on the bottom right.
It works by adding the width from $7E:1481 to itself (starting at #$00 initially), and if the resulting value is higher than #$CF (or even overflows, setting the carry bit), the right window moves a pixel into the direction of the resulting X position on the bottom right.
$7E1480 1 byte Sprites Width between the top left window ($7E:1472) and the bottom left window ($7E:1476) of the spotlight. This value is always positive, and its sign flag is saved at $7E:1484.
$7E1481 1 byte Sprites Width between the top right window ($7E:1474) and the bottom right window ($7E:1478) of the spotlight. This value is always positive, and its sign flag is saved at $7E:1485.
$7E1482 1 byte Flag Used as a flag in the spotlight code to skip initialization of the top left, top right, bottom left, and bottom right RAM addresses.
#$00 = Run initialization; #$01 = Do not run initialization.
$7E1483 1 byte Sprites Used as a flag for the current direction the spotlight is moving. #$00 = spotlight is moving right; #$01 = spotlight is moving left.
$7E1484 1 byte Sprites A flag used in the spotlight code to determine which side of the top left window border the bottom left window border is on.
#$00 = bottom left is more to the left; #$01 = bottom left is on the same position, or more to the right.
$7E1485 1 byte Sprites A flag used in the spotlight code to determine which side of the top right window border the bottom right window border is on.
#$00 = bottom right is more to the left; #$01 = bottom right is on the same position, or more to the right.
$7E1486 1 byte Sprites Unused, set to #$01 in the dark room spotlight sprite. Change $03:C544 to EA EA EA (NOP #3) to change this into free RAM. If that patch is performed, this address is safe for other uses. Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E1487 4 bytes Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E148B 2 bytes Misc. Used by random number generation subroutine to determine the next output.
Do not use these if you want a random number. Use $7E:148D instead.
$7E148D 2 bytes Misc. Output of random number generation routine, located at $01:ACF9.
$7E148F 1 byte Player Flag used to detect if the player is holding an object (throw block, key, shell, etc.) Also adjusts the player image, different from $7E:1470. This address does store its value to $7E:1470.
If the player is carrying something, this address should usually (not always, regarding the glitch) prevent the player from holding a second item.
#$00 = Carrying nothing; #$01 = carrying something.
$7E1490 1 byte Timer Star power timer. Decrements every fourth frame, except when lock flag ($9D) AND while the freezable frame counter ($14) has a value divisible by 4, will decrement each frame (assuming it's a glitch). The music will revert when this timer reaches #$1E.
$7E1491 1 byte Sprites Amount of pixels on the X/Y axis a sprite has moved in the current frame. It is set after every call to update sprite position based on speed (see $01801A, $018022, and $01802A), and the routine that updates both X/Y position based on speed will leave $7E1491 with the movement on the X axis in this address. Very often used for rideable sprites as this address can be added to the player position to move the player in tandem with the sprite.

Note: If using $01802A (both X and Y movement), this contains the X-movement because it handles the Y movement first, then the X movement with the latter being the last write to $1491.
$7E1492 1 byte Timer Player peace image timer.
$7E1493 1 byte Timer End level timer. Setting to #$FF will end the level as a goal sphere / boss fight (use in conjunction with $7E13C6). Peace sign is shown here when the timer hits #$28. The switches (yellow, green, red and blue) set it to #$08.
$7E1494 1 byte Palettes Direction of the color fading at level end. Only the highest bit is ever read.
#$00 = getting darker; #$80 = getting brighter.
$7E1495 1 byte Timer Timer that controls fading and the level end scorecard. Increments and stops when it hits #$40. While it's ticking, the colors will fade; when it's done, $7E:003A through $7E:003D won't be read and the Layer 3 scrolling will be locked.
$7E1496 1 byte Timer Player animation timer. This controls a lot of things such as the walking/running animation rate, how long the death animation should last, how long to stay invisible for after getting the cape, the alternating player images when the player is walking over slippery surfaces, etc.
$7E1497 1 byte Timer Flashing invulnerability timer - not to be confused with the star timer. This is activated when the player gets hurt. Controls both interaction (player should not interact with sprites again) as well as the blinking graphics.
$7E1498 1 byte Timer Time to show player picking an item/object up pose.
$7E1499 1 byte Timer Time for player to face the screen. Normally, only set while Mario is Mario is turning with an item or entering a vertical pipe.
$7E149A 1 byte Timer Time to show player kicking something pose.
$7E149B 1 byte Timer Time for the player to change through palettes, as if they got a fire flower. Only ticks when the "get flower" animation is active, and is just a flag otherwise.
$7E149C 1 byte Timer Time to show player shooting a fireball pose.
$7E149D 1 byte Timer Side flipping climbing net sprite flag and timer. Whenever you punch the flipping net, this gets set to #$1E and decrements every frame till it's zero. That's how many frames the spinning animation lasts. It also determines the X speed the player has while they're on the climbing net sprite - this means that it should be decremented every frame in order to avoid issues.
$7E149E 1 byte Timer Player punches while climbing on a net flag and timer. Every time you punch a net this is set to #$08 and decremented till it's zero again. During the time it's not zero, the frame is displayed that shows the player punching the net. If you store #$08 or greater to it every frame you'll be hold onto the net without being able to move or get off.
When this RAM address is non-zero, the player can also not move.
$7E149F 1 byte Timer This timer controls the time until the player gets into gliding/sinking mode after they have jumped into the air with a cape. It is set to #$50 the moment they get airborne, and decrements every frame afterwards. The ability of raising any further stops at #$00.

Note that this doesn't reset when going into another sublevel, allowing the player to "carry over" flying if they spawn in midair (or jump immediately when placed on ground) and maintains holding dash.
$7E14A0 1 byte Timer How long the running frames should be shown after the player launches off with the cape. Is #$10 by default and decrements each frame.
$7E14A1 1 byte Timer Player slides a bit when turning around timer. Most notably used with very steep slopes. If this is non-zero, $7E:13DD's image (#$0D) won't be shown.
$7E14A2 1 byte Timer Used as a timer for the cape animation. This is what makes the cape wave when the player walks and what makes the cape fall when they stop.
$7E14A3 1 byte Timer A timer for Yoshi's tongue stretching out.
#$12 = Yoshi about to stretch out tongue (timer starts here), player pose #$27.
#$10 = $7E:18AE is set to #$06.
#$0C = Player now gets a different pose, #$28.
#$00 = Player now gets a different pose, #$20 (or #$21 if turning around, $7E:187A is used to determine that).
$7E14A4 1 byte Timer Time until the player advances a diving stage, while flying and holding forward, and time until the player pulls back up a stage, while flying and holding backward.
$7E14A5 1 byte Timer Timer for how long you keep floating after releasing B when floating with the cape.
$7E14A6 1 byte Player Cape spin timer.
$7E14A7 1 byte Timer Timer for breaking the bridge in Reznor battles. It is set to #$40 and decrements each frame. When it reaches #$3C, a tile on each side breaks. When it drops to #$00, a sound is played and it's reset to #$40 again.
$7E14A8 3 bytes Misc. Unused. $7E:14A8 decrements every frame automatically until it reaches zero, while $7E:14A9 and $7E:14AA decrement every fourth frame. $7E:14A9 is cleared when the player ground pounds with the cape (this can be prevented by setting $02:94C6 to NOP #3 or [EA EA EA]), and $7E:14AA is set to #$40 when Yoshi grabs the wings (this can be stopped by setting $01:F6CF to NOP #3 or [EA EA EA]).
$7E14AB 1 byte Timer Bonus game ending timer. Does nothing in a normal level, but during a bonus game, setting it will end the bonus game and return to the overworld. At #$44 it starts the "end bonus game" music, and at #$01 it actually fades to the overworld.
$7E14AC 1 byte Empty Empty. However, due to the code at $00:C563 and $00:C513, it decrements every fourth frame until it hits zero.
$7E14AD 1 byte Timer Blue P-Switch timer. Decrements every fourth frame (you can convert seconds to this timer value via PSwitchTimerLength = Seconds * 15). The P-switch running out sound is played when this hits #$1E.
$7E14AE 1 byte Timer Silver P-Switch timer. Decrements every fourth frame (you can convert seconds to this timer value via PSwitchTimerLength = Seconds * 15). The P-switch running out sound is played when this hits #$1E.
$7E14AF 1 byte Flag On/Off Switch value. #$00 is ON and all others (non-zero, i.e. #$01-#$FF) are OFF.
$7E14B0 2 bytes Misc. Used for multiple purposes.

The 16-bit address forms the center X position of the brown chained platform that is currently processed. The formula for this address = $7E:14B4 - $7E:14BC.

Additionally, the Lakitu cloud graphics routine uses $7E:14B0 as scratch RAM for the X position of a tile.

$7E:14B0 is furthermore used in the Bowser battle as a timer between his various attacks. Set to #$78 at the beginning, and between attacks afterwards it is set to #$54 each time.
Note that, whether he throws the Mechakoopas or not, does not only depend on this address!

And finally, $7E:14B1 is a timer that is set to #$FF when Bowser begins with the Mechakoopa attack. Note that the Mechakoopas are thrown when this timer is at #$80.
$7E14B2 2 bytes Misc. Used for multiple purposes.

The 16-bit address forms the center Y position of the brown chained platform that is currently processed. Note that, since the radius based on the sprite Y position is always zero, this holds the same value as $7E:14B6. The formula for this address = $7E:14B6 - $7E:14BF.

Additionally, the Lakitu cloud graphics routine uses $7E:14B2 as scratch RAM for the Y position of a tile.

$7E:14B2 is also a flag for scaling when Bowser is flying away. #$00 = shrinking; #$01 = growing; #$02 = disappear.

And finally, $7E:14B3 is an incrementing index to the Y position for the teardrop tile that appears on the Clown Car when Bowser is hurt.
$7E14B4 2 bytes Misc. Used for multiple purposes.

The 16-bit address is the X position of the brown chained platform sprite at cos a = 1. It is in fact a mirror of the sprite X position, which always stays the same. By subtracting the horizontal radius ($7E:14BC) from this address, the center position to revolve around is calculated.

The 16-bit address is also used to determine Iggy/Larry interactive X position, as well as the player's fireball X position during this boss battle.

$7E:14B4 is used in the Bowser battle as an index to what music should be played in phase 2 and 3. It only appears to have these values after written to:
#$07 = Use track #$19.
#$08 = Use track #$1A.
Both tracks are identical. Perhaps this seperation was intended to be used so that a different track played on each phase.

And finally, $7E:14B5 is a timer for Bowser's hurt state. If non-zero, Bowser will show his hurt pose.
$7E14B6 2 bytes Sprites Used for multiple purposes.

The 16-bit address is the Y position of the brown chained platform sprite at sin a = 0. It is in fact a mirror of the sprite Y position, which always stays the same. By subtracting the horizontal radius ($7E:14BF) from this address, the center position to revolve around is calculated. Since $7E:14BF is always zero, the center position and this address always have the same identical value.

The 16-bit address is also used to determine Iggy/Larry interactive Y position, as well as the player's fireball Y position during this boss battle.

$7E:14B6 is also a timer that is set to #$FF when Bowser begins with the Big Steelie attack. Note that the Big Steelie is thrown when this timer is at #$80.

And finally, $7E:14B7 holds the X position of each new fireball that falls from the sky in the Bowser battle, as well as the index to the sound effects that are generated with them (table at $03:A841).
$7E14B8 2 bytes Misc. Used for multiple purposes.

The 16-bit address is the X position of the first (outermost) chain tile of the brown chained platform currently being processed. This address is responsible for the actual movement of the platform and interaction with the player.

$7E:14B8 itself seems to form a buffer for the X position of Iggy/Larry during that boss battle, much similar to $7E:14B4.

Lastly, $7E:14B8 is an attack counter used in the second phase of the Bowser battle to determine if Bowser should throw Mechakoopas or Big Steelies. It increments on every throw, on #$02 Mechakoopas are thrown, and on #$03 it resets to #$00.
$7E14BA 2 bytes Sprites Used for multiple purposes.

The 16-bit address is the Y position of the first (outermost) chain tile of the brown chained platform currently being processed. This address is responsible for the actual movement of the platform and interaction with the player.

$7E:14BA itself seems to form a buffer for the Y position of Iggy/Larry during that boss battle, much similar to $7E:14B6.
$7E14BC 2 bytes Sprites Radius of the rotating brown platform, by default this value is #$50 (found at $01:CACC). This value is subtracted from $7E:14B4 and stored into $7E:14B0.
In SMW however, the value is always #$50. Additionally, the high byte is always #$00.

Note that this radius depends on sprite X position (which stays the same). It calculates the center position of the imaginary circle you rotate around from that position.
The further you increment the radius, the further you will have to move the sprite to the right in order for the center position to be the same.

See also $7E:14BF.
$7E14BE 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E14BF 2 bytes Sprites Another type of radius that would rely on the brown chained platform's Y position, except that it's always #$0000, and thus effectively it does nothing. Subtracted from $7E:14B6 and stored into $7E:14B2. See also $7E:14BC.
$7E14C1 1 byte Empty Empty. Cleared on reset, titlescreen, overworld and cutscene load.
$7E14C2 2 bytes Sprites Used to hold the sine value of the brown rotating platform. Note that the range of this is always #$0000-#$0100. XOR isn't applied to this value when it is negative.
$7E14C4 1 byte Empty Empty. Cleared on reset, titlescreen, overworld and cutscene load.
$7E14C5 2 bytes Sprites Used to hold the cosine value of the brown rotating platform. Note that the range of this is always #$0000-#$0100. XOR isn't applied to this value when it is negative.
$7E14C7 1 byte Empty Empty. Cleared on reset, titlescreen, overworld and cutscene load.
$7E14C8 12 bytes Sprites Sprite status table.
State 0 indicates a sprite slot is empty and available to use.
State 1 indicates a slot has been claimed, but the sprite's code has not yet run.
States 8+ are generally used to indicate the sprite is alive, while states 2-7 indicate the sprite has been killed and should not run its usual code.
Valid values
$7E14D4 12 bytes Sprites Sprite Y position, high byte.
$7E14E0 12 bytes Sprites Sprite X position, high byte.
$7E14EC 12 bytes Sprites Accumulating fraction bits for fixed point sprite Y position (in fractions of 16, only the high nybble being used (%YYYY0000)). Modified via routine at $01ABCC-$01AC0C
$7E14F8 12 bytes Sprites Accumulating fraction bits for fixed point sprite X position (in fractions of 16, only the high nybble being used (%XXXX0000)). Modified via routine at $01ABCC-$01AC0C
$7E1504 12 bytes Sprites Miscellaneous sprite table. In the original game, it's only used in the revolving brown platform and nowhere else. More information can be found here.
$7E1510 12 bytes Sprites Miscellaneous sprite table. In the original game, it's only used in the revolving brown platform and nowhere else. Unlike $1504 (and every other sprite table), it is also not cleared by the sprite table initialization routine. More information can be found here.
$7E151C 12 bytes Sprites Miscellaneous sprite table. In SMW, it's used for vertical directions, and Yoshi uses it to determine which sprite to spawn out of an egg.
$7E:1520-$7E:1523 is a 'Reznor killed flag'. If a byte is set to #$01, the Reznor will disappear. Byte 1 is for Reznor 1, byte 2 for Reznor 2 and so on. More information can be found here.
$7E1528 12 bytes Sprites Miscellaneous sprite table. In SMW, it's used for Chargin' Chuck HP, Thwomp's face expression, etc. More information can be found here.
$7E1534 12 bytes Sprites Miscellaneous sprite table.
Certain powerups use this table as a blink-fall flag.
#$00 = Off; #$01 = On, powerup will blink and fall straight down.
The game stores #$01 here when it drops the reserved item from the item box. The blink-fall flag affects the Super Mushroom and the Fire Flower, but not the Cape Feather. The blink-fall flag also affects some other sprites, at least the Starman, the 1-Up mushroom and the coin sprite, but these sprites might glitch if you set the flag.
One glitch is that the blinking sprite-coin permanently occupies a sprite slot if it falls off the level, so that it might prevent the spawning of other common sprites.
Other than that, this address has many different purposes. More information can be found here.
$7E1540 12 bytes Sprites Miscellaneous sprite table. Table decrements itself once per frame, except for carryable sprites, where it decrements every second frame (the code at $0196D7 “slows” the timer by 1/2 by incrementing it every even frames ($13), which results in a decrement every odd frames).

Various sprites use this table as a stun timer. For example, this timer controls when flipped Goombas and squashed Mecha-Koopas decide to rise and walk. This table is also the sprite spinjump death frame counter - that is, how long to show the "spinjumped" image when the sprite is killed by a jump of such sorts. More information can be found here.
$7E154C 12 bytes Sprites Miscellaneous sprite table. Used as a timer to disable sprite contact with the player. Table decrements itself once per frame. More information can be found here.
$7E1558 12 bytes Sprites Miscellaneous sprite table. Used as a timer for how long a sprite is sinking in lava/mud. Table decrements itself once per frame. More information can be found here.
$7E1564 12 bytes Sprites Miscellaneous sprite table. Used as a timer to disable sprite contact with other sprites. Table decrements itself once per frame. More information can be found here.
$7E1570 12 bytes Sprites Miscellaneous sprite table. In SMW, it's used as a frame counter for timed lifts (amount of frames until it hits zero), a frame counter that indicates when sprites #$00-#$13 that have the 'Follow player' flag set should turn, etc. More information can be found here.
$7E157C 12 bytes Sprites Miscellaneous sprite table. It's most often used as a horizontal sprite direction table. #$00 = Right; #$01 = Left. More information can be found here.
$7E1588 12 bytes Sprites Sprite blocked status table. Format: asb?udlr.
a = touching Layer 2 from above.
s = touching Layer 2 from the side.
b = touching Layer 2 from below.
? = unknown, probably unused.
u = up.
d = down.
l = left.
r = right.
$7E1594 12 bytes Sprites Miscellaneous sprite table. In classic Piranha Plants, it is used to check if the sprite should be made visible and have interaction with the player. If it's any non-zero value, that Piranha Plant will become invisible. More information can be found here.
$7E15A0 12 bytes Sprites Sprite off screen flag table, horizontal.
$7E15AC 12 bytes Sprites Miscellaneous sprite table. It's often used as a timer to determine how long it takes to turn around. Table decrements itself once per frame. More information can be found here.
$7E15B8 12 bytes Sprites Determines what kind of slope a sprite is on. Valid Values
$7E15C4 12 bytes Sprites Flag set if a sprite is more than 4 tiles horizontally offscreen. Used by a few large sprites (e.g. turnblock bridges and chained platforms) to determine whether to draw any of the sprite at all.
$7E15D0 12 bytes Sprites Flag for whether the sprite is on Yoshi's tongue. #$00 = No; #$01 = Yes.
$7E15DC 12 bytes Sprites Flag to disable sprite interaction with objects. Ghost house ledge holes store their sprite index (plus one) to this to make sprites fall through the ground, but any non-zero value will work.
$7E15E8 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E15E9 1 byte Sprites Sprite index for the current sprite that is being processed. It can be used in a sprite to reload the current index in X after having used X for something else. Make sure you don't change it in a sprite's code, or unintended effects may happen (game crash, infinite loops, ...).
Most sprite types use this: normal sprites, spinning coin sprites, extended sprites, score sprites, cluster sprites, and shooters. Other sprite types use $1698.
$7E15EA 12 bytes Sprites Sprite index to the OAM table, handled by $0180D2 to quickly obtain an empty OAM slot.
Note: meant to be used as an index to the second half of the OAM table (use it for $0300 and $0460, not $0200 and $0420).
$7E15F6 12 bytes Sprites Sprite YXPPCCCT table. Many sprites use it in their graphics routines.
$7E1602 12 bytes Sprites Miscellaneous sprite table. Often used as graphics pointer. More information can be found here.
$7E160E 12 bytes Sprites Miscellaneous sprite table. In SMW, it is used to keep track of things such as the green bouncing Koopa's Y speed and the sprite number of certain spawned, kicked, etc. sprites. More information can be found here.
$7E161A 12 bytes Sprites Sprite index to the load status table (see $7E1938). $FF means the sprite won't be reloaded.
$7E1626 12 bytes Sprites Miscellaneous sprite table. Consecutive enemies killed by a sprite table. Each byte is how many sprites that particular sprite has killed. In SMW, this applies to sprites that can be thrown, such as Koopa shells. More information can be found here.
$7E1632 12 bytes Sprites "Sprite is behind scenery" flag. Used by, among others, the net Koopas.
$7E163E 12 bytes Sprites Miscellaneous sprite table. Table decrements once per frame. In SMW, it's used as e.g. a timer that, when it's zero, makes Ludwig face the player, while he's spitting fireballs. More information can be found here.
$7E164A 12 bytes Sprites Sprite is in liquid indicator table. #$00 = Sprite not in liquid; #$01 = Sprite in water; #$80 = Sprite in lava.

Also used in the Morton/Roy battle as an indicator that the walls have to close in, and in Bowser's fight to indicate the music after Bowser is defeated has already started.
$7E1656 12 bytes Sprites Sprite properties, first Tweaker/MWR byte.
Format: sSjJcccc
s=Disappear in cloud of smoke.
S=Hop in/kick shells.
j=Dies when jumped on.
J=Can be jumped on (false = player gets hurt if they jump on the sprite, but can bounce off with a spin jump).
cccc=Object clipping.
$7E1662 12 bytes Sprites Sprite properties, second Tweaker/MWR byte.
Format: dscccccc
d=Falls straight down when killed
s=Use shell as death frame
cccccc=Sprite clipping
$7E166E 12 bytes Sprites Sprite properties, third Tweaker/MWR byte.
Format: lwcfpppg
l=Don't interact with layer 2 (or layer 3 tides)
w=Disable water splash
c=Disable cape killing
f=Disable fireball killing
ppp=Palette
g=Use second graphics page
$7E167A 12 bytes Sprites Sprite properties, fourth Tweaker/MWR byte.
Format: dpmksPiS
d=Don't use default interaction with player
p=Gives power-up when eaten by Yoshi
m=Process interaction with player every frame
k=Can't be kicked like a shell
s=Don't change into a shell when stunned
P=Process while off screen
i=Invincible to star/cape/fire/bouncing bricks
S=Don't disable clipping when killed with star
$7E1686 12 bytes Sprites Sprite properties, fifth Tweaker/MWR byte.
Format: dnctswye
d=Don't interact with objects
n=Spawns a new sprite
c=Don't turn into a coin when goal passed
t=Don't change direction if touched
s=Don't interact with other sprites
w=Weird ground behavior
y=Stay in Yoshi's mouth
e=Inedible
$7E1692 1 byte Sprites Sprite memory setting from header.
$7E1693 1 byte Blocks For the regular tiles in SMW, this holds the low byte of the Map16 number (Y contains the high byte). Within custom block code, this contains the low byte of the "acts like"/"act as" setting, Y has the high byte, and $03-$04 contain the actual Map16 number. This gets its value from a pointer to the Map16 tile table at $7E:C800 (Y gets its value from $7F:C800).
$7E1694 1 byte Blocks How many pixels the sprite should move down from the nearest 16x16 tile. Originally, its data comes from the table at $00:E632.
$7E1695 1 byte Misc. Used most often in tracking the second sprite currently being checked in various interaction routines, for example the second sprite's index in the sprite contact routine (used similarly to $7E15E9). It also serves a use during checking when a sprite is entering/exiting water.
$7E1696 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load, cutscene load and level load.
$7E1697 1 byte Counter Consecutive enemies stomped.
$7E1698 1 byte Sprites Current index being processed for a variety of sprite types, specifically minor extended sprites, bounce sprites, quake sprites, and smoke sprites.
$7E1699 4 bytes Sprites Bounce sprite type number. Valid Values
$7E169D 4 bytes Sprites Bounce sprite initialization flag table. #$00 = bounce sprite in init routine; #$01 = bounce sprite in main routine. Used for several things, such as generating tile 152 (invisible solid) once only.
$7E16A1 4 bytes Sprites Bounce sprite Y position, low byte.
$7E16A5 4 bytes Sprites Bounce sprite X position, low byte.
$7E16A9 4 bytes Sprites Bounce sprite Y position, high byte.
$7E16AD 4 bytes Sprites Bounce sprite X position, high byte.
$7E16B1 4 bytes Sprites Bounce sprite Y speed.
$7E16B5 4 bytes Sprites Bounce sprite X speed.
$7E16B9 4 bytes Sprites Accumulating fraction bits for bounce sprite X speed.
$7E16BD 4 bytes Sprites Accumulating fraction bits for bounce sprite Y speed.
$7E16C1 4 bytes Sprites Bounce sprite turns into Map16 tile. This uses the same values as $7E:009C.
$7E16C5 4 bytes Sprites Bounce sprite timer - amount of frames until bounce sprite disappears. Turn blocks are set to spinning mode when this timer runs out.
$7E16C9 4 bytes Sprites Block bounce sprite table.
Format: L-----DD
L is which layer it is on. Clear means it's on layer 1, set means it's on layer 2 (or layer 3 if applicable).
DD is the direction it is moving in. 00 = up; 01 = right; 10 = left; 11 = down.
$7E16CD 4 bytes Sprites Quake/interaction sprite type. 0 = empty, 1 = hitting/breaking a block, 2 = Yoshi's stomp.
$7E16D1 4 bytes Sprites Quake/interaction sprite X position, low byte.
$7E16D5 4 bytes Sprites Quake/interaction sprite X position, high byte.
$7E16D9 4 bytes Sprites Quake/interaction sprite Y position, low byte.
$7E16DD 4 bytes Sprites Quake/interaction sprite Y position, high byte.
$7E16E1 6 bytes Sprites Score/1-Up sprite number. Valid Values
$7E16E7 6 bytes Sprites Score/1-up sprite Y position, low byte.
$7E16ED 6 bytes Sprites Score/1-up sprite X position, low byte.
$7E16F3 6 bytes Sprites Score/1-up sprite X position, high byte.
$7E16F9 6 bytes Sprites Score/1-up sprite Y position, high byte.
$7E16FF 6 bytes Sprites Score/1-up sprite Y movement - how long the score sprite should move upwards. It is not possible to go down, and the maximum amount of frames is #$30. Additionally, the sprite is twice as slow with #$10-#$1F as with #$20-#$2F, and four times as slow with #$00-#$0F. The sprite terminates itself when this hits zero.
$7E1705 6 bytes Sprites Layer the score/1-up sprite is on. Used to control its position.
$7E170B 10 bytes Sprites Extended sprite number. Last two bytes reserved for fireballs. Valid Values
$7E1715 10 bytes Sprites Extended sprite Y position, low byte. Last two bytes reserved for fireballs.
$7E171F 10 bytes Sprites Extended sprite X position, low byte. Last two bytes reserved for fireballs.
$7E1729 10 bytes Sprites Extended sprite Y position, high byte. Last two bytes reserved for fireballs.
$7E1733 10 bytes Sprites Extended sprite X position, high byte. Last two bytes reserved for fireballs.
$7E173D 10 bytes Sprites Extended sprite Y speed. Last two bytes reserved for fireballs.
$7E1747 10 bytes Sprites Extended sprite X speed. Last two bytes reserved for fireballs.
$7E1751 10 bytes Sprites Accumulating fraction bits for extended sprite Y position (fractions of 16: %YYYY0000). The last two bytes are for the player's fireballs. Handled via $02B560.
$7E175B 10 bytes Sprites Accumulating fraction bits for extended sprite X position (fractions of 16: %XXXX0000). The last two bytes are for the player's fireballs. Handled via $02B560. The fireballs also use this table for a hit flag table.
$7E1765 10 bytes Sprites Extended sprite table. Most extended sprites increment this table and use it for their GFX table. (Use a different image every x frames.)
$7E176F 10 bytes Sprites Extended sprite table with multiple purposes. Fireballs use it as a frame counter table when they hit an object. Various other extended sprites, such as the trail of smoke, use it as a graphics pointer. Table decrements once per frame.
$7E1779 10 bytes Sprites Extended sprite goes behind layers flag. Last two bytes reserved for fireballs.
$7E1783 8 bytes Sprites Shooter number. #$00 = None, #$01 = Bullet Bill shooter, #$02 = Torpedo Launcher.
Pixi uses the most significant bits of this table to hold the extra bits of the shooter.
Extra bit usage
$7E178B 8 bytes Sprites Shooter Y position, low byte.
$7E1793 8 bytes Sprites Shooter Y position, high byte.
$7E179B 8 bytes Sprites Shooter X position, low byte.
$7E17A3 8 bytes Sprites Shooter X position, high byte.
$7E17AB 8 bytes Sprites Amount of time it takes for a shooter to shoot the next sprite. Decrements every 2 frames via $13.
$7E17B3 8 bytes Sprites Shooter's index to level table (see $7E:1938). Curiously, shooters are always reloaded, because there is no routine to erase them.
$7E17BB 1 byte Misc. Contains the low byte of the level number when loading the levels. It's cleared when the loading is done. Can be used as freeram, as the value from this is never actually used anywhere.
$7E17BC 1 byte Misc. How much the Y position of Layer 1 changed in the current frame. Only used by the originally unused winged cage sprite.
$7E17BD 1 byte Misc. How much the X position of Layer 1 changed in the current frame. Used in various instances, for example to check how fast the spinning coins should move horizontally when a goal tape is touched when there are sprites on screen.
$7E17BE 1 byte Misc. How much the Y position of Layer 2 changed in the current frame. Used when the player should be still compared to a moving layer 2. For example, it's used by the Layer 2 horizontal scroll sprite, F4.
$7E17BF 1 byte Misc. How much the X position of Layer 2 changed in the current frame.
$7E17C0 4 bytes Sprites Smoke sprite number. Valid Values
$7E17C4 4 bytes Sprites Smoke sprite Y position, low byte.
$7E17C8 4 bytes Sprites Smoke sprite X position, low byte.
$7E17CC 4 bytes Sprites Smoke sprite timer - amount of frames until smoke sprite disappears.
$7E17D0 4 bytes Sprites Spinning coin from block. If zero, the slot is free, otherwise it's occupied by such a spinning coin.
$7E17D4 4 bytes Sprites Spinning coin from block Y position, low byte.
$7E17D8 4 bytes Sprites Spinning coin from block Y speed. $20-$9F will terminate the sprite and cause a score sprite to appear.
$7E17DC 4 bytes Sprites Accumulating fraction bits for fixed point spinning coin from block Y speed.
$7E17E0 4 bytes Sprites Spinning coin from block X position, low byte.
$7E17E4 4 bytes Sprites Spinning coin from block table. Indicates whether the spinning coin is generated from a block on Layer 1, or Layer 2/3. Depending on the layer, it updates its position based on the layer's movements.
$7E17E8 4 bytes Sprites Spinning coin from block Y position, high byte.
$7E17EC 4 bytes Sprites Spinning coin from block X position, high byte.
$7E17F0 12 bytes Sprites Minor extended sprite number. Valid Values
$7E17FC 12 bytes Sprites Minor extended sprite Y position, low byte.
$7E1808 12 bytes Sprites Minor extended sprite X position, low byte.
$7E1814 12 bytes Sprites Minor extended sprite Y position, high byte.
$7E1820 12 bytes Sprites Minor extended sprite Y speed.
$7E182C 12 bytes Sprites Minor extended sprite X speed.
$7E1838 12 bytes Sprites Accumulating fraction bits for fixed point minor extended sprite Y speed.
$7E1844 12 bytes Sprites Accumulating fraction bits for fixed point minor extended sprite X speed.
$7E1850 12 bytes Sprites Minor extended sprite timer. Indicates how long the minor extended sprite is still staying active, on-screen.
$7E185C 1 byte Player Flag to disable player interaction with objects. Ghost house ledge holes store their sprite index (plus one) to this to make Mario fall through the ground, but any non-zero value will work.
$7E185D 1 byte Sprites Related to the spawning of extended sprites. Used to index $7E:17F0 (minor extended sprite type table) if there are no empty slots when an extended sprite needs to be spawned. This is so that the oldest extended sprite can be removed when a new one needs to be made.
$7E185E 1 byte Misc. Sometimes used to keep track of a tile to generate at $00:BEB0 (before storing to $7E:009C); may be used in conjunction with $7E:18B6. Also used to determine the player Y position when they're on the line guided rope and used to determine positions and such of Yoshi's tiles. In the sprite/object interaction routine, it's also used to indicate which layer the sprite is touching. 00 = layer 1; 01 = layer 2.
$7E185F 1 byte Sprites This is the low byte of the Map16 tile (actual tile number, not "acts like" setting) that a sprite is touching vertically. The high byte is at $18D7.

This, $1860, $1862, and $18D7 are set after $019138, the subroutine that allows the sprite to interact with objects, is called. (This includes $01802A, the routine that updates sprite position with gravity, which calls $019138.)
$7E1860 1 byte Sprites This is the low byte of the Map16 tile (actual tile number, not "acts like" setting) that a sprite is touching horizontally. The high byte is at $1862.

This, $185F, $1862, and $18D7 are set after $019138, the subroutine that allows the sprite to interact with objects, is called. (This includes $01802A, the routine that updates sprite position with gravity, which calls $019138.)
$7E1861 1 byte Sprites Which sprite to overwrite if all slots are full. Used for blocks containing sprites and the item box.
Note that only the last two slots can be overwritten using this method.
$7E1862 1 byte Sprites This is the high byte of the Map16 tile (actual tile number, not "acts like" setting) that a sprite is touching horizontally. The low byte is at $1860.

This, $185F, $1860, and $18D7 are set after $019138, the subroutine that allows the sprite to interact with objects, is called. (This includes $01802A, the routine that updates sprite position with gravity, which calls $019138.)
$7E1863 1 byte Sprites Smoke sprite index. Holds the first available smoke image index and resets to #$03 if all of them have been filled and another smoke image is spawned.
$7E1864 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E1865 1 byte Sprites Spinning coin from block index. Holds the first available index and resets to #$03 if all of them have been filled and another coin is spawned.
$7E1866 2 bytes Misc. Two seperate, 8-bit addresses used by the brown chained platform rotation routine. Used to tell if an angle is negative or not. Refer to $7E:0036 also.
$7E1868 1 byte Blocks Used as a mirror of $7E:1693 in stunned sprites. This address here is used to check if a sprite is hitting a smashable block (for example, a question mark block) from below.
$7E1869 2 bytes Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E186B 1 byte Blocks Multiple coin block timer - amount of time until the multiple coin block turns into a used block. Keeps decrementing until it's #$01, after that it stays that value until the block is hit again, at which it's turned into a used block. Then, this address gets set to zero.
$7E186C 12 bytes Sprites Sprite off screen flag table, vertical. For sprites in bank 1, if the sprite is set to be two tiles high (with $190F), then bits 0 and 1 correspond to the top and bottom tiles respectively.

The routine that sets this address in bank 2 and 3 has an error, however; this address instead does the 2-bit functionality if bit 5 of $1662 (which is one of the bits in the sprite clipping value). As a result, some sprites will register as vertically offscreen when they're actually just at the top of the screen.
$7E1878 1 byte Sprites Indicates where the player is on the X axis in relation to the currently-active revolving net door sprite. If this is #$00, the player is perfectly centered on the sprite horizontally. It will be positive if the player is toward the left side of the sprite (the farther left, the bigger the positive number) and negative if the player is toward the right side of the sprite (the farther right, the bigger the negative number).

Is used to calculate the player X speed as the net is turning around sideways.
$7E1879 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E187A 1 byte Yoshi Riding Yoshi Flag. #$00 = No, #$01 = Yes, #$02 = Yes, and turning around.
$7E187B 12 bytes Sprites Miscellaneous sprite table. Has the following purposes:

Sprite stomp immunity flag table - enables stomp immunity for sprites if the flag is set, meaning the sprite will act as a Chuck/Disco Shell when jumped on (when using default interaction). Additionally, any kicked sprite will move towards Mario like Disco Shells do.

Additionally, the changing item sprite uses it to determine which sprite it is (#$00 = mushroom, #$40 = fire flower, #$80 = feather, #$C0 = star), the goal tape determines by this address whether it activates the normal or secret exit, the radius of rotating chain sprites is held by this address, certain Yoshi abilities are handled, etc. More information can be found here.

$7E:1884 is also used to determine what background should be used during the Morton/Roy/Ludwig battle scene. #$00 = Ludwig; #$01 = Morton/Roy.
There is also a bug with the background flames during the Ludwig battle, as they seem to change color upon this address not being #$01. This is responsible for a palette glitch in the original SMW, where the fire turns into a greyish blue very briefly. Change $02:8380 to #$80 to fix the bug.
$7E1887 1 byte Timer Time to shake Layer 1.
$7E1888 2 bytes Misc. Layer 1 image relative Y position, used by $7E:1887 (shaking ground). Does not affect Layer 1 interaction. #$0000 = default value, Layer 1's image unchanged. The higher the value (positive, #$0001 and beyond), the more Layer 1 goes up. The lower the value (negative, wraps around to #$FFFF and below) the more Layer 1 goes down.
$7E188A 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load, hurt, death, and taking hit while cape flying ($00:F625 for the last three) and in the Peach Rescued scene ($03:AE39).
$7E188B 1 byte Player Player image-relative Y position, used by $7E:1887 (shaking ground). Does not affect player interaction. Unlike $7E:1888, this is an 8-bit address.
$7E188C 1 byte Flag Flag that determines if the game should keep updating the tile and YXPPCCCT data for the sprite background tiles in the Morton/Roy/Ludwig room.

#$00 = Keep updating; #$01 = Stop updating.
$7E188D 1 byte Misc. Used during the calculation of the X position of the background in the Morton/Roy/Ludwig room. It starts by copying the value from $7E:001A (8-bit) and getting the lowest bit from $7E:001B by using the carry bit. So first, this address is $7E:001A (9-bit) > 1.
This address is then, after it's inverted with EOR #$FF : INC A, used for $7E:0006 (scratch RAM, used for X displacement of all tiles).
$7E188E 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load, cutscene load and level load.
$7E188F 1 byte Sprites Used to indicate whether the bonus game is over. It will disable the interaction and movement.
$7E1890 1 byte Counter How many 1-Ups to spawn. (Used for bonus game.)
$7E1891 1 byte Timer P-balloon timer. Ticks down one step per four frames.
Note that setting this doesn't make the player fly away. The flight controller is $7E:13F3.
$7E1892 20 bytes Sprites Cluster sprite number. The pointer for those is at $02:F825. A list of possible values, as well as more information on cluster sprites in general, can be found here. Valid Values
$7E18A6 1 byte Empty Empty, unused RAM. Referenced at $01CF9E (Morton's code) but never actually used. Cleared on reset, titlescreen load, overworld load and level load.
$7E18A7 1 byte Blocks This address is a mirror of $7E:1693, which holds the Map16 number of the current block that is being checked. Primarily used in the Chargin' Chuck turn/throw block detection code.
$7E18A8 2 bytes Sprites Morton and Roy left and right pillar status. $7E:18A8 controls the left pillar, whereas $7E:18A9 is used for the right pillar.
#$00 = Pillar is not falling yet.
#$01 = Pillar is falling.
#$81 = Pillar has fallen.
$7E18AA 2 bytes Sprites Morton and Roy left and right pillar Y positions. $7E:18AA is the left pillar, $7E:18AB is the right pillar.
The pillar status ($7E:18A8 and $7E:18A9) is set to #$81 (pillar has fallen) as soon as this Y position becomes #$B0.
The Y speed here accelerates slightly - see $02:83F8 for reference.
$7E18AC 1 byte Yoshi Timer on when Yoshi will swallow the sprite in his mouth. It ticks down one step every fourth frame, and Yoshi's swallowing animation starts when this is #$26 or lower.
$7E18AD 1 byte Yoshi Frame counter for Yoshi's walking frames. It goes from #$00-#$02, forms an index for the image table at $01:EDEE, and becomes #$02 when it gets lower than #$00 (frame counter decrements).
This address is comparable with the player's version, at $7E:13DB.
$7E18AE 1 byte Timer How long it takes for Yoshi's tongue to come out after the player "hits" Yoshi (after $7E:14A3 becomes #$10). Starts at #$06 and decrements each frame.
$7E18AF 1 byte Yoshi Yoshi squatting timer. It's set to #$0C once the player hops onto Yoshi, decrements once every frame, and takes care of the ducking frame.
$7E18B0 2 bytes Yoshi Yoshi's X position. Used only to determine where Yoshi is when eating a berry (by means of walking into one, not sticking his tongue out).
$7E18B2 2 bytes Yoshi Yoshi's Y position. Used only to determine where Yoshi is when eating a berry (by means of walking into one, not sticking his tongue out).
$7E18B4 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E18B5 1 byte Flag Cleared when standing on the ground, set when standing on the floor of the unused winged cage. It tells whether the player should be following the cage or layer 1.
$7E18B6 1 byte Misc. Sometimes used to keep track of a tile to generate at $00:BEB0 (before storing to $7E:009C); may be in conjunction with $7E:185E. Also used to determine the player X position when they're on the line guided rope, used when the player is on top of Boo Block, etc.
$7E18B7 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E18B8 1 byte Flag Run cluster sprite code.
#$00 = No; #$01 = Yes.
$7E18B9 1 byte Sprites Generator type that is currently active. #$00 = None, #$01-#$0F = generators CB-D9. The pointers for this address are located at $02:B00C.
Pixi uses the most significant bits of this address to hold the extra bits of the generator.
Extra bit usage
$7E18BA 1 byte Sprites Index to the Boo rings that are on screen (maximum is two). Additionally, depending on bit 0 of this byte, the reappearing ghosts use position combination 1 or 2.
$7E18BB 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E18BC 1 byte Sprites Floating skull speed. It's set to #$00 in the sprite initial routine, and set to #$0C when the player touches the sprite.
$7E18BD 1 byte Timer Time to stun the player. It will make the player face the screen and make him unable to move.
$7E18BE 1 byte Flag Flag used to tell if the player can climb on air. The line guided ropes use this to let the player get onto them.
$7E18BF 1 byte Timer Timer used by a bunch of appearing/disappearing sprites (examples: Lakitu, Magikoopa, and Layer 3 smasher). Sprite D2 freezes it by incrementing the timer - effectively getting rid of the decrements applied by said sprites.
$7E18C0 1 byte Timer Timer for respawning certain sprites, such as the Boo Buddies or sprite E5 (and Lakitu). Sprite D2, Turn Off Generator 2, sets this to zero when it is active.
$7E18C1 1 byte Sprites Used by Magikoopa and Lakitu to determine which sprite number should respawn when $7E:18BF is zero.
$7E18C2 1 byte Flag Player is inside Lakitu cloud flag.
#$00 = Not inside Lakitu cloud.
#$01 = Inside Lakitu cloud.
If the latter, the player does not animate as if they were walking or floating.
$7E18C3 2 bytes Sprites Y position of the respawning sprite, used with $7E:18C0 (respawn timer) and $7E:18C1 (respawn sprite number).
$7E18C5 8 bytes Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E18CD 1 byte Sprites Bounce sprite (alternative) index. Also used as which bounce sprite to overwrite if all slots are full when resetting a turn block (similar to $7E1861).
$7E18CE 4 bytes Timer Spinning turn block timer - amount of frames a spinning turn block lasts. When it hits zero, it reverts to a regular turn block.
$7E18D2 1 byte Player This address is incremented every time the player kills a sprite with a star while the star is active and will reset when the star runs out.
#$01 = 200; #$02 = 400; #$03 = 800; #$04 = 1000; #$05 = 2000; #$06 = 4000; #$07 = 8000; #$08 and above = 1-Up
$7E18D3 1 byte Timer Write a value to here, and sparkles (like the ones from the stars) will fly around the player for that amount of frames. However, it is never used in the original game.
Note that if the player has an invincibility star, this timer will wait until the star runs out.
$7E18D4 1 byte Yoshi Red berries eaten by Yoshi. After 10 berries, the counter resets and Yoshi lays an egg, containing a mushroom.
$7E18D5 1 byte Yoshi Pink berries eaten by Yoshi. After 2 berries, the counter resets and Yoshi lays an egg, containing a coin game cloud.
$7E18D6 1 byte Yoshi Type of the current berry being eaten. #$00 = Coin (no effect except getting a coin), #$01 = Red, #$02 = Pink, #$03 = Green. Controls both color and what happens when Yoshi eats the berry.
$7E18D7 1 byte Sprites This is the high byte of the Map16 tile (actual tile number, not "acts like" setting) that a sprite is touching vertically. The low byte is at $185F.

This, $185F, $1860, and $1862 are set after $019138, the subroutine that allows the sprite to interact with objects, is called. (This includes $01802A, the routine that updates sprite position with gravity, which calls $019138.)
$7E18D8 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load, cutscene load and level load.
$7E18D9 1 byte Timer Timer for the castle/ghost house door in the intro sequence. The castle door starts at #$FF, the ghost house door starts at #$7F.
For the castle door: start rising and generate first sound at #$B0, rise until #$81, stay still until #$30, then sink and generate second sound at #$01.
For the ghost house door: open and generate first sound at #$76, then close and generate second sound at #$08.
$7E18DA 1 byte Yoshi Sprite number that spawns when Yoshi lays an egg. Valid values are #$74 (mushroom) and #$6A (coin game cloud).
$7E18DB 1 byte Empty Set to #$08 at $00:CDD4 (unreachable by default) and never touched again. Might have been intended as a starting index for the player's fireballs.
Cleared on reset, titlescreen load, overworld load and level load.
$7E18DC 1 byte Yoshi Flag that is set when the player is ducking with Yoshi. They cannot turn around in this state. If you were to use the debug codes at $00:D085-$00:D089, this also makes the fireballs that the player fires when on Yoshi appear at a different position.
$7E18DD 1 byte Counter Number of silver coins collected.
$7E18DE 1 byte Yoshi Timer that determines how long it takes before an egg is laid by Yoshi, when 10 red Berries have been eaten. Is set to #$20 by default. Also, as long as this timer is above #$01, the player is frozen ($7E:13FB is set).
$7E18DF 1 byte Yoshi Slot (index to $7E:009E and similar) of the current Yoshi, plus 1. Set to #$00 when the Yoshi despawns.

In reality, this address is set to #$00 every frame, and is then set by Yoshi when his code runs. Because of this, sprites that run before Yoshi won't be able to read his slot from this address.

For finding Yoshi's slot within custom sprite code, it is preferable to use $18E2, since $18DF is copied to that address before being reset.
$7E18E0 1 byte Timer Timer for how long stolen Lakitu clouds should remain before evaporating. Decrements once every four frames.
$7E18E1 1 byte Sprites Slot of the Lakitu cloud (index to the sprite table that corresponds to the Lakitu cloud sprite). Contains a valid value even if the Lakitu itself is still alive.
$7E18E2 1 byte Yoshi "Loose Yoshi" flag, and slot (index to $7E:009E and similar) of the current Yoshi, plus 1. Gets its value from $18DF. If set, Yoshis spawned from an egg will become a 1-up instead.

For finding Yoshi's slot within custom sprite code, it is preferable to use this address, since $18DF is reset every frame before being set by Yoshi again.
$7E18E3 1 byte Sprites How many of the coins from the coin game cloud (the one that appears if Yoshi eats two pink berries) the player has collected. Oddly enough, it's cleared if you get hurt.
$7E18E4 2 bytes Misc. Lives incrementer (increments lives over multiple frames instead of instantly), mainly handled by $028AB4-$028ACC.

$18E4: How many lives left to increase the current player's life count.
$18E5: How many frames left before each life is given to the player (this ignores $9D).
$7E18E6 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E18E7 1 byte Yoshi Yoshi ground stomp flag. #$00 = Yoshi does not stomp the ground when landing on it; #$01 = Yoshi does stomp the ground when landing on it.
This is set to #$01 when a Yellow Yoshi has a shell in its mouth, or when any Yoshi has a yellow shell in its mouth.
$7E18E8 1 byte Yoshi Yoshi growing animation timer. Starts at #$40 and then decrements. Additionally, it freezes everything on the screen except Yoshi.
$7E18E9 1 byte Sprites Occasionally used to index $7E:17C0 (smoke image table). If there are no empty slots left when a smoke image should be spawned, the oldest one is removed and the index is reset.
$7E18EA 12 bytes Sprites Minor extended sprite X position, high byte.
$7E18F6 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load, cutscene load and level load.
$7E18F7 1 byte Sprites Score sprite index.
$7E18F8 4 bytes Sprites Timer for quake/interaction sprites. This is set to #$06 and decrements by 1 each frame. If the timer is less than #$03, the quake sprite is allowed to interact with normal sprites (if $7E:16CD is not 0). When it reaches 0, the quake sprite is erased.
$7E18FC 1 byte Sprites Alternative extended sprite index, used when the extended sprite tables are full. Holds the first available extended sprite index and resets to #$07 if all of them have been filled and another extended sprite is spawned.
$7E18FD 1 byte Sprites Flag set when Whistlin' Chuck whistles, even when it's the Super Koopa-generating kind. Setting this makes Rip van Fish chase the player.
$7E18FE 1 byte Sprites The diagonal and surrounded bullet bills timer. It increments every second frame, and when it reaches #$A0, it sends out some more Bullet Bills and resets itself.
$7E18FF 1 byte Sprites Shooter index for the current shooter that is being processed.
$7E1900 1 byte Counter Bonus stars gained at level end - decrements to zero.
$7E1901 4 bytes Sprites YXPPCCCT data of bounce sprite that is being shown.
$7E1905 1 byte Counter Iggy's/Larry's platform total number of tilts made counter. It will increment everytime the platform will be at a maximum tilt.
Only the lowest bit is ever used, and it controls which direction it should move.
$7E1906 1 byte Timer Iggy/Larry's platform stationary phase timer. Is set to #$40 and decrements every frame. As long as it's not zero, the platform won't rotate.
$7E1907 1 byte Counter Iggy's platform rotation phase counter.
After the third phase ends, the counter resets.
Valid Values
$7E1908 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.
$7E1909 1 byte Flag Flag that makes the creating/eating block run or not run. #$FF = don't run, any other value = run. Set to #$00 when a brown block is touched.
$7E190A 1 byte Sprites Reappearing Boo frame counter. They start appearing at #$FF, become fully opaque at #$DF, start disappearing at #$3F, and become fully invisible at #$1F. The counter decrements every frame and doesn't stop when it hits #$00 unless sprite D2 is active, which causes it to freeze at #$FF.
$7E190B 1 byte Sprites Big Boo Boss palette index, used for the transparency effect. The reappearing Boos (cluster sprites) also use this. They set this address to #$08.
$7E190C 1 byte Timer Directional coin timer. Decrements every fourth frame.
$7E190D 1 byte Flag Used as a flag in the Bowser battle for whether or not the final cutscene is playing. Used to remove the item box, as well as several palette updates and using a different OAM index for the roof tiles. Any non-zero value activates the flag.
$7E190E 1 byte Sprites Sprite buoyancy settings from level header. Format: XY-- ---- (bits)
X = Enable sprite buoyancy. This reduces the number of sprites that can be on the screen at once without slowing down.
Y = Enable sprite buoyancy and disable all other sprite interaction with layer 2. This reduces the processing cost and slowdown.
$7E190F 12 bytes Sprites Sprite properties, sixth Tweaker/MWR byte.
Format: wcdj5sDp
w=Don't get stuck in walls (carryable sprites)
c=Don't turn into a coin with silver POW
d=Death frame 2 tiles high
j=Can be jumped on with upward Y speed
5=Takes 5 fireballs to kill. Clear means it's killed by one. The hit counter is at $7E:1528.
s=Can't be killed by sliding
D=Don't erase when goal passed
p=Make platform passable from below
$7E191B 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load, and every frame when Yoshi is on screen. The latter can be disabled by changing $01:EBD9 from [9C 1B 19] to [80 01 EA].
$7E191C 1 byte Yoshi Indicates whether or not Yoshi has a key in his mouth. #$00 = no, #$01 = yes.
$7E191D 1 byte Sprites Which cluster sprite to overwrite for the Sumo Bros. lightning's flames if all usable slots are full. Only cycles through sprites 0 to 9.
$7E191E 1 byte Misc. Is set to a value #$00-#$03 when pressing a big switch. Depending on the value, either a green, yellow, blue or red flat switch sprite will be left behind in the room.
$7E191F 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E1920 1 byte Counter How many 1-Ups from the bonus game are still not collected. Decrements every time a 1-Up is collected. The bonus game ends when this address hits zero.
$7E1921 1 byte Misc. During the cutscene after defeating Bowser, indicates which letter the "Mario's adventure is over..." message is currently at. Ends at #$54.
$7E1922 1 byte Should be 00 High byte of $7E:1921. This is never any value other than #$00 in the original SMW, but since $7E:1921 is sometimes loaded in 16-bit mode, it's not a good idea to use it if you're using the original Bowser battle. Cleared on reset, title screen load, and overworld load.
$7E1923 2 bytes Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E1925 1 byte Misc. Level mode settings from level header.
$7E1926 2 bytes Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E1928 1 byte Misc. One of two screen numbers used in the level loading routine. This one points to where the current object is placed and is never changed inside an object loading code. The other screen number is $7E:1BA1.

It is also used in the credits as a pointer to which background should be used for which part of the credits roll.
$7E1929 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E192A 1 byte Misc. RAM address used to hold some information from the level entrance. Format: swaaaaaa. s = slippery level, w = water level, a = player action. If one of bits 3-5 is set, the player action will be "vertical pipe exit downwards, water level".
Note that the s and w bits are cleared after being transferred to $85/$86, so they'll be 0 when read mid-level.
$7E192B 1 byte Graphics Sprite GFX setting from the level header. Also used on the overworld and in cutscenes to determine the graphics files that should be uploaded. Valid Values
$7E192C 1 byte Empty Empty. Cleared on reset, titlescreen load and overworld load.
$7E192D 1 byte Misc. FG palette settings from the level header.
$7E192E 1 byte Misc. Sprite palette settings from the level header.
$7E192F 1 byte Misc. Background color settings from the level header.
$7E1930 1 byte Misc. Background palette settings from the level header.
$7E1931 1 byte Misc. FG/BG GFX setting from the level header. Also used on the overworld and in cutscenes to determine the graphics files that should be uploaded.

FE and FF are special values used by Mode 7 levels in order to upload GFX27 instead.
Valid Values
$7E1932 1 byte Misc. Copy of the tileset setting from the level header. Never read by anything.
$7E1933 1 byte Misc. Layer being processed. #$00 = Layer 1; #$01 = Layer 2/3 (depending on which is interactive). Used in both level loading routine and processing interactions.
$7E1934 1 byte Should be 00 While this is never non-zero in the original SMW, $7E:1933 (current layer) is sometimes used in 16bit mode, so using this address for different purposes is a bad idea.
$7E1935 1 byte Flag When set to a non-zero value, it'll overwrite tiles #$4A-#$4F and #$5A-#$5F with graphics which it gets from $7E:0BF6 on level load. Used by the MARIO START! sign. Flag is immediately cleared after that.
$7E1936 2 bytes Misc. Used by Lunar Magic v3.00+ (hijack at $00F70D) to hold the vertical scrolling range minus one tile (when “Allow viewing full bottom row of tiles” is unchecked). Effectively equivalent to $13D7 - #$10.
$7E1938 128 bytes Sprites Sprite load status within the level.
Loaded sprites' indices to this table are stored in the sprite table at $7E:161A. Shooters' indices are stored to $7E:17B3.
All sprites are set to #$00 when the player enters a new area, meaning they are marked to be loaded.
If a sprite's value is set to anything else, for example if it's killed, it will not reload until the player exits and re-enters the area.

Note that indices 0 to 63 (#$00 to #$3F) are cleared on level load, index 64 to 127 (#$40 to #$7F) are not. This can be fixed by changing $02ABF3 to #$7F.

Note: Pixi may move this table to $7FAF00 in order to expand the table to 256 bytes, if the !Disable255SpritesPerLevel configuration flag is turned off. If accessing this table in a custom sprite, it is recommended to use the !1938 define to handle this.
$7E19B8 32 bytes Misc. Screen exit table, low bytes. Combined with the table at $19D8, this connects doors and exit-enabled pipes to their correct entrances. This table specifically contains the lower 8 bits of the destination level/secondary exit.

This table is indexed by the screen number Mario is on. In regular horizontal levels, this is the high byte of his X position, and in vertical levels, the high byte of his Y position. With the expanded horizontal level mode setting added by LM v3.00+, the current screen number the player is on can be obtained by calling the routine at $03BCDC.
$7E19D8 32 bytes Misc. Screen exit table, high bytes. Combined with the table at $19B8, this connects doors and exit-enabled pipes to their correct entrances. This table specifically contains the upper 5 bits of the destination level/secondary exit, as well as some additional information about the exit, in the format HHHHwush:
    h: High bit of destination level
    HHHHh: High byte of destination secondary exit
    s: Secondary exit flag
    u: LM-modified flag (if unset, the entire byte is ignored and LM's original exit system is used instead)
    w: Water level flag (secondary exits) or midway flag* (primary exits)
* Only used if the destination level has "use seperate settings for midway entrance" set

This table is indexed by the screen number Mario is on. In regular horizontal levels, this is the high byte of his X position, and in vertical levels, the high byte of his Y position. With the expanded horizontal level mode setting added by LM v3.00+, the current screen number the player is on can be obtained by calling the routine at $03BCDC.

This table goes unused in the original game, although the h bit for each screen is still written. Instead, the original game just calculates high bit of the destination level/secondary exit based on whether the level is on the main map (0) or submap (1), and the s bit is controlled globally for the entire level by $1B93.
$7E19F8 384 bytes Misc. Three tables of 128 bytes each for remembering which items have been collected (item memory settings). If the corresponding bits are set (items are collected), those objects will not be reloaded.
The tables are split up like this: every screen number has 4 bytes designated to it. The first byte is for the left half of the top subscreen, the second byte for the right half, and the third and fourth are for the bottom subscreen. Each vertical column within these regions uses one bit.

Item memory setting 3 doesn't actually exist in the original game, but LM still allows you to select it. As of LM 1.8, it is apparently possible to use item memory setting 3 as well, but it only means "make everything respawn" and doesn't remember anything.
$7E1B78 2 bytes Overworld This is used on the overworld to determine if a hard coded path should be processed. This flag is set and read in 16-bit mode, it can have the values #$0000 or #$0001. #$0001 means that a hard coded path/event is processed.
Also used by Lunar Magic in levels for the "Fix Layer 3 scroll sync" option, but only when the option is on.
$7E1B7A 2 bytes Overworld This address serves as index to $04:9086 which is used to get what hard coded tile to use for the current tile the player is walking on. This address plus one is also the index to $04:90CA.
Also used by Lunar Magic in levels for the "Fix Layer 3 scroll sync" option, but only when the option is on.
$7E1B7C 1 byte Overworld Accumulating fraction bits for the Layer 1 X speed on the overworld, used when the camera returns to the player after having been in free scrolling mode. This address handles incrementing the Layer 1 X position when it overflows.
$7E1B7D 1 byte Overworld Accumulating fraction bits for the Layer 1 Y speed on the overworld, used when the camera returns to the player after having been in free scrolling mode. This address handles incrementing the Layer 1 Y position when it overflows.
$7E1B7E 1 byte Overworld This address is a mirror of $7E:13C1 (tile the player is on in the overworld) and it's used to check whether the player is walking on a complementive corner tile (those small corners used with the paths, a list of all tile numbers can be found at $04:A03C) while settling on a level tile.
Appears to be designed to allow for (very) curvy paths leading to level tiles, found in for example Star World and the path to the warp pipe from Chocolate Island 2.
Depending on the complementive corner tile in question, the player image and position are altered when settling on a level tile.
$7E1B7F 1 byte Empty Empty. Cleared on reset, titlescreen load, overworld load and level load.

This address could be regarded as the "high byte" of $7E:1B7E, however it is never used (AND #$00FF is applied) and only stored to on the overworld. Thus, it is safe to use this address as free RAM outside of the overworld.
$7E1B80 1 byte Overworld Flag used on the overworld to indicate the player is moving across a ladder or vine path tile (tiles 3F-41).
$7E1B81 1 byte Should be 00 Uses in 16-bit loads to $7E:1B80, and otherwise #$00 is always stored here. Using this outside of the overworld is fine, however. Cleared on reset, titlescreen load and overworld load.
$7E1B82 1 byte Overworld X position on-screen of the current castle/fortress destruction explosion. Also denotes X position on-screen of the appearing event sprite tiles.
$7E1B83 1 byte Overworld Y position on-screen of the current castle/fortress destruction explosion. Also denotes Y position on-screen of the appearing event sprite tiles.
$7E1B84 2 bytes Timer The 16-bit address is used to determine whether the large event tiles (6x6) are uploaded or the small event tiles (2x2). It's #$0900 or higher if it's the latter. It gets its values from the table at $04:DD8D.

Solely $7E:1B84 is a timer used for handling castle/fortress destruction on the overworld, as well as the timer used for a level tile being revealed (the flash sprite).
$7E1B86 1 byte Pointer Pointer to the various routines that handle overworld events being activated. The pointers are located at $04E577. Valid Values
$7E1B87 1 byte Overworld Used to indicate the current stage of the save and 2-player life exchange prompts on the overworld. Valid Values
$7E1B88 1 byte Flag Message box expanding (#$00) or shrinking (#$01) flag. Also used in various other instances such as the save prompt on the overworld.
$7E1B89 1 byte Misc. Message box expansion and shrinking timer/size. Note: Setting expanding timer above #$04 will cause the message to be blank. Also used in various other instances, such as the save prompt on the overworld, and the opening/closing window effects during the credits.
$7E1B8A 1 byte Flag Which direction to point the arrow on the give lives menu.
#$00 = Point to Luigi's direction, give him lives.
#$01 = Point to Mario's direction, give him lives.
$7E1B8B 1 byte Overworld A timer that increments every frame, used for the blinking arrow on the give lives (between players) screen. If $7E:1B8B & #$18 gives a non-zero value, the arrow is shown. If the result of that is zero instead, a blank is shown.
$7E1B8C 1 byte Flag Used as a flag to determine whether you are at the first or second iteration of the pointer to $04:DB18 ($7E:1DE8 is #$00 or #$06). #$02 is fully cleared, #$00 is fully blacked out. Needed to make the windowing HDMA fade out at first, then fade back in when the submap switching process is done.
$7E1B8D 2 bytes Overworld Used in the calculation of the X positions for the overworld fade in/out windowing HDMA transitions. Removing stores to this address will make it only active in the Y direction. Starts at #$0000 (completely black) and ends at #$7000 (cleared, except for the sides which are hidden under the overworld border).
$7E1B8F 2 bytes Overworld Used in the calculation of the Y positions for the overworld fade in/out windowing HDMA transitions. Removing stores to this address will make it only active in the X direction. Starts at #$0000 (completely black) and ends at #$5400 (cleared).
$7E1B91 1 byte Counter Blinking cursor frame counter (file select, save prompt, etc.)
$7E1B92 1 byte Misc. Position of the cursor on the title screen menus, as well as the overworld "continue with/without save" and "continue/end" menus.
$7E1B93 1 byte Misc. Use Secondary Exits flag. This is likely not used when Lunar Magic is done with the ROM.
$7E1B94 1 byte Flag Disable bonus game sprite from being loaded flag. If not zero, the bonus game sprite will terminate itself in the init routine.
$7E1B95 1 byte Flag This flag is set to #$02 as soon as the Yoshi wings animation (#$08 of $7E:0071) brings you above the screen ($7E:0080 = #$FFC0), which means you will be heading for level C8 or 1C8.
As a byproduct, Yoshi will have wings in that level, and you can't die from falling into the depths. Moreover, as you enter the level, Yoshi will always be blue. It's also the only way you can "die" with Yoshi without losing him on the overworld.
$7E1B96 1 byte Flag Side exit enabled flag. #$00 = Disabled; #$01 = enabled.
$7E1B97 2 bytes Empty This address is only stored to once in all of SMW, and that's in code that was originally never used (the fifth scrolling command, sprite #$EC). It was going to have some unknown use when you reached the last screen of the level. Because SMW never executes the code that writes to it (unless that command is used), this is a safe address to use.

Cleared on reset, titlescreen load, overworld load and cutscene load.
$7E1B99 1 byte Flag Used in goal point marching: flag to show peace image flag and handling the fade-out ellipse.
#$00 = Don't show peace image yet, don't handle fade-out ellipse.
#$01 = Show peace image and handle fade-out ellipse.
$7E1B9A 1 byte Graphics Background Scroll Activated flag. The unused orange platform (sprite 5E) sets it to #$01, and the flying turn blocks (sprite C1) set it to #$08.
If set, triggers the fast BG scroll sprite, as well as making the flying turn blocks move.
$7E1B9B 1 byte Flag Used to check if Yoshi should not reappear for the next room (castle intro cutscene and the likes). These cutscenes set the flag to #$01, which makes Yoshi not reappear for the next room, but it does keep Yoshi on the overworld. Automatically set to #$00 when the overworld is loaded again. One could use this RAM address to disable Yoshi for one room, but re-enable him in the next again.
$7E1B9C 1 byte Overworld Player is entering a warp pipe/star flag.
#$00 = No; #$01 = Yes.
$7E1B9D 1 byte Timer Time to wait until the rising/sinking tide starts rising/sinking again (after the "no movement" interval).
$7E1B9E 1 byte Flag Music has to be altered on the overworld during a 2-player game flag.
#$00 = Do not alter music.
#$01 = Do alter music.
It's set when the players are switching, but also when you go from submap to submap, the latter even when it's a 1-player game. But this flag is never read if it's a 1-player game.
$7E1B9F 1 byte Counter Number of broken tile pairs in the Reznor battle.
$7E1BA0 1 byte Overworld The overworld uses this address to shake the ground as the Valley of Bowser entrance rises from the depths, by setting this address to #$FF. It also changes the music and adds some sound effects. It's a timer, but it only decrements as long as $7E:13D9 is #$02.
$7E1BA1 1 byte Misc. One of two screen numbers used in the level loading routine. This one points to where the next tile will be placed and is often changed inside an object loading code. The other screen number is $7E:1928.
Although referenced at $03:DF58 (Bowser's code), its value isn't actually used there.
$7E1BA2 1 byte Sprites Bits 0-6 form the index to the tilemap for the Mode 7 bosses, which read from the table at $03:D9DE, 16 bytes per image. Bit 7 is used to control the X-flip of the tiles. What actually happens then, is that the odd graphic tile is used instead of the even graphic tile, since all Mode 7 graphics are decompressed into a regular and flipped tile. For example, tile #$01 in VRAM is the same as tile #$00 except it's flipped.
$7E1BA3 64 bytes Graphics A buffer that is used for uploading Mode 7 tile data to VRAM in non-platform Mode 7 bosses. The buffer is enough to fill in an entire 8x8 tile, as each 8x8 tile requires 64 bytes in Mode 7 8bpp.

$7E:1BB2 is also used as a buffer in the graphics upload routine. The use seems to be for converting 3bpp to 4bpp format.

$7E:1BBC is used as a flag in the graphics upload routine to alter 3bpp to 4bpp conversion depending on the graphics file that is being uploaded.
$7E1BE3 1 byte Misc. Layer 3 settings.
#$00 = No Layer 3; #$01 = Low and high tide; #$02 = Low tide only; #$03 = Tileset specific image.
$7E1BE4 2 bytes Blocks VRAM address to start uploading data from the table at $7E:1BE6. It's used for layer 1. Big endian.
$7E1BE6 256 bytes Blocks Which tiles should be used for each row of 16x16 tiles, 2 bytes per 8x8 tile, used while scrolling layer 1 (loading new tiles). In horizontal levels, $7E:1BE6-$7E:1C65 form the left column of 8x8 tiles while $7E:1C66-$7E:1CE5 form the right column of 8x8 tiles. On the overworld and in vertical levels, $7E:1BE6-$7E:1C65 form the upper row of 8x8 tiles, while $7E:1C66-$7E:1CE5 form the bottom row of 8x8 tiles.
$7E1CE6 2 bytes Blocks VRAM address to start uploading data from the table at $7E:1CE8. It's used for layer 2. Big endian.
$7E1CE8 256 bytes Blocks Which tiles should be used for each row of 16x16 tiles, 2 bytes per 8x8 tile, used while scrolling interactive layer 2 (loading new tiles). In horizontal levels, $7E:1CE8-$7E:1D77 form the left column of 8x8 tiles while $7E:1D78-$7E:1DE7 form the right column of 8x8 tiles. On the overworld and in vertical levels, $7E:1CE8-$7E:1D77 form the upper row of 8x8 tiles, while $7E:1D78-$7E:1DE7 form the bottom row of 8x8 tiles.
$7E1DE8 1 byte Overworld This is a pointer index used for various tasks during the submap switching scene ($7E:13D9 is #$0A). Valid Values
$7E1DE9 1 byte Overworld If non-zero, indicates an event should be activated on overworld load (otherwise, event handling is skipped). The 'Course Clear!' and Switch Palace message box routines set this just before loading the overworld, and it's set to zero again when the event finishes executing.

Additionally, the enemy credits use this as the current screen number. Counts up to #$0C, which has the last set of enemies (the Koopa Kids and Bowser).
$7E1DEA 1 byte Overworld Overworld event to run at level end. #$FF means that no event will be run.
$7E1DEB 2 bytes Overworld Event tile to load to the overworld. A starting value is set to this at level end, and it increments until it reaches the value of $7E:1DED.
$7E1DED 2 bytes Overworld Last event tile to load to the overworld during a given event, set at level end.
$7E1DEF 1 byte Empty Empty. Cleared on reset and titlescreen load.
$7E1DF0 2 bytes Overworld $7E:1DF0 - X position of the camera when using the overworld scroll function, low byte.
$7E:1DF1 - X position of the camera when using the overworld scroll function, high byte.
These values are only used to determine which way the camera should go to get back to the player.
$7E1DF2 2 bytes Overworld $7E:1DF2 - Y position of the camera when using the overworld scroll function, low byte.
$7E:1DF3 - Y position of the camera when using the overworld scroll function, high byte.
These values are only used to determine which way the camera should go to get back to the player.
$7E1DF4 1 byte Misc. Index to intro control sequence data table.
$7E1DF5 1 byte Timer Timer to used for multiple purposes:
- How long a particular input during the intro sequence will remain pressed.
- How long the Nintendo Presents screen will remain active.
- How long a Switch Palace message will remain active.
- How long the player has to wait before they can dismiss the intro message.
$7E1DF6 1 byte Overworld Star and Warp pipe handler. It's an index of the current star/warp pipe tile you're standing on, multiplied by two. With this index, the destination coordinates are determined.
$7E1DF7 1 byte Player Used by the Star Road warp star on the overworld. Determines the speed with which the player is launched in the air during warping. The higher the value, the faster they gets launched in the air. By default the maximum is #$04, though this cap can be altered by editing $04:9E70/0x22070.
$7E1DF8 1 byte Timer Used by the Star Road warp star tile on the overworld. It controls how long the player has to stay on the ground during the warp, before they actually gets launched in the air. The player gets airborne as soon as the timer hits #$31 (as it increments).
$7E1DF9 4 bytes I/O SPC700 I/O Ports. Write values to play music/SFX.
Note that the valid values refer to a clean rom, if using an Addmusic tool songs and sound effects are (usually) remapped (for example, with AddmusicK you can check them in "Addmusic_sound effects.txt" and "Addmusic_list.txt").
$1DF9 Values $1DFA Values $1DFB Values $1DFC Values
$7E1DFD 2 bytes Empty Empty. Cleared on reset, titlescreen, overworld and level load (the latter two due to new music banks being uploaded). Note that $7E:1DFD is cleared twice, due to a 16-bit store to $7E:1DFC - at $04:969F/0x2189F (LDA #$0023 : STA $1DFC) and $05:C75D/0x2C95D (LDA #$0009 : STA $1DFC).
$7E1DFF 1 byte I/O A copy of $7E:1DFB, the music register. It contains the last value written to SNES register $2142. Probably used to keep the music playing between areas.
$7E1E00 1 byte Empty Empty. Cleared on reset, titlescreen, overworld and level load (the latter two due to new music banks being uploaded).
$7E1E01 1 byte Empty Empty, unused. Cleared on reset and titlescreen load. However, if the debug code at $00:CC86/0x4E86 is enabled, this address allows you to be in free roaming mode: the player can move in any direction, without being affected by objects or sprites. #$00 = none; #$01 = dash immediately; #$02 = free roaming.
$7E1E02 20 bytes Sprites Cluster sprite Y position, low byte.
$7E1E16 20 bytes Sprites Cluster sprite X position, low byte.
$7E1E2A 20 bytes Sprites Cluster sprite Y position, high byte.
$7E1E3E 20 bytes Sprites Cluster sprite X position, high byte.
$7E1E52 20 bytes Sprites Cluster sprite table. Used as:
- Y position of reappearing Boos, frame 1. Not relative to screen border.
- Y speed for Boos from ghost ceiling and death bats.
$7E1E66 20 bytes Sprites Cluster sprite table. Used as:
- X position of reappearing Boos, frame 1. Not relative to screen border.
- X speed for Boos from ghost ceiling and death bats.
$7E1E7A 20 bytes Sprites Cluster sprite table. Used as:
- Y position of reappearing Boos, frame 2. Not relative to screen border.
- Accumulating fraction bits for fixed point Y speed of death bats.
$7E1E8E 20 bytes Sprites Cluster sprite table. Used as:
- X position of reappearing Boos, frame 2. Not relative to screen border.
$7E1EA2 96 bytes Overworld Overworld level setting flags, location within the table corresponds to $7E13BF. Format: bmesudlr.
b = level is beaten.
m = midway point has been passed.
e = unused in SMW, Lunar Magic turns it into the "no entry if level already passed" flag.
s = unused in SMW, Lunar Magic turns it into the "open Save Prompt when level is beaten" flag.
u = enable walking upwards.
d = enable walking downwards.
l = enable walking leftwards.
r = enable walking rightwards.

Setting the high bit of $7E1EEB will enable the special stage features (autumn overworld palettes, etc.) in the ORIGINAL game. The bit is set when you beat level 125 (FUNKY).
$7E1F02 15 bytes Overworld Overworld event flags. The table works bitwise - if a bit corresponding to an event is set, that event has been run. If it's clear, it hasn't been run yet.

There's a little formula for finding out what event number corresponds to which bit. Take the event number, divide by eight and use that as index for this table. Take the remainder, and that number (0-7) is the position of the bit inside the indexed byte (left to right).
Example: Finding event #$13. Division by eight turns #$02 as index (so $7E:1F04) and #$03 as the remainder. It's bit 4 of $7E:1F04 (xxxx xxxx). Not bit 3, because of the "reversed" AND tables that are used with this table - bits are not counted from right to left, but from left to right instead.
$7E1F11 1 byte Overworld Current submap for Mario. #$00 = Main map; #$01 = Yoshi's Island; #$02 = Vanilla Dome; #$03 = Forest of Illusion; #$04 = Valley of Bowser; #$05 = Special World; #$06 = Star World.
$7E1F12 1 byte Overworld Current submap for Luigi. #$00 = Main map; #$01 = Yoshi's Island; #$02 = Vanilla Dome; #$03 = Forest of Illusion; #$04 = Valley of Bowser; #$05 = Special World; #$06 = Star World.
$7E1F13 4 bytes Player Player animation on the overworld.

$7E:1F13/4 form Mario's image and $7E:1F15/6 form Luigi's image. Note that the high bytes of the two (bytes 2 and 4, $7E:1F14 and $7E:1F16) are actually unused.
Valid Values
$7E1F17 2 bytes Player Overworld X position of Mario.
$7E1F19 2 bytes Player Overworld Y position of Mario.
$7E1F1B 2 bytes Player Overworld X position of Luigi.
$7E1F1D 2 bytes Player Overworld Y position of Luigi.
$7E1F1F 2 bytes Player Pointer to Mario's overworld X position. Value is Mario's regular overworld X position divided by #$10 (#16).
$7E1F21 2 bytes Player Pointer to Mario's overworld Y position. Value is Mario's regular overworld Y position divided by #$10 (#16).
$7E1F23 2 bytes Player Pointer to Luigi's overworld X position. Value is Luigi's regular overworld X position divided by #$10 (#16).
$7E1F25 2 bytes Player Pointer to Luigi's overworld Y position. Value is Luigi's regular overworld Y position divided by #$10 (#16).
$7E1F27 4 bytes Flag Switch palace activation flags. $00 = off (outline passable switch palace blocks), $01 = on (solid switch palace blocks):
$7E1F27: Green
$7E1F28: Yellow
$7E1F29: Blue
$7E1F2A: Red

Note: effects to the blocks will only apply during level loading when these flags are changed.
$7E1F2B 3 bytes Empty Empty. Unlike most empty addresses, this one is saved to and loaded from SRAM, so it's effectively cleared only at reset and new game.
$7E1F2E 1 byte Counter Number of events triggered. Can be used as a levels beaten counter.
$7E1F2F 12 bytes Flag "Collected five or more Yoshi Coins" flags, for each level.
Each seperate byte represents the values for 8 levels, with each bit acting as a flag for a given level.
If a bit is set, no Yoshi Coins will reappear in that level.

The format is as following: $7E:13BF (the level number) divided by 8 (3x LSR) provides the index per byte into this table; that's because 8 levels are represented by one byte, 1 bit per level.
For each byte, the level modulo 8 (AND #$07) is the index to the bit, and said index gets the corresponding bit from an AND table at $05:B35B.
That bit will be the flag for the level.
0 = clear bit, less than five Yoshi Coins collected; 1 = set bit, five or more Yoshi Coins collected.

An example: checking if five or more Yoshi Coins were collected in level 105. First, convert to $7E:13BF format. #$29 indicates you're in level 105.
Divide that by 8 to get the byte index - #$29 divided by 8 is five (rounded), so the sixth byte is the correct index.
After that, apply modulo 8 on #$29 - AND #$07 - and you'll end up with #$01.
This value is then used to index the aforementioned AND table, which gets the corresponding bit - in this case, #$40, bit 6.
So if bit 6 of the sixth byte ($7E:1F34) in the table is set, five or more Yoshi Coins have been collected in level 105.
$7E1F3B 1 byte Empty Empty. Cleared on reset, titlescreen load and at the game over screen.
$7E1F3C 12 bytes Flag "Collected invisible 1-Up flags", for each level.
Each seperate byte represents the values for 8 levels, with each bit acting as a flag for a given level.
If a bit is set, no invisible 1-Up will reappear in that level.

The format is as following: $7E:13BF (the level number) divided by 8 (3x LSR) provides the index per byte into this table; that's because 8 levels are represented by one byte, 1 bit per level.
For each byte, the level modulo 8 (AND #$07) is the index to the bit, and said index gets the corresponding bit from an AND table at $05:B35B.
That bit will be the flag for the level.
0 = clear bit, invisible 1-Up not collected; 1 = set bit, invisible 1-Up collected.

An example: checking if an invisible 1-Up was collected in level 105. First, convert to $7E:13BF format. #$29 indicates you're in level 105.
Divide that by 8 to get the byte index - #$29 divided by 8 is five (rounded), so the sixth byte is the correct index.
After that, apply modulo 8 on #$29 - AND #$07 - and you'll end up with #$01.
This value is then used to index the aforementioned AND table, which gets the corresponding bit - in this case, #$40, bit 6.
So if bit 6 of the sixth byte ($7E:1F41) in the table is set, an invisible 1-Up has been collected in level 105.
$7E1F48 1 byte Empty Empty. Cleared on reset and titlescreen load.
$7E1F49 141 bytes Overworld Buffer for $7E:1EA2-$7E:1F2E. SRAM transfer of those bytes goes via this buffer.
$7E1FD6 12 bytes Sprites Unused sprite table, cleared at individual sprite load. (1 slot each.)
$7E1FE2 12 bytes Sprites Sprite table that decrements once per frame, and is used for multiple purposes. All standard sprites have it briefly set after spawning.

Primarily, it disables water splashes from showing when the sprite enter or exits water, and disables interaction for the sprite with capespins, quake sprites, cape smashes, and net punches. Some sprites use it for miscellaneous purposes, as well. More information can be found here.
$7E1FEE 12 bytes Flag "Collected 3-Up moon" flags, for each level.
Each seperate byte represents the values for 8 levels, with each bit acting as a flag for a given level.
If a bit is set, no 3-Up will reappear in that level.

The format is as following: $7E:13BF (the level number) divided by 8 (3x LSR) provides the index per byte into this table; that's because 8 levels are represented by one byte, 1 bit per level.
For each byte, the level modulo 8 (AND #$07) is the index to the bit, and said index gets the corresponding bit from an AND table.
That bit will be the flag for the level.
0 = clear bit, no 3-Up moon collected; 1 = set bit, 3-Up moon collected.

An example: checking if a 3-Up moon was collected in level 105. First, convert to $7E:13BF format. #$29 indicates you're in level 105.
Divide that by 8 to get the byte index - #$29 divided by 8 is five (rounded), so the sixth byte is the correct index.
After that, apply modulo 8 on #$29 - AND #$07 - and you'll end up with #$01.
This value is then used to index the aforementioned AND table, which gets the corresponding bit - in this case, #$40, bit 6.
So if bit 6 of the sixth byte ($7E:1FF3) in the table is set, a 3-Up moon has been collected in level 105.
$7E1FFA 1 byte Empty Empty. Cleared on reset and titlescreen load.
$7E1FFB 1 byte Palettes Lightning flash color index. Only #$00-#$07 are actually used. #$07 is the brightest shade of white, the lower the value, the closer to black it gets. This address gets its value from the table at $04:F700.
$7E1FFC 1 byte Timer How long to wait until the next lightning flash is generated. Gets its value from a table at $04:F6F8, which in turn gets its index from a "random" value in the routine of $04:F708 & #$07. This address decrements after the previous lightning flash has ended.
$7E1FFD 1 byte Timer How long a lightning flash should last, per color change. Is set to #$08 frames for the first color flash (the most bright one), then it's set to #$04 frames for the following color flashes which are becoming less and less bright. Decrements every frame.
$7E1FFE 1 byte Flag Whether to update the background in the first part of the credits, or not.
#$00 = Don't update the background.
#$01 = Do update the background.
$7E1FFF 1 byte Empty Empty. Cleared on reset and titlescreen load.
$7E2000 23808 bytes Graphics GFX32 decompressed. Written while the Nintendo Presents logo is shown and never modified after that, but often read.
$7E7D00 12288 bytes Graphics GFX33 decompressed. Written while the Nintendo Presents logo is shown and never modified after that, but often read.
$7EAD00 3072 bytes Graphics GFX file decompression buffer. Decompressed as 3bpp (3kb) for unexpanded GFX and as 4bpp for expanded.
Also used for Lunar Magic's extra animated tile space.
$7E:B900 is also used as additional buffer kilobyte.
$7EB900 1024 bytes Blocks Layer 2 tilemap, low byte. Format: First two 16x27 rectangles, then 160 25s that are never read.

Also used on the overworld during the switch block events for various purposes:
$7EB900-$7EB927 = Switch block X position, high byte
$7EB928-$7EB94F = Switch block Y position, high byte
$7EB950-$7EB977 = Switch block Z position, high byte
$7EB978-$7EB99F = Switch block X position, low byte
$7EB9A0-$7EB9C7 = Switch block Y position, low byte
$7EB9C8-$7EB9EF = Switch block Z position, low byte
$7EB9F0-$7EBA17 = Switch block X speed
$7EBA18-$7EBA3F = Switch block Y speed
$7EBA40-$7EBA67 = Switch block Z speed
$7EBA68-$7EBA8F = Accumulating fraction bits for fixed point switch block X speed
$7EBA90-$7EBAB7 = Accumulating fraction bits for fixed point switch block Y speed
$7EBAB8-$7EBADF = Accumulating fraction bits for fixed point switch block Z speed
$7EBD00 1024 bytes Blocks Layer 2 tilemap, high byte; same format as $7E:B900. Writing to this area with the gfx+2 patch installed generates BG garbage and should never be done.
$7EC100 1408 bytes Empty Empty, untouched RAM on an unhacked ROM. Lunar Magic uses it to store ExAnimation graphics data if the ExAnimation file is larger than 0x1400 bytes. Maximum size is 0x1B00, or enough for 0xD8 4bpp 8x8 tiles, in which case all of $7E:AD00-$7E:C7FF is used.
$7EC680 96 bytes Misc. Tilemap of Mode 7 bosses (Ludwig, Roy, Morton and Bowser).
$7EC6E0 288 bytes Empty Empty, untouched RAM on an unhacked ROM. In a hacked ROM, it may be occupied by ExAnimation data (see $7E:C100).
$7EC800 14336 bytes Blocks Map16 Low Byte Table.
For horizontal levels, $1B0 tiles per screen, where each screen can be indexed using the format ------y yyyyxxxx. $7E:FE00-$7E:FFFF are unused.
For vertical levels, $200 bytes per screen, with the format --sssssx yyyyxxxx. All bytes are used.
If layer 2 or 3 is interactive in the level, it uses screens 10-1F (0E-1B in vertical levels).

On Lunar Magic version 3+, refer to this document for the blocks format for other level dimensions.


On the overworld:
$7E:C800-$7E:CFFF (2048 ($800) bytes) is used as the Layer 1 tilemap for the overworld.
To index this table, use $7E:1F11, $7E:1F1F, and $7E:1F21 to find Mario, or use $7E:1F12, $7E:1F23, and $7E:1F25 to find Luigi.
X position / 16: %---- ---- ---X xxxx
Y position / 16: %---- ---- ---Y yyyy
Index to this table: %---- -SYX yyyy xxxx
* If Mario is on a submap, the S bit is set.

$7ED000-$7ED7FF (2048 bytes) is used as a table that contains the translevel numbers for every Layer 1 tile, in the format of $7E13BF.
$7ED800-$7EDFFF (2048 bytes) is used as a table that contains the path direction settings for every Layer 1 tile, in the format of $04D678.
$7EE400-$7EEBFF (2048 bytes) is used for uploading the Layer 1 tile map to VRAM in 2KB chunks. One chunk is uploaded per frame for four frames during transitions between the main overworld and submaps. Data is refreshed after each DMA.
$7F0000 16384 bytes Overworld Layer 2 overworld event tilemap. The space after $7F0D00 is unused in the original game, but is used by LM to hold the expanded tilemap area. Note that this only holds the YXPCCCTT properties, with the actual tile numbers being retrieved from $0C8000.

If LM's title screen moves recording hijack is installed, this region is also used to store the title screen movements. Three bytes are written any time a new key is pressed or released, or if the same keys are held for 256 frames. Since the event tilemap isn't restored, however, this will causes glitches with event tiles if the hijack isn't uninstalled.

$7F0B44-$7F1343 is also used as a buffer for dynamic sprite graphics, to be uploaded during V-blank.
$7F4000 16384 bytes Overworld The Layer 2 tilemap of the whole overworld (including submaps, starting at $7F:6000). It does NOT affect the event tiles. The tiles are also 8x8. The tilemap starts from the top left corner of the main overworld. Format is as following:
[Tile number], [Tile properties]
This table is also used for a RAM buffer for the credit cutscene backgrounds.
$7F8000 387 bytes Sprites Unrolled loop which, executed once per each frame, writes to OAM to put all sprites outside the screen (this clears the OAM slots by setting their Y positions to #$F0). Note: Not executed during pause.
$7F8183 504 bytes Empty Empty, untouched RAM.
~420 bytes used in LM 1.70+ for VRAM modification (see details).
RAM Map
$7F837B 2 bytes Misc. Current length of the $7F837D stripe image, excluding the FF terminator. Used to allow two subroutines to write to $7F837D in the same frame.
$7F837D 5118 bytes Misc. VRAM upload table, as a stripe image. Used for things that change in the middle of the screen, such as ? blocks. Uploaded and reset every frame; most frames, it's empty.

Not all of it is used during normal gameplay, so $7F:8600+ shouldn't be dangerous to use.

See here for more info.
$7F977B 768 bytes Misc. Mario/Luigi Start, Game Over, Time Up etc. messages Graphics, decompressed.
$7F9A7B 512 bytes Sprites Position of Wiggler's segments.
$7F9C7B 11141 bytes Empty Empty RAM which is entirely untouched.
This area is used by many SMW hacking tools and patches, so hacked ROMs are likely to use some of the addresses found here.
$7FAB10 12 bytes Sprites Custom sprite table used by Pixi.
It holds the extra bits of a sprite.
Usage
$7FAB1C 12 bytes Sprites Custom sprite table used by Pixi.
Using during sprite loading to signal that the sprite being loaded is custom. Used for custom generators, shooters and normal sprites.
$7FAB28 12 bytes Sprites Custom sprite table used by Pixi.
It holds the first extra property byte of the sprite.
$7FAB34 12 bytes Sprites Custom sprite table used by Pixi.
It holds the second extra property byte of the sprite.
The highest two bits are used by Pixi to determine if the sprite should execute the original code for sprite states other than 8 (main): if the highest bit is set, the original code will be skipped, while if the second highest bit is set, the original code will be executed and then the custom code.
$7FAB40 12 bytes Sprites Custom sprite table used by Pixi.
It holds the first extra (extension) byte of the sprite.
$7FAB4C 12 bytes Sprites Custom sprite table used by Pixi.
It holds the second extra (extension) byte of the sprite.
$7FAB58 12 bytes Sprites Custom sprite table used by Pixi.
It holds the third extra (extension) byte of the sprite.
$7FAB64 12 bytes Sprites Custom sprite table used by Pixi.
It holds the fourth extra (extension) byte of the sprite.
$7FAB9E 12 bytes Sprites Custom sprite table used by Pixi.
It holds the custom sprite number, as defined in the list.txt file, and is a copy of $9E for vanilla sprites. To get the act as of a custom sprite, use $9E instead.
$7FAC00 8 bytes Sprites Custom shooter sprite table used by Pixi.
It holds the first extra byte of the shooter.
$7FAC08 8 bytes Sprites Custom shooter sprite table used by Pixi.
It holds the second extra byte of the shooter.
$7FAC10 8 bytes Sprites Custom shooter sprite table used by Pixi.
It holds the third extra byte of the shooter.
$7FAF00 256 bytes Sprites Custom sprite table used by Pixi.
This serves the same purpose as $1938, but it supports up to 255 sprites per level. Not used if !Disable255SpritesPerLevel is set. In custom sprites it's recommended to use the !1938 define, since it'll be mapped to either $1938 or $7FAF00 depending on the Pixi configuration (pay attention that in one case it's absolute, in the other it's long!).
$7FB000 1034 bytes Misc. RAM used by AddmusicK for various purposes. RAM Map
$7FBC00 1024 bytes Misc. Used by Lunar Magic's VRAM patch.
$7FC000 32 bytes Misc. Used by Lunar Magic for various purposes. See details for an incomplete list. RAM Map
$7FC020 14 bytes Misc. Used by Lunar Magic v2.20+ for LZ2/LZ3/ExAnimation code execution, on SA-1 roms only.
$7FC060 16 bytes Flag Used by Lunar Magic v1.80+ as bitwise state flags for Conditional Direct Map16. To find the bit for a particular flag, use flag >> 3 to get the byte, and then 1 << (flag & 7) to get a bitmask for the bit (ordered low to high).

Note that this address is not initialized automatically.
$7FC070 16 bytes Misc. Used by Lunar Magic v1.70+ as frame numbers for each Manual ExAnimation. One byte per slot.

Note that these addresses are uninitialized unless specified by the "Trigger Init" settings in Lunar Magic.
$7FC080 32 bytes Counter Used by Lunar Magic as frame counters for each Level ExAnimation. One byte per slot.
$7FC0A0 32 bytes Counter Used by Lunar Magic as frame counters for each Global ExAnimation. One byte per slot.
$7FC0C0 56 bytes Graphics Lunar Magic's ExAnimation output table, used to temporarily store data for any ExAnimations updating on the current frame. There are 8 tables, each 7 bytes long, with their data written by the routine at read3($00A2A5+1). The data within these tables is then written as follows:

Bytes 0-1: 16-bit header. The highest bit determines the animation type, with 0 being graphics and 1 being palettes. For graphics, the remaining 15 bits are the transfer size. For palettes, the low byte is doubled and used as the transfer size (with the low byte hence effectively being the number of colors).
Bytes 2-3: 16-bit destination. For GFX animations, the high bit determines whether the animation uses a line (0) or rectangular (1) type, with the remaining 15 bits used as the base VRAM address. For color animations, the low byte holds the base CGRAM address while the high byte is unused.
Bytes 4-6: 24-bit source. For GFX animations, this generally points to RAM, but may be ROM for ExGFX60-63. For "palette + working" animations, this points to the corresponding color to update in the table at $0903. For palette animations with only one color (i.e. header = #$8001), bytes 4/5 hold the raw 16-bit SNES RGB color while byte 6 is unused. For any other palette animation, bytes 4-6 hold the 24-bit address to the color data.
$7FC0F8 4 bytes Flag Used by Lunar Magic v1.70+ as bitwise flags for One Shot ExAnimation triggers. To find the bit for a particular trigger, use trigger >> 3 to get the byte, and then 1 << (trigger & 7) to get a bitmask for the bit.
$7FC0FC 2 bytes Flag Used by Lunar Magic v1.70+ as bitwise flags for Custom ExAnimation triggers. To find the bit for a particular flag, use trigger >> 3 to get the byte, and then 1 << (trigger & 7) to get a bitmask for the bit.

Note that these addresses are uninitialized unless specified by the "Trigger Init" settings in Lunar Magic.
$7FC300 1024 bytes Misc. Used by Lunar Magic v1.70 as a Map16 high byte buffer.
$7FC800 14336 bytes Blocks Map16 high byte table. Same format as $7EC800.
$7FFFF8-$7FFFFD are also used by Lunar Magic's title screen recording ASM.
  • Pages:
  • 1