|SMW Memory Map|
|$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 - handles all sprite tiles that are on screen. Valid slot number range: #$00-#$7F (128 slots, for $0200 indexing, it is #$0000-#$01FC, use any number divisible by 4 only).
The tables are:
-$7E0200-$7E03FF (512 bytes): Each “tile slot” have four bytes, in the order of: X position, Y position, tile number, and then YXPPCCCT. Tiles which are currently unused are usually marked as such by giving them a Y position of #$F0 (which is offscreen).
-$7E0400-$7E041F (32 bytes): Handles the 9th bit X position (this is a sign bit to handle sprite tiles that goes past the left edge of the screen) and the “size bit” (0 = 8x8, 1 = 16x16). Every 4 tile slots are fitted into each byte, see detail on how each tile slot is formatted. Note that it can't be used, as it will be overwritten each frame using the data at $0420-$049F; you should instead write the data there.
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||A table that determines the size of a sprite tile - 8x8 (#$00) or 16x16 (#$02). Each byte corresponds to four OAM bytes. Stores to $7E:0400-$7E:041F (where each two bits correspond to four OAM bytes.)
The lowest bit (#$01) is also used for the high bit of the X position.
|$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.
|$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).