Super Mario Bros. 2 (NES)/RAM map

From Data Crystal
< Super Mario Bros. 2 (NES)
Revision as of 18:34, 6 September 2024 by Killedragon (talk | contribs) (it said the door timer counter adress was 04BE, didn't work for me and found out the correct adress to be 04BD)
Jump to navigation Jump to search

Chip tiny.png The following article is a RAM map for Super Mario Bros. 2 (NES).

RAM

Counters

  • $04ED - Current number of lives
  • $05C5 - Current number of Continues
  • $062A - Current number of cherries
  • $062B - Current number of coins pulled in Subspace (Slot machine currency)
  • $062C - Current number of BIG vegetables pulled for stop watch
  • $062D - Number of levels finished as Mario
  • $062E - Number of levels finished as Princess
  • $062F - Number of levels finished as Toad
  • $0630 - Number of levels finished as Luigi

Sprite Related

  • $0014 - Page of main character's X position
  • $001E - Page of main character's Y position
  • $0638 - Player's Overalls Palette
  • $0639 - Player's Cap Palette
  • $063A - Player's Skin Palette

Position of sprites

X position on page

  • $0028 - main character
  • $0029 - enemy 5
  • $002A - enemy 4
  • $002B - enemy 3
  • $002C - enemy 2
  • $002D - enemy 1

Y position on page

  • $0033 - enemy 5
  • $0034 - enemy 4
  • $0035 - enemy 3
  • $0036 - enemy 2
  • $0037 - enemy 1

Speed of sprites (left/right)

  • $003C - Main character
  • $003D - Enemy 5
  • $003E - Enemy 4
  • $003F - Enemy 3
  • $0040 - Enemy 2
  • $0041 - Enemy 1

Jumping Physics

  • $0046 - main character
  • $0047 - enemy 5
  • $0048 - enemy 4
  • $0049 - enemy 3
  • $004A - Enemy 2
  • $004B - Enemy 1
  • $0050 - Is character on a vine?
00 - no
01 - yes

Misc. sprite addresses

  • $0051 - Enemy 5
  • $0052 - Enemy 4
  • $0053 - Enemy 3
  • $0054 - Enemy 2
  • $0055 - Enemy 1
00 - Invisible
01 - Visible
02 - Dead
  • $005A - Enemy 5's relation to main character/landscape
  • $005B - Enemy 4's relation to main character/landscape
  • $005C - Enemy 3's relation to main character/landscape
  • $005D - Enemy 2's relation to main character/landscape
  • $005E - Enemy 1's relation to main character/landscape
00 - not on the ground (could be jumping or being thrown)
04 - walking
05 - turn left because object blocks path
06 - turn right because object blocks path
20 - carrying main character when reaching an edge to turn around
24 - carrying main character with same speed as movement

Sprite's palette, mirroring, etc.

  • $0065 - Enemy 5
  • $0066 - Enemy 4
  • $0067 - Enemy 3
  • $0068 - Enemy 2
  • $0069 - Enemy 1

Sprite IDs

  • $008F - Character selected (appearance only, until defeated, then stats as well)
00 - Mario
01 - Princess
02 - Toad
03 - Luigi
  • $0090 - Enemy 5
  • $0091 - Enemy 4
  • $0092 - Enemy 3
  • $0093 - Enemy 2
  • $0094 - Enemy 1
  • $0096 - Item pulled up from ground
  • $0099 - Graphics for when main character jumps
  • $009A - Drop through
  • $009B - Graphics for when main character walks
  • $00C7 - Character's status

Sprite HP

  • $0465 - Enemy 5
  • $0466 - Enemy 4
  • $0467 - Enemy 3
  • $0468 - Enemy 2
  • $0469 - Enemy 1

Main character

  • $04C2 - Current life in the life meter
0F - One heart
1F - Two hearts
2F - Three hearts
3F - Four hearts
  • $04C3 - Number of bars in the life meter (for visual purposes only)
FF - One bar (doesn't work very well)
00 - Two bars (default)
01 - Three bars
02 - Four bars

Timers

  • $0085 - Amount of time left until main character becomes vulnerable
  • $0086 - Amount of time left for unknown
  • $0087 - Amount of time left before Bob Omb 5 explodes
  • $0088 - Amount of time left before Bob Omb 4 explodes
  • $0089 - Amount of time left before Bob Omb 3 explodes
  • $008A - Amount of time left before Bob Omb 2 explodes
  • $008B - Amount of time left before Bob Omb 1 explodes
  • $008C - Amount of time left before Bomb 1 explodes
  • $008D - Amount of time left before Bomb 2 explodes
  • $008E - Amount of time left before Bomb 3 explodes
  • $00B9 - Current time left to use Pidget's carpet
  • $04B7 - Amount of time left in subspace
  • $04E0 - Amount of time left as star Mario
  • $04FF - Current amount of time left from the stop watch
  • $14CA - Timer for crouch jump power (0 - 3C)

Item flags

  • $009C - Holding an item?
00 = no
01 = yes
  • $009D - Character's mirroring, etc. (not palette)
  • $00A3 - Changes once for everytime Tweeter jumps
  • $00AD - Is key held?
00 - no
01 - yes -  Key appears above head even if thrown, but then not chased.
  • $00AE - Item in hand height (used for different character sizes?)

Misc.

  • $002F - Bonus chance left card
  • $0030 - Bonus chance middle card
  • $0031 - Bonus chance right card
  • $00BA - Screen speed moving left and right
  • $0100 - (screen hold?)
  • $0415 - the rising of the heart
  • $0416 - Height of whale's spout after peaking.
  • $0456 - Current time left Hawkmouth (before Wart) is open
  • $04EC - Level Transition.
00 - normal game play
01 - begin the same level and area again (like dying revive)
02 - game over
03 - end level, go to bonus game
04 - warp
  • $06F6 - Character growing or shrinking


  • $0211 + $0215 = Slot machine Slot #1 (only during slot game)
  • $0219 + $021D = Slot machine Slot #2 (only during slot game)
  • $0221 + $0225 = Slot machine Slot #3 (only during slot game)
9, 9 = Star
1, 3 = Shy Guy
11, 11 = Radish
5, 7 = Cherry

Button Related

  • $00F5 - Button pressed (Controller 1)
  • $00F6 - Button pressed (Controller 2)
  • $00F7 - Button held (Controller 1)
  • $00F8 - Button held (Controller 2)
Directional Pad
*0 - no movement
*1 - Right
*2 - Left
*3 - Left + Right
*4 - Down
*5 - Down + Right
*6 - Down + Left
*7 - Down + Left + Right
*8 - Up
*9 - Up + Right
*A - Up + Left
*B - Up + Left + Right
*C - Up + Down
*D - Up + Down + Right
*E - Up + Down + Left
*F - Up + Down + Left + Right
Buttons
0* - not pressed
1* - Start
2* - Select
3* - Start + Select
4* - B
5* - Start + B
6* - Select + B
7* - Start + Select + B
8* - A
9* - Start + A
A* - Select + A
B* - Start + Select + A
C* - A + B
D* - Start + A + B
E* - Select + A + B
F* - Start + Select + A + B

Sprite Flags

  • $04B4 - Something to do with the Hawkmouth opening and closing
  • $04AD - Current number of enemies defeated to grab a heart.
  • $04B0 - Has Key been used on lock?
00 - no
01 - yes - If yes, then it won't reappear.
  • $04B4 - How wide Hawkmouth is open
  • $04B5 - Has the Crystal been obtained? If yes, effect will last while in area.
00 - no
01 - yes
  • $04B6 - look into
  • $04BD - Time counts up for how long the door takes to open
  • $04C4 - Amount of time left for the screen to shake after POW
  • $04C5 - Height to raise and lower the "level" for shake
  • $04C6 - Amount of time left for bomb flash in background
  • $04CA - Amount of time to build up to charged jump
  • $04E0 - Current Starman time length left

Regeneration properties

  • $04E7 - Area
  • $04E8 - Sub-area
  • $04E9 - Page

Mushroom Flags

  • $04FB - Has First Mushroom been pulled? If yes, then it won't reappear.
00 - no
01 - yes
  • $04FC - Has Second Mushroom been pulled? If yes, then it won't reappear.
00 - no
01 - yes
  • $0620 - Has 1-up been pulled?
00 - no
01 - yes - If yes, then it won't reappear.

Subspace Related Properties

  • $0621 - Number of times leaving Subspace after grabbing a coin
00 - 1st chance to grab coins
01 - 2nd chance to grab coins
02 - No more chances, get vegetables.
  • $0628 - In subspace?
00 - no
02 - yes (doesn't work for vertical areas)
  • $0629 - Possible subspace offset

Level in Memory

$0531 - Current level loaded

00 - 1-1
01 - 1-2
02 - 1-3
03 - 2-1
04 - 2-2
05 - 2-3
06 - 3-1
07 - 3-2
08 - 3-3
09 - 4-1
0A - 4-2
0B - 4-3
0C - 5-1
0D - 5-2
0E - 5-3
0F - 6-1
10 - 6-2
11 - 6-3
12 - 7-1
13 - 7-2

Character Properties

  • $0546 - Pickup Speed Animation 1
  • $0547 - Pickup Speed Animation 2
  • $0548 - Pickup Speed Animation 3
  • $0549 - Pickup Speed Animation 4
  • $054A - Pickup Speed Animation 5
  • $054B - Pickup Speed Animation 6
  • $054D - Standing Jump Height
  • $054E - Crouching Power Jump Height
  • $0550 - Running Jump Height
  • $0551 - Running Jump Height while carrying object
  • $0553 - Float Timer (set to 0 for everyone but Princess)
  • $0555 - Character's Jumping physics?

Music and Sound Properties

  • $05EE - Current music track?
  • $05EF - Current music track?
  • $0600 - Loads the current song track
  • $0601 - Plays a sound effect
  • $0602 - Plays a sound effect
  • $0603 - Plays a small clip of music (and also for ending sequence)
  • $0604 - Character's sound effects
  • $0605 - POW sound effects
  • $0606 - Stores sound effect from $0603 played
  • $0607 - Stores sound effect from $0602 played
  • $0608 - Stores sound effect from $0601 played
  • $0609 - Stores music track from $0600 played
  • $0612 - Current music tempo

World Properties

  • $0635 - Current World number (loads characteristics of world such as Ice)

Graphics Tileset

  • $06F7 - Current Level Tileset (1st half of the right Table)
10 - Grass
12 - Desert
14 - Sky
16 - Wart's Palace?
  • $06F8 - Current Cycling Sprite Tileset (2nd half of the right Table)
  • $06F9 - Current Character (Appearance, not stats) (1st quarter of left Table)
00 - Large Mario
01 - Large Luigi
02 - Large Princess
03 - Large Toad
04 - Small Mario
05 - Small Luigi
06 - Small Princess
07 - Small Toad
  • $06FA - Current standard sprites (Snifits, Hawkmouth, etc.) (2nd quarter of left Table)
  • $06FB - Current standard sprites (1-Up, Birdo, etc.) (3rd quarter of left Table)
  • $06FC - Current changeable sprites (Ostro, Pidget, Pokey, etc.) (4th quarter of left Table)
  • $06FD - Current animation of $06F8 (Cycling sprites)

Level Layout

  • $0700 ~ $07FF - Subspace and jars
  • $6000 - $695F - Currently loaded level (Almost half the SRAM)

Stuff posted by ACMLM on rustedmagick forums in 2002

SMB2's music ROM bank: ($8000-FFFF, Addresses not counting header)

----------
$8000-8119 = ?? (contains data such as the jump sound, climbing sound, falling sound (in 1-1))
$811A-8137 = Mushroom sound (notes in reverse order)
$8138-818E = ??
$818F-8196 = Pointers to sound effects
$8197-828D = Sound effects
$828E-8746 = ?? (must be the code that generates music from the data)
$8747-875E = Note frequency data (base scale)

$875F-8EFF = unused

$8F00-8FB2 = Note length tables
$8FB3-8FFF = unused (can be used to add note length tables)

$9000-9029 = Music part pointers
$902A-9102 = Music part headers
$9103-910B = Pointers to first music part (for each song)
$910C-9114 = Pointers to last music part
$9115-911D = Pointers to looping music part
$911E-A18D = Music data
$A18E-A3EE = Instrument sound data (square pulse property bits)

$A3EF-BFFF = unused
----------

Pointers to
first/last/loop part of:
$9103-910C-9115 = Normal level     ($10-16-11)
$9104-910D-9116 = Character select ($07-0F-08)
$9105-910E-9117 = Underground      ($29-29-29)
$9106-910F-9118 = Boss             ($17-17-17)
$9107-9110-9119 = Star             ($18-18-18)
$9108-9111-911A = Sub-space        ($1E-22-1E)
$9109-9112-911B = Wart             ($19-19-19)
$910A-9113-911C = Intro            ($1A-1D-00)
$910B-9114-911D = Ending           ($23-28-28)
--> pointing from $9000

$9000-9029 = Music part pointers
Default:
$9000      = Bonus (get mushroom) ($99)
$9001      = Boss beaten          ($8E)
$9002      = Bonus 2 (get ball)   ($84)
$9003      = Die, lose            ($A4)
$9004      = Game Over            ($89)
$9005      = Same as $9002        ($84)
$9006      = Same as $9000        ($99)
$9007-900F = Character select     ($2A,30,36,30,3C,42,A9,9E,93)
$9010-9016 = Normal level         ($48,4E,54,5A,54,60,66)
$9017      = Boss                 ($72)
$9018      = Star                 ($78)
$9019      = Wart                 ($7E)
$901A-901D = Intro                ($B5,AF,BB,C1)
$901E-9022 = Subspace             ($C7,CD,D3,CD,D9)
$9023-9028 = Ending               ($DF,EB,E5,F7,F1,FD)
$9029      = Underground          ($6C)
--> pointing from $9000

Music part headers:
$902A-902F \
$9030-9035 |
$9036-903B | Character select
$903C-9041 | (part 1)
$9042-9047 /
$9048-904D \ 
$904E-9053 |
$9054-9059 | Normal level
$905A-905F |
$9060-9065 |
$9066-906B /
$906C-9071 = Underground
$9072-9077 = Boss
$9078-907D = Star
$907E-9083 = Wart
$9084-9088 = Bonus 2
$9089-908D = Game Over
$908E-9092 = Boss beaten
$9093-9098 = Character select (2)
$9099-909D = Bonus
$909E-90A3 = Character select (3)
$90A4-90A8 = Die, lose
$90A9-90AE = Character select (4)
$90AF-90B4 \
$90B5-90BA | Intro
$90BB-90C0 |
$90C1-90C6 /
$90C7-90CC \
$90CD-90D2 | Subspace
$90D3-90D8 |
$90D9-90DE /
$90DF-90E4 \
$90E5-90EA |
$90EB-90F0 | Ending
$90F1-90F6 |
$90F7-90FC |
$90FD-9102 /

Music header bytes:
00    = Pointer to note length table (points from $8F00)
01-02 = Pointer for square 1 channel (main pointer)
03    = Data offset for triangle (from main address)
04    = Data offset for square 2
05    = Data offset for noise

Note length tables:
$8F00-8F0C = $03,03,04,04,06,09,08,08,0C,12,18,24,30
$8F0D-8F1A = $03,04,05,04,07,0A,09,0A,0E,15,1C,2A,38,0B
$8F1B-8F27 = $04,04,05,06,08,0C,0B,0A,10,18,20,30,40
$8F28-8F36 = $04,05,06,06,09,0D,0C,0C,12,1B,24,36,48,0E,03
$8F37-8F43 = $05,05,07,06,0A,0F,0D,0E,14,1E,28,3C,50
$8F44-8F51 = $05,06,07,08,0B,10,0F,0E,16,21,2C,42,58,11
$8F52-8F5f = $06,06,08,08,0C,12,10,10,18,24,30,48,60,02
$8F50-8F6D = $06,07,09,08,0D,13,11,12,1A,27,34,4E,68,14
$8F6E-8F7C = $07,07,09,0A,0E,15,13,12,1C,2A,38,54,70,03,04
$8F7D-8F8A = $07,08,0A,0A,0F,16,14,14,1E,2D,3C,5A,78,17
$8F8B-8F97 = $08,08,0B,0A,10,18,15,16,20,30,40,60,80
$8F98-8FA5 = $08,09,0B,0C,11,19,15,16,22,33,44,60,88,1A
$8FA6-8FB2 = $09,09,0C,0C,12,1B,18,18,24,36,48,6C,90

Music data:
DF-$911E = Ending (1)
E5-$919C = Ending (2)
F7-$920D = Ending (5)
EB-$9280 = Ending (3)
F1-$92F2 = Ending (4)
FD-$9376 = Ending (6)
78-$9469 = Star
6C-$94BD = Underground
C7-$9550 = Subspace (1)
CD-$95A3 = Subspace (2)
D3-$95E0 = Subspace (3)
D9-$960F = Subspace (4)
B5-$963E = Intro (2)
AF-$96A7 = Intro (1)
BB-$9794 = Intro (3)
C1-$9878 = Intro (4)
2A-$98AD = Character select (1)
30-$995C = Character select (2)
36-$999A = Character select (3)
3C-$999E = Character select (4)
42-$9A26 = Character select (5)
A9-$9A5D = Character select (8)
9E-$9ADF = Character select (7)
93-$9B93 = Character select (6)
48-$9BD4 = Normal level (1)
4E-$9C20 = Normal level (2)
54-$9CF9 = Normal level (3)
5A-$9D3F = Normal level (4)
60-$9E00 = Normal level (5)
66-$9E4D = Normal level (6)
72-$9F1C = Boss
7E-$9FC7 = Wart
99-$A0BB = Bonus
89-$A0CE = Game Over
8E-$A0F2 = Boss Beaten
84-$A148 = Bonus 2
A4-$A16F = Die, lose

$818F-8196 = Sound effect pointers

$8197-81B5 = Door appearing
$81B6-81DC = Throwing item
$81DD-81FB = Birdo spitting
$81FC-8202 = Selecting, getting cherry/heart
$8203-8219 = Defeating enemy
$821A-8233 = Clock ticking
$8234-8265 = Hawkmouth opening
$8266-828D = 1UP sound

$8397:B9 03 91  LDA $9103,Y  --Load the start part pointer
$839A:8D EE 05  STA $05EE
$839D:B9 0C 91  LDA $910C,Y  --Load the end part pointer
$83A0:18        CLC
$83A1:69 02     ADC #$02
$83A3:8D EF 05  STA $05EF
$83A6:B9 15 91  LDA $9115,Y  --Load the loop part pointer
$83A9:8D F0 05  STA $05F0

And some old info from 2 years ago: (addresses without header, again)

$4C3A -- Panser's spitting time
$4C64 -- Grey panser's spitting direction

$4D43 -- Jump height on coming out of jars

$4F98 -- Birdo's jump height
$4FB3 -- Birdo's spitting time
$4FC6 -- Birdo's speed (right)
$4FCC -- Birdo's speed (left)
$4FDA -- Birdo's spitting sound

$555C -- Snifit's jump height
$5593 -- Snifit's spitting time

$6161 -- Clawglip's rock throwing time
$61C5 -- Rock speed

$65A0 -- Mouser's jump height
$65AC -- Mouser's bomb holding time
$65E4 -- Mouser's bomb throwing height
$65EB -- Time before bomb explosion
$65EF -- Mouser's bomb throwing speed

$68AB -- Triclyde's spitting sound

$720D -- Wart's speed (left)
$7213 -- Wart's speed (right)

References

http://www.tekhacks.net/forum - lost when forum was removed (recovered by internet archive) http://board.acmlm.org - lost when board was remade (recovered by internet archive) http://bmf.rustedmagick.com/