SMW Memory Map
Displaying 50 out of 3144 addresses.
View: moderated | waiting (16)
ROM Address | Length | Type | Description | Details |
---|---|---|---|---|
$008000 | 39 bytes | ASM | This is the starting address of SMW. This takes care of basic initialization such as disabling IRQ, HDMA, DMA, clearing the SPC ports, enabling F-blank, disabling emulation mode, disabling decimal mode, initializing the direct page, and setting up the stack. | |
$008027 | 43 bytes | ASM | This is code is responsible for uploading the OAM clear routine to $7F8000. The uploaded routine is essentially an unrolled loop which stores #$F0 to all of the OAM mirror($0200) Y positions. | |
$008052 | 25 bytes | ASM | This is the main part of the SMW initialization routine. SPC engine upload, sample upload, OAM setup, windowing setup, and RAM clearing all happens here. | |
$00806B | 14 bytes | ASM | This is the main game loop of SMW. It is used to wait for V-blank to complete before executing the code of the next frame. One of the frame counters ($13) is also incremented here. | |
$00810E | 15 bytes | Subroutine (JSR) | OW Music uploader. | |
$008134 | 37 bytes | Subroutine (JSR) | Uploads level music bank. | |
$008159 | 17 bytes | Subroutine (JSR) | Credit music uploader. | |
$00816A | 522 bytes | Misc. | SMW's NMI routine. For more information, see here. | |
$008179 | 49 bytes | ASM | Handles transfers to and from the SPC700 (I/O). Changing all values to [EA] (NOP) or jumping over the code effectively mutes all sound. | |
$008293 | 1 byte | Misc. | How many scanlines the status bar uses during a regular level. | |
$00835D | 1 byte | Layer 3 | How many scanlines the status bar uses during the battles with Bowser, Ludwig, and Reznor. | |
$008370 | 1 byte | Layer 3 | How many scanlines the status bar and ceiling use during the battles with Morton and Roy. | |
$008374 | 162 bytes | Misc. | SMW's IRQ routine. | |
$008449 | 44 bytes | Misc. | Code that transfer Sprite OAM mirror (sprite OAM table at $7E0200-$7E041F, a total of 544 bytes) to register $2104 to draw sprites. | |
$008494 | 52 bytes | Sprite tilemap related | Copies OAM's extra bits (size and 9th bit X position: %000000SX) data stored in $7E0420, and reformats, or “compacts” each 4 bytes of that into each byte to $7E0400 (%SXSXSXSX). | $0420 and $0400 format |
$0084C8 | 8 bytes | Subroutine (JSL) | JSL wrapper for the stripe image uploader (pointer lies in $12), which can be found at $0085D2. Because it upload tiles, it must run in either f- or v-blank (e.g. in NMI). | |
$0084D0 | 258 bytes | Stripe Image | Stripe image pointer table. Each 24-bit pointer here corresponds to a value of $12, but only multiples of 3 are used (the first pointer is for value $00, the second is for value $03, the third for $06, etc.). | |
$0085D2 | 40 bytes | Subroutine (JSR) | Subroutine which uploads the stripe image pointed by $12 to VRAM. The pointer is loaded from the table at $0084D0, and then the routine at $00871E is called. Afterwards, if $12 is #$00, the stripe image length at $7F837B is set to 0 and the terminator $FF is written to the beginning of $7F837D. In any case, $12 is reset to 0 before returning. To call this routine from outside bank 0 you can JSL to the wrapper at $0084C8. This should only be done during a blank period (usually NMI). |
|
$0085FA | 86 bytes | Subroutine (JSR) | Fills the entire layer 3 tilemap with tile 0x0FC (transparent tile) i.e. the code "empties" it. Also wipes the OAM before returning. | |
$008650 | 119 bytes | Subroutine (JSR) | This is the routine that polls the controller and updates $15, $16, $17, $18. $0086A0 (x8A0) - Change to [9C A0 0D AD A0 0D A2 00] to cause both player 1 & 2 to be controlled by controller 1. |
|
$0086C7 | 24 bytes | Subroutine (JSR) | Subroutine that initializes the OAM table in Roy, Morton and Ludwig's rooms. It first initializes the first 100 tiles to be 16x16 (by setting $0420,x to #$02), then jumps in the middle of the standard OAM clear routine (JSL $7F812E). | |
$0086DF | 27 bytes | Subroutine (JSL) | Pointer subroutine: Jump to a 2-byte pointer, the position of the pointer used is "Position after the JSL + 1 + (A*2)". The subroutine should always be accessed by a JSL. | |
$0086FA | 36 bytes | Subroutine (JSL) | Pointer subroutine: Jump to a 3-byte pointer, the position of the pointer used is "Position after the JSL + 1 + (A*3)". The subroutine should always be accessed by a JSL. | |
$00871E | 143 bytes | Stripe Image | Stripe Image Uploader. Uses $00-$02 as a 24-bit pointer to tile data. See this thread how the stripe image format works. Must be run during a blank, usually NMI. To call from a custom routine, do this: - Store stripe image pointer (24-bit) to $00-$02 - Push 24-bit return address (bank -> mid -> lo) - PHB : LDA #$00 : PHA : PLB - PEA $84CD - JSL $00871E |
|
$0087AD | 617 bytes | Subroutine (JSL) | This routine is the DMA routine in charge of updating layers one and two as needed. This is controlled by the addresses $1BE4 and $1CE6 when they are a non-zero value. | |
$008A4E | 43 bytes | Subroutine (JSR) | Clear RAM subroutine. This is part of the reset routine. Specifically, it clears ram $00-$FF (direct page), $0200-$1FFF, $0681 and the stripe image table (by setting $7F837B to #$0000 and the start of $7F837D to #$FF). |
|
$008A79 | 59 bytes | ASM | The routine that sets up certain VRAM-related registers in normal levels. - $008A80: Default value for $2107 [23]. - $008A85: Default value for $2108 [33]. - $008A8A: Default value for $2109 [53]. - $008A8F: Default value for $210B [00]. - $008A94: Default value for $210C [04]. - $008AAB: Default value for $2130 [02], although it's actually stored to the mirror here (i.e. $44). $210A is never set, since it is only ever used in Mode 0. |
|
$008ACD | 138 bytes | Subroutine (JSR) | Routine that updates the mode 7 matrix parameters mirrors at $2E-$34 using the rotation and scale parameters at $36-$38. SMW calls it every frame in mode 7 bosses (when $0D9B is >= #$80), and the "Easy Mode 7 patch" calls it every frame in mode 7 levels, but you may need to call it manually if you're using mode 7 in special situations (for example, on the Overworld). On SA-1 roms, this must be called when running on the SNES CPU. |
Call routine code |
$008C59 | 40 bytes | Layer 3 | Tile array for numbers in bonus star counter. | |
$008C81 | 126 bytes | Layer 3 | Default status bar tiles info table. Format for each 8x8 tile: %TTTTTTTT %YXPCCCTT *$008C81-$008C88: top line of status bar (4 top tiles of the item box) *$008C89-$008CC0: Second line of status bar *$008CC1-$008CF6: Third line of status bar *$008CF7-$008CFE: bottom line of status bar (4 bottom tiles of item box) |
Table of addresses |
$008D8B | 1 byte | Timer | Timer speed (USE WITH $008E2E) | |
$008D90 | 28 bytes | Misc. | These four tables indicate the DMA settings and the source address to use for the status bar tiles (the ones that are uploaded at the very beginning of the level). The tables get stored in the order of $43x0-$43x6. | |
$008DAC | 59 bytes | Layer 3 | The routine that draws the status bar onto the screen. It uses DMA to write the Layer 3 tiles to VRAM. | |
$008DF5 | 5 bytes | Layer 3 | The tiles that make up Luigi's name in the status bar. | |
$008DFA | 4 bytes | Sprite tilemap related | Tilemap of reserve item. First byte is mushroom, second is flower, third is star, fourth is feather. | |
$008DFE | 4 bytes | Sprite tilemap related | YXPPCCCT of stars in the item box. It cycles between the four entries every second frame. | |
$008E02 | 4 bytes | Sprite tilemap related | YXPPCCCT data for reserve item. First byte is mushroom, second is flower, third is bypassed ($008DFF), fourth is feather. | |
$008E06 | 20 bytes | Layer 3 | Bonus star counter tilemap - 2 bytes for each number. Every first byte is for the upper tile, every second byte for the bottom tile. | |
$008E1A | 480 bytes | Layer 3 | The routine that updates the values of all the addresses used for the status bar ($0EF9-$0F2F). $008E28 - Change this address to AD to disable the timer. $008E2E - Timer speed (USE WITH $008D8B) $008E45 - Tile that each timer digit resets to after reaching 0. Can be any value from $00-$80. (e.g. Change to $0F: 100 -> 0FF -> 0FE ... 0F0 -> 0EF ... etc.) $008E5C - Time is Running Out SFX. Change from FF to 00 to stop the music from speeding up when time reaches 99. $008E6B - [22 06 F6 00] Change to [EA EA EA EA] to not kill Mario when the timer reaches zero. The timer will count down normally and stop at zero, but Mario will not die $008EDB - Change this and/or $008F09 from 20 12 90 to EA EA EA to disable writing the score to the status bar when playing as Mario and/or Luigi, respectively. Useful if you want to place another counter in place of the score using Smallhacker's Status Bar Editor. Note: This alone will NOT stop writing blank tiles if the first N tiles/bytes at $0F29-$0F2E contains the value #$00 (the "0" graphic). To prevent that, consider using this patch. $008EE3 - Change to BRA [80] to write zeroes instead of blank tiles to Mario's score counter. Use with $008F11. $008F11 - Change to BRA [80] to write zeroes instead of blank tiles to Luigi's score counter. Use with $008EE3. $008F2C - How many coins you need to get an 1up (USE WITH $008F37) $008F2F - [EE E4 18] Change to [EA EA EA] to not gain a life after collecting enough for one. $008F37 - Number of coins to subtract from the counter when you gain enough for a 1up (Default: $64 (100). Change to [01] to create a coin wallet effect - use with $008F2F. $008F41 - (Use with $008F45) Maximum life limit, minus one. Warning: Changing this to anything higher than 0x7E (127 lives) will remove the life limit entirely! Also, if you have more than 99 lives, the life counter will appear slightly glitched. $008F45 - (Use with $008F41) Maximum life limit, minus one. Note that if you have more than 99 lives, the life counter will appear slightly glitched. $008F62 - Number of bonus stars required to enter bonus game $008F67 - [8D 25 14] Change to EA EA EA to disable entering bonus game when player has 100 bonus stars. $008F6F - Amount of bonus stars that will be subtracted when 100 bonus stars are collected. Change to [01] to make 99 the maximum amount of bonus stars you can get - to create a bonus star wallet effect, use with $008F67. $008F7E - Writes coins to status bar. Changing to [EA EA EA EA EA EA] will disable the coins from being written to the status bar. $008F95 - [09] The X position of the small bonus star counter in the status bar. $008FC5 - [20 79 90] Change to EA EA EA to disable the item GFX in the status bar $008FCE - Length of "LUIGI" text (Status bar) $008FE7 - [FC](blank tile) Tile used on the status bar when there's no Yoshi coin in that spot. $008FED - [2E](coin tile) Tile used on the status bar when there is a Yoshi coin in that spot. Change to [FC](blank tile) to visually disable collected Yoshi Coins. |
|
$008F1D | 30 bytes | Misc. | Routine that handles actually increasing the player's coin count and giving a life from 100 coins, controlled by RAM address $7E13CC. | |
$008FDC | 1 byte | Layer 3 | [05] If the player has collected at least this number of Dragon Coins, the status bar will display $008FE0 Dragon Coins instead (none by default). | |
$008FE0 | 1 byte | Layer 3 | [00] Number of Dragon Coins to display in the status bar, if the player has collected at least 5. | |
$008FF0 | 2 bytes | Layer 3 | Location of the first Dragon Coin tile in the status bar. | Diagram |
$008FFA | 24 bytes | Misc. | Table containing six 32-bit numbers representing hexadecimal powers of 10, used by the 6-digit HexToDec routine at $009012 used to display the player's score. The numbers are not direct 32-bit values, though, and are instead two consecutive 16-bit values that are directly concatenated together. For instance, the number 100000 (0x186A0 is hex) is represented here as [$0001,$86A0]. | 16-bit values |
$009012 | 51 bytes | Subroutine (JSR) | 6-digit HexToDec subroutine, used to write a player's score into status bar (note: although the score is shown in-game as 7 digits, the 7th digit is just a static 0 tile). This function calculates the digits by repeatedly subtracting powers of 10 (in hexadecimal) from the input number until no more can be subtracted. Input: - Y: Set to #$00 - X: Status bar position to write to (indexed from $0F15) - $00-$03: Hexadecimal value to convert. Note that this is not provided as a normal 32-bit value, though, and instead should be provided as two 16-bit values, with $00 being the high word and $02 being the low word. |
|
$009045 | 12 bytes | Subroutine (JSR) | Subroutine used to convert a hexadecimal value to 2-digit decimal (also known by HexToDec). A JSL to this routine can be found at $00974C. Input: -A: 8-bit value to convert Output: -A: 1s digit -X: 10s digit |
|
$009051 | 40 bytes | Subroutine (JSR) | Subroutine used to convert the player's bonus stars from hexadecimal to decimal, and then write them to the status bar. Note that this only writes them as single-tile 8x8 digits, though; the main status bar's code at $008FAF is responsible for later converting these small digits to the 8x16 numbers actually seen in-game. | |
$009053 | 3 bytes | Layer 3 | Change to EAEAEA to get rid of the small bonus stars. Use in conjunction with address $00:9068 | |
$009068 | 3 bytes | Layer 3 | Change to EAEAEA to get rid of the small bonus stars. Use in conjunction with address $00:9053 | |
$009079 | 88 bytes | Sprite tilemap related | Subroutine that draws the power up item to the item box on the status bar during levels. $0090AE is the X position of the Item Box item. $0090B3 is the Y position of the Item Box item. Note: Those two positions are only graphical. It won't change where the item drops from when select is pressed. To change that, see $028052 and $028060 |
|