Super Mario Bros. 3/RAM map

From Data Crystal
Jump to navigation Jump to search

Chip tiny.png The following article is a RAM map for Super Mario Bros. 3.

NOTES:

  • All values in the table are hexadecimal unless otherwise noted.
  • "Signed byte" means the value can technically be between -128..127 (80..FF, 00, 01..7F).
RAM Purpose
0A Temp. used to adjust main character sprite vertical position
14 Flag to return to map
15 Increased by one every game cycle. Used as timer
17 Player 1 gamepad bits.
75 On map screen vertical position. Multiples of 20, unless in boat. Also horizontal position in levels measured in units of 8 blocks wide.
77 Page counter on map screen
78 On map screen vertical position (see next RAM location description)
79 On map screen horizontal position. Multiples of 20, unless in boat. If multipaged, E0 shifts screen right, then 60, then D0, then 50. Shifting back to the left occurs at 20, then A0, then 20, then A0.
87 Vertical position measured in units of 8 blocks wide
88-?? Enemy Sprite vertical positions on screen high byte
90 Player horizontal position. Changing may cause problems in Name Table.
A2 Player vertical position in levels.
A3-?? Enemy Sprite vertical positions on screen low byte
B4 Set to C0 to kill Mario in an odd way. Sprite disappears, death music plays and returns you to world map.
BD Player horizontal velocity (signed byte)
BE-?? Enemy Sprite horizontal velocity (signed byte)
CF Player vertical velocity (signed byte)
D0-?? Enemy Sprite vertical velocity (signed byte)
D8 In air flag
ED Current form (to set, use 0578): 00-Small, 01-Super, 02-Fire, 03-Raccoon, 04-Frog, 05-Tanooki, 06-Hammer
EE Mario/Luigi Character Sprite Displayed(gets set just before display)
EF Mario/Luigi status flag: 40 facing right, 00 facing left
F5 Controller status, new buttons pressed this frame (each bit clears to zero after initial frame)
F7 Controller status, buttons held down
0100-01FF CPU Stack
0200-02FF DMA transfer to sprite memory.
0376 Pause flag
03DD P-meter in status bar. Bits 0-5 govern each arrow in turn and bit 6 is the P. (7F = all arrows alight and P blinking)
03F2 Map starman flag
03F3 Character selection on map (ED value or 7-cloud, 8-p-wing)
04F1 Sound play byte. Freeze to $00 to remove some sounds (i.e. full fly meter sound)
04F2 Sound play byte.
04F3 Sound play byte.
04F4 Fanfare play byte.
04F5 Music play byte.
04F6 Sound play byte.
04F7 Sound pause byte. 01 pauses, 02 un-pauses.
0510-0517 Various countdown timers. There's a routine at A1DC decrementing these eight timers towards 00 every frame.
0510 Countdown timer for player going in/out of pipe. Starts with 0F.
0511 Countdown timer for raccoon tail waving (repeatedly pressing jump button).
0515 Countdown timer for advancing the P-meter up or down.
0516 Countdown timer for multi-coin blocks.
051B?-051C Countdown timers for enemy use. See remarks below. They seem to be assigned backwards, 051C is used for the first enemy to come on screen, then 051B etc.
051D Countdown timer for powerups rising animation. If set to nonzero value will make the powerup rise again(!) wherever it is on screen.
0525 Countdown timer for bounce block sprite (like ? when hit).
0545 Level start entrance effect. 0-normal, 1-slide, 2-pipe upwaard, 3-pipe downward, 4-pipe from right, 5-pipe from left, 6-jump on anchor of ship, 7-scroll right and down
0552 Timer that is set after player is hit. Determine how long you flash (are invincible)
0553 Timer for star mario
0554 Timer for change suit poof effect (set value is 17 (or 11 hex?))
0559 Set to FF for auto-control of player character
055A Auto-control mode. 0-normal, 1-run under ship, 2-jump on ship, 3-grab anchor, 4-screen scroll right and down for ship, 6-screen scrolls fast right
055C Mario's velocity; 4 bits precision for 1/256th of a pixel
055D 8 frame timer. Resets at the beginning of a level.
0567 Timer for P-Block
056E Timer that determines how long flight will last. Power Meter instantly empties when this hits zero. Setting to FF enables unlimited flight.
056F Ducking flag; Set to $FF for squat-float effect
0570 Number of frames ducking on white block
0575 Swimming flag
0577 Indicates whether Mario currently has Kuribos boot. (00=No, 01=Yes)
0578 Change Mario form. Modes 1-7 can be changed at will (same as ED value+1). Flag-like values combine with ANY mode (so you can get e.g. small Mario in statue form). Modes: 01=small, 02=big, 03=fire, 04=raccoon, 05=frog, 06=tanooki, 07=hammer. Flags: 10=Enable statue, 40=Enable swimming (causes splash on land), 80=Enable Kuribos boot. No idea how to CLEAR the flags, probably not possible here.
057A Enable statue mario characteristic (gray & invincible, note: can't go down pipes with this characteristic enabled)
057B Indicates flight? Has the value 1 when P-meter is full AND player is jumping. Used at least for locking 0515 and thus the P-meter while in flight.
057C PrizeBoxCode
0584 Underwater / not underwater selection
0585 (??) Set to $FF to slide "right" (not left) through solid objects
0588 Timer for "Backstage" status
05EE-05F0 Time remaining
05F3 Freeze timer if set to 01
05F4 Stomp counter
0669 The item you'll get from a toad house
066F Card selection for the flashing card that you jump to get
0715-0717 current player score divided by dec10. (max F423F[dec999,999]) (There's a hard coded 0 in the score display)
0727 World number - 1
0736 Mario # of Lives (max 63[dec99])
0737 Luigi # of Lives
0746 Mario's Form that he will start next level as. When the level is loaded this value gets transferred to 00ED.
0747 For Luigi; See 0746.
074D Horzontal subpixel position. (1/16 of a pixel)
075F Vertical subpixel position. (1/16 of a pixel)
0781 RNG. 72 bits LFSR.
6000-794F Active level data.
7976 Map screen Y position for the current level Mario is in.
7977 Map screen Y position for the current level Luigi is in.
7978 Map screen X position (high byte) for the current level Mario is in.
7979 Map screen X position (high byte) for the current level Luigi is in.
797A Map screen X position (low byte) for the current level Mario is in.
797B Map screen X position (low byte) for the current level Luigi is in.
797E Map screen Y position to return to when Mario dies.
797F Map screen Y position to return to when Luigi dies.
7980 Map screen X position (high byte) to return to when Mario dies.
7981 Map screen X position (high byte) to return to when Luigi dies.
7982 Map screen X position (low byte) to return to when Mario dies.
7983 Map screen X position (low byte) to return to when Luigi dies.
7B40-7B?? Enemy data for the current level.
7D00-7D3F Mario's level complete flags.
7D40-7D7F Luigi's level complete flags.
7D80-7D9B Each Byte Represents an Item that Mario is Carrying (Pressing 'B' while at Map Screen): 00-No Item, 01-Mushroom, 02-Flower, 03-Leaf, 04-Frog, 05-Bear, 06-Hammer Bro Suit, 07-Cloud, 08-P-Wing, 09-Star, 0A-Anchor, 0B-Hammer, 0C-Whistle, 0D-Music Box. 0E and above will most likely crash the game, not completely tested though.
7D9C-7D9E Each Byte Represents a reward card Mario has 00-No Item, 01-Mushroom, 02-Flower, 03-Star
7D9F-7DA1 Storage for Mario Score (/dec10)
7DA2 # of coins Mario has
7DA3-7DBE Each Byte Represents an Item that Luigi is Carrying (Pressing 'B' while at Map Screen): 00-No Item, 01-Mushroom, 02-Flower, 03-Leaf, 04-Frog, 05-Bear, 06-Hammer Bro Suit, 07-Cloud, 08-P-Wing, 09-Star, 0A-Anchor, 0B-Hammer, 0C-Whistle, 0D-Music Box. 0E and above will most likely crash the game, not completely tested though.
7DBF-7DC1 Each Byte Represents a reward card Luigi has 00-No Item, 01-Mushroom, 02-Flower, 03-Star
7DC2-7DC4 Storage for Luigi Score(/dec10)
7DC5 # of coins Luigi has
A648 (C8) Initial velocity for player jump.
ACA2 (05) Mario falling gravity, added to Y vel each frame.
ACA6 (E0) Default upward velocity for jumps. Modified by a table value subtracted from this, see Notes.
ACB3 (01) Mario jump gravity, added to Y vel each frame while jump in progress.
BFCC Routine that clamps 00CF (Mario Y velocity) to the maximum ($45) when falling.

Note: Some addresses above are in the PRG ROM range, should probably be moved to the ROM map.

Enemy timers at 051B-051C:

  • Piranha plants use these to toggle being up/down. E.g. when inside the pipe, set to 01 to force the plant coming up next frame.