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.

Note for template.png
Note:
  • 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).


$0000A to $---- = Temp. used to adjust main character sprite vertical position
$00014 to $---- = Flag to return to map
$00015 to $---- = Increased by one every game cycle. Used as timer
$00017 to $---- = Player 1 gamepad bits.
$00075 to $---- = On map screen vertical position. Multiples of 20, unless in boat. Also horizontal position in levels measured in units of 8 blocks wide.
$00076 to $??   = Enemy Sprite horizontal positions on screen high byte
$00077 to $---- = Page counter on map screen 
$00078 to $---- = On map screen vertical position (see next RAM location description)
$00079 to $---- = 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. 
$00087 to $---- = Vertical position measured in units of 8 blocks wide
$00088 to $???? = Enemy Sprite vertical positions on screen high byte
$00090 to $---- = Player horizontal position. Changing may cause problems in Name Table.
$00091 to $??   = Enemy Sprite horizontal positions on screen low byte
$0009A to $??   = Platform move direction index
     E,F  0  1,2
   D.  \  |  /  .3
     '. \ | / .'
       '.\|/.'
  C ------+------ 4
        ./|\.
      .'/ | \'.
   B.' /  |  \ '.5
     9,A  8  6,7
$000A2 to $---- = Player vertical position in levels.
$000A3 to $???? = Enemy Sprite vertical positions on screen low byte
$000B4 to $---- = Player vertical position with 11 added. Set to C0 to kill Mario in an odd way. Sprite disappears, death music plays and returns you to world map.
$000BD to $---- = Player horizontal velocity (signed byte)
$000BE to $???? = Enemy Sprite horizontal velocity (signed byte)
$000CF to $---- = Player vertical velocity (signed byte)
$000D0 to $???? = Enemy Sprite vertical velocity (signed byte)
$000D8 to $---- = In air flag
$000ED to $---- = Current form (to set, use 0578):
     00-Small
     01-Super
     02-Fire
     03-Raccoon
     04-Frog
     05-Tanooki
     06-Hammer
$000EE to $---- = Mario/Luigi Character Sprite Displayed(gets set just before display)
$000EF to $---- = Mario/Luigi status flag: 40 facing right, 00 facing left
$000F5 to $---- = Controller status, new buttons pressed this frame (each bit clears to zero after initial frame)
$000F7 to $---- = Controller status, buttons held down

$0100 to $01FF = CPU Stack - Set 160 to 80 to enable debug mode without having to use the Game Genie code
$0200 to $02FF = DMA transfer to sprite memory.
$0376 to $---- = Pause flag
$03DD to $---- = 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 to $---- = Map starman flag
$03F3 to $---- = Character selection on map (ED value or 7-cloud, 8-p-wing)
$04F1 to $---- = Sound play byte. Freeze to $00 to remove some sounds (i.e. full fly meter sound)
$04F2 to $---- = Sound play byte.
$04F3 to $---- = Sound play byte.
$04F4 to $---- = Fanfare play byte.
$04F5 to $---- = Music play byte.
$04F6 to $---- = Sound play byte.
$04F7 to $---- = Sound pause byte. 01 pauses, 02 un-pauses.
$0510 to $0517 = Various countdown timers. There's a routine at A1DC decrementing these eight timers towards 00 every frame.
$0510 to $---- = Countdown timer for player going in/out of pipe. Starts with 0F.
$0511 to $---- = Countdown timer for raccoon tail waving (repeatedly pressing jump button).
$0515 to $---- = Countdown timer for advancing the P-meter up or down.
$0516 to $---- = Countdown timer for multi-coin blocks.
$051B? to $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 to $---- = Countdown timer for powerups rising animation. If set to nonzero value will make the powerup rise again(!) wherever it is on screen.
$0525 to $---- = Countdown timer for bounce block sprite (like ? when hit).
$0545 to $---- = 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 to $---- = Timer that is set after player is hit. Determine how long you flash (are invincible)
$0553 to $---- = Timer for star mario
$0554 to $---- = Timer for change suit poof effect (set value is 17 (or 11 hex?))
$0559 to $---- = Set to FF for auto-control of player character
$055A to $---- = 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 to $---- = <strike>Mario's velocity; 4 bits precision for 1/256th of a pixel</strike>
$055D to $---- = 8 frame timer. Resets at the beginning of a level.
$0567 to $---- = Timer for P-Block
$056E to $---- = Timer that determines how long flight will last. Power Meter instantly empties when this hits zero. Setting to FF enables unlimited flight.
$056F to $---- = Ducking flag; Set to $FF for squat-float effect
$0570 to $---- = Number of frames ducking on white block
$0575 to $---- = Swimming flag
$0577 to $---- = Indicates whether Mario currently has Kuribos boot. (00=No, 01=Yes)
$0578 to $---- = 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 to $---- = <strike>Enable statue mario characteristic (gray & invincible, note: can't go down pipes with this characteristic enabled)</strike>
$057B to $---- = 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 to $---- = PrizeBoxCode
$0584 to $---- = Underwater / not underwater selection
$0585 to $---- = (??) Set to $FF to slide "right" (not left) through solid objects
$0588 to $---- = Timer for "Backstage" status
$05EE to $05F0 = Time remaining
$05F3 to $---- = Freeze timer if set to 01
$05F4 to $---- = Stomp counter
$0669 to $---- = The item you'll get from a toad house
$066F to $---- = Card selection for the flashing card that you jump to get
$070A to $---- = Current Object Set
   01=Plains
   02=Dungeon
   03=Hilly
   04=Sky
   05=Piranha Plant
   06=Water
   08=Pipe
   09=Desert
   0A=Ship
   0B=Giant
   0C=Ice
   0D=Cloudy
   0E=Underground
$0715 to $0717 = current player score divided by dec10. (max F423F[dec999,999]) (There's a hard coded 0 in the score display)
$071A to $---- = Current tileset animation frame
$0727 to $---- = World number - 1
$0736 to $---- = Mario # of Lives (max 63[dec99])
$0737 to $---- = Luigi # of Lives
$0746 to $---- = Mario's Form that he will start next level as. When the level is loaded this value gets transferred to 00ED.
$0747 to $---- = For Luigi; See 0746.
$074D to $---- = Horzontal subpixel position. (1/16 of a pixel)
$075F to $---- = Vertical subpixel position. (1/16 of a pixel)
$0781 to $---- = RNG. 72 bits LFSR.
$6000 to $794F = Active Block Buffer/Tile Map 
   0x1B0 bytes per room
$7976 to $---- = Map screen Y position for the current level Mario is in.
$7977 to $---- = Map screen Y position for the current level Luigi is in.
$7978 to $---- = Map screen X position (high byte) for the current level Mario is in.
$7979 to $---- = Map screen X position (high byte) for the current level Luigi is in.
$797A to $---- = Map screen X position (low byte) for the current level Mario is in.
$797B to $---- = Map screen X position (low byte) for the current level Luigi is in.
$797E to $---- = Map screen Y position to return to when Mario dies.
$797F to $---- = Map screen Y position to return to when Luigi dies.
$7980 to $---- = Map screen X position (high byte) to return to when Mario dies.
$7981 to $---- = Map screen X position (high byte) to return to when Luigi dies.
$7982 to $---- = Map screen X position (low byte) to return to when Mario dies.
$7983 to $---- = Map screen X position (low byte) to return to when Luigi dies.
$7B40 to $7B?? = Enemy data for the current level.
$7D00 to $7D3F = Mario's level complete flags.
$7D40 to $7D7F = Luigi's level complete flags.
$7D80 to $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 to $7D9E = Each Byte Represents a reward card Mario has
     00-No Item
     01-Mushroom
     02-Flower
     03-Star
$7D9F to $7DA1 = Storage for Mario Score (/dec10)
$7DA2 to $---- = # of coins Mario has 
$7DA3 to $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 to $7DC1 = Each Byte Represents a reward card Luigi has
     00-No Item
     01-Mushroom
     02-Flower
     03-Star
$7DC2 to $7DC4 = Storage for Luigi Score(/dec10)
$7DC5 to $---- = # of coins Luigi has 
$A648 to $---- = (C8) Initial velocity for player jump. 
$ACA2 to $---- = (05) Mario falling gravity, added to Y vel each frame.
$ACA6 to $---- = (E0) Default upward velocity for jumps. Modified by a table value subtracted from this, see Notes.
$ACB3 to $---- = (01) Mario jump gravity, added to Y vel each frame while jump in progress.
$BFCC to $---- = Routine that clamps 00CF (Mario Y velocity) to the maximum ($45) when falling.
Note for template.png
Note:
{{{1}}}


Enemy timers at $051B to $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.