SMW Memory Map
Displaying 25 out of 839 addresses.
View: moderated | waiting (105)
RAM Address | Length | Type | Description | Details |
---|---|---|---|---|
$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: 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 formatting |
$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. | |