SMW Memory Map
|$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 - handles all sprite tiles. There are 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.
Note that tiles are drawn to the screen from top to bottom of the table; that is, a sprite in slot 0 will always appear visually on top of a sprite in slot 1.
The actual OAM table consists of two sub-tables:
- $7E0200-$7E03FF (512 bytes): Each slot consists of 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).
- $7E0400-$7E041F (32 bytes): Each slot gets 2 bits, used to handle a 9th bit of the X position (for handling sprite tiles that go past the left edge of the screen) and 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 (routine at $008494 takes $0420 data, reformats or compacts it, and stores it to $0400).
Various tiles are documented here. Note that:
$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.
|$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:
$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.|