Claim set · data/claims/smb2.yaml

Super Mario Bros. 2 (Super Mario Bros. 2, Discombobulated, Xkeeper0/smb2)

Game: Super Mario Bros. 2.

Super Mario Bros. 2 keeps speeds as 4.4 fixed point; ApplyPlayerPhysics takes whole pixels from a speed's upper nibble. smb2/velocity-format

About: Super Mario Bros. 2 Gravity

CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L3003-L3021ApplyPlayerPhysics: ; Add acceleration to velocity … ; Upper nybble of velocity is for lo position LSR A LSR A LSR A LSR AChecked by claude, 2026-10-21 — read ApplyPlayerPhysics at the pinned commit

PlayerStartJump first checks quicksand: sunk with QuicksandDepth 2 or more, the player takes off at JumpHeightQuicksand, $E0 for all four (quicksand), and the table is skipped. Otherwise it picks the take-off speed from the character's table by three bits: running (horizontal speed of $08 or more), a charged crouch (CrouchJumpTimer at $3C), and holding an item. A charged jump clears the running bit. smb2/jump-start

About: Super Mario Bros. 2 Jump

Value
{
 "runSpeed": 8,
 "chargeFrames": 60
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2535-L2588; %xxxxxRCI ; R = whether the player is running ; C = whether the crouch timer is charged ; I = whether the player is holding an item ; PlayerStartJump: LDA QuicksandDepth CMP #$02 BCC PlayerStartJump_LoadXVelocity ; Quicksand LDA JumpHeightQuicksand STA PlayerYVelocity …Checked by claude, 2026-10-26 — read PlayerStartJump, including its quicksand branch (L2543-L2550), which stores JumpHeightQuicksand and exits; the LDA

Cited by: Super Mario Bros. 2

Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area (probes/super-mario-bros-2/movement.mjs), empty-handed Mario's jumps leave the ground at -5 standing, -5.625 running, and -6.5 px/frame from a charged crouch, and each frame adds 0.25 px/frame with A held and 0.4375 without: MarioStats' $B0, $A6, and $98, and its gravities $04 and $07. With an item, see carry-stats. smb2/mario-stats

About: Super Mario Bros. 2 Jump

Value
{
 "still": -80,
 "running": -90,
 "charged": -104,
 "gravity": 7,
 "gravityHeld": 4
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L271-L290MarioStats: … .db $B0 ; Jump Speed, still - no object … .db $98 ; Jump Speed, charged - no object … .db $A6 ; Jump Speed, running - no object … .db $07 ; Gravity without Jump button pressed .db $04 ; Gravity with Jump button pressedChecked by claude, 2026-10-26 — read MarioStats (signed bytes in 4.4 fixed point); the probe reads the take-off frame's speed at $46 standing (A held, then A tapped), after 20 frames running left, and after 70 frames of Down, and the speed's change on the frames afterProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Super Mario Bros. 2

Luigi takes off far slower but falls under a far lighter gravity. Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, empty-handed, his jumps leave the ground at -2.625 standing, -3 running, and -3.4375 px/frame charged, and each frame adds 0.0625 px/frame with A held and 0.125 without: LuigiStats' $D6, $D0, and $C9, and its gravities $01 and $02. With an item, see carry-stats. smb2/luigi-stats

About: Super Mario Bros. 2 Jump

Value
{
 "still": -42,
 "running": -48,
 "charged": -55,
 "gravity": 2,
 "gravityHeld": 1
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L321-L343LuigiStats: … .db $D6 ; Jump Speed, still - no object … .db $C9 ; Jump Speed, charged - no object … .db $D0 ; Jump Speed, running - no object … .db $02 ; Gravity without Jump button pressed .db $01 ; Gravity with Jump button pressedChecked by claude, 2026-10-26 — read LuigiStats; the probe measures as for mario-stats. Luigi's run takes a Shyguy's hit on the ledge above the floor, before any measurement, so he is measured small; the movement code doesn't read the sizeProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Super Mario Bros. 2

PlayerGravity adds the character's lighter gravity on any frame the jump button is held and the heavier one otherwise, and adds none once a fall has reached $39 (3.5625 px/frame). The last add can carry the fall past that, up to $3F (3.9375 px/frame) under a gravity of $07. Two branches come first: sunk in quicksand (QuicksandDepth 2 or more), the routine adds GravityQuicksand, $08 for all four (quicksand), at any speed; and while the Princess floats, it sets her speed outright from FloatingYVelocity and adds nothing (float). smb2/gravity

About: Super Mario Bros. 2 Gravity

Value
{
 "fallStop": 57,
 "maxFall": 63
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2606-L2659PlayerGravity: LDA QuicksandDepth CMP #$02 BCC loc_BANK0_8CE5 LDA GravityQuicksand BNE loc_BANK0_8D13 loc_BANK0_8CE5: LDA GravityWithoutJumpButton LDY Player1JoypadHeld ; holding jump button to fight physics BPL PlayerGravity_Falling LDA GravityWithJumpButton LDY PlayerYVelocity …Checked by claude, 2026-10-26 — read PlayerGravity whole: the quicksand test branches to the add (loc_BANK0_8D13) past the $39 test; the held branch floats when the rise has slowed to -$04 or less and JumpFloatTimer is nonzero, storing FloatingYVelocity and returning; otherwise a falling speed of $39 or more skips the add, so $38 plus the heaviest gravity, $07, is the fastest fall

Cited by: Super Mario Bros. 2

The Princess's Floating Time is $3C; the other three have 0. With the button held once her rise has slowed to -$04 or less, each frame sets her vertical speed from FloatingYVelocity, cycling up, still, down, still, until the timer runs out. Letting go ends the float for that jump. Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, a jump with A held floats for 60 frames, holding each speed of the cycle for 8 frames, and then falls. smb2/float

About: Super Mario Bros. 2 Flight

Value
{
 "frames": 60,
 "cycle": [
  -4,
  0,
  4,
  0
 ]
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L346-L360PrincessStats: … .db $3C ; Floating TimeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2619-L2656LDA GravityWithJumpButton LDY PlayerYVelocity CPY #$FC BMI PlayerGravity_Falling … LDY JumpFloatTimer BEQ PlayerGravity_Falling … DEC JumpFloatTimer … LDA FloatingYVelocity, Y STA PlayerYVelocity …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2662-L2666FloatingYVelocity: .db $FC .db $00 .db $04 .db $00Checked by claude, 2026-10-21 — read PlayerGravity and PlayerStartJump (which loads JumpFloatTimer from JumpFloatLength); the cycle index is bits 3-4 of byte_RAM_10, the global counter the NMI increments, so each speed holds 8 frames; any frame of plain gravity with the timer short of full zeroes it. The probe reads her speed and JumpFloatTimer ($04C9) every frame of a jump with A held. Her run takes a Shyguy's hit before the floor, so she is measured smallProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Flight, Super Mario Bros. 2

Holding B raises the top speed by half: running right with nothing carried, from $18 to $24 (1.5 to 2.25 px/frame). Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, all four characters run right at 1.5 px/frame and, with B, 2.25 px/frame. smb2/run-cap

About: Super Mario Bros. 2 Running

Value
{
 "walk": 24,
 "run": 36
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2848-L2856; 1.5x max speed when the run button is held! loc_BANK0_8DE0: LDA RunSpeedRight, Y BIT Player1JoypadHeld BVC loc_BANK0_8DEC … LSR A CLC ADC RunSpeedRight, YChecked by claude, 2026-10-26 — read sub_BANK0_8DC0; bit 6 of Player1JoypadHeld is B, and to the right the cap is halved with LSR and added. The probe holds Right for 20 frames, then Right and B for 16, and reads $3C each frameProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Super Mario Bros. 2

The run button's half is added to whatever cap applies, the carrying speed (carry-speed) or quicksand's $04 as well as the unladen $18. To the left the cap is negative, and halving it with the carry set rounds it away from zero: a cap of $EB to the left becomes $E0, where $15 to the right becomes $1F. smb2/run-cap-rules

About: Super Mario Bros. 2 Running

CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2848-L2856; 1.5x max speed when the run button is held! loc_BANK0_8DE0: LDA RunSpeedRight, Y BIT Player1JoypadHeld BVC loc_BANK0_8DEC … LSR A CLC ADC RunSpeedRight, YSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2865-L2872LDA RunSpeedLeft, Y BIT Player1JoypadHeld BVC loc_BANK0_8DFF SEC ROR A CLC ADC RunSpeedLeft, YChecked by claude, 2026-10-26 — read sub_BANK0_8DC0: Y picks the cap row (unladen, carrying, or quicksand) before the B test, and to the left the cap is halved with SEC and ROR, which rounds a negative odd value down (away from zero). Not probed: the probe runs right only, carrying nothing

Health is $0F for one mark of the life meter and $10 more for each further mark, up to $3F for four. A hit takes $10, one mark, and sets DamageInvulnTime to $7F, during which DamagePlayer returns at once; the timer drops every frame. If the health left is $10 or more, two marks or more, the hit also launches the player upward at $C0 and sideways at four times the screen distance from the enemy. A hit on the last mark (health under $10) stores no health and sets no invulnerability: it turns the enemy toward the player (for the types before Enemy_BeezoDiving), stuns it for $10 frames, sets the player's vertical speed to $C0 and PlayerStateTimer to $20, and jumps to KillPlayer, which sets the dying state and health to 0. A dying player holds still for those 32 frames, then rises at $C0 and falls back, gaining $02 a frame up to $39, and loses a life once below the screen. smb2/damage

About: Super Mario Bros. 2 Invincibility frames

Value
{
 "frames": 127,
 "launchY": -64,
 "xPerPixel": 4
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L11362-L11388DamagePlayer: LDA DamageInvulnTime BNE locret_BANK3_BA31 LDA PlayerHealth SEC SBC #$10 BCC loc_BANK3_BA32 STA PlayerHealth LDY #$7F STY DamageInvulnTime LDY #$00 STY PlayerYVelocity …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L3171-L3177; Decrement player state timers LDX #$03 DecrementPlayerStateTimers_Loop: LDA PlayerStateTimer, X … DEC PlayerStateTimer, XSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/ram.asm#L291-L298PlayerStateTimer: … DamageInvulnTime:Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L11404-L11439loc_BANK3_BA32: TXA loc_BANK3_BA33: PHA LDX byte_RAM_12 LDA ObjectType, X CMP #Enemy_BeezoDiving BCS loc_BANK3_BA48 JSR EnemyFindWhichSidePlayerIsOn INY TYA CMP EnemyMovementDirection, X …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L5154-L5159KillPlayer: LDA #PlayerState_Dying ; Mark player as dead STA PlayerState LDA #$00 ; Clear some variables IFNDEF RESPAWN_INSTEAD_OF_DEATH STA PlayerHealthSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L1995-L2014HandlePlayerState_Dying: LDA PlayerStateTimer BNE locret_BANK0_8A86 LDA PlayerScreenYHi CMP #02 BEQ LoseALife JSR ApplyPlayerPhysicsY LDA PlayerYVelocity BMI loc_BANK0_8A72 CMP #$39 BCS locret_BANK0_8A86 loc_BANK0_8A72: …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/defs.asm#L270-L274; enum PlayerHealthValues PlayerHealth_1_HP = $0F PlayerHealth_2_HP = $1F PlayerHealth_3_HP = $2F PlayerHealth_4_HP = $3FChecked by claude, 2026-10-26 — read DamagePlayer to its end, both branches, and HandlePlayerState_Dying; and the timer loop in the frame routine; DamageInvulnTime is PlayerStateTimer+3; the speed was just zeroed, so the BPL always keeps $C0. The health values are defs.asm's PlayerHealthValues, which the life-meter table (prg-e-f.asm L3321-L3324) and the level start's LDA

Cited by: Super Mario Bros. 2

Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, empty-handed Toad's jumps leave the ground at -4.875 standing, -5.1875 running, and -6.5 px/frame charged, and fall under Mario's gravity, 0.25 px/frame a frame with A held and 0.4375 without: ToadStats' $B2, $AD, and $98, and $04 and $07. With an item, see carry-stats. smb2/toad-stats

About: Super Mario Bros. 2 Jump

Value
{
 "still": -78,
 "running": -83,
 "charged": -104,
 "gravity": 7,
 "gravityHeld": 4
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L296-L318ToadStats: … .db $B2 ; Jump Speed, still - no object … .db $98 ; Jump Speed, charged - no object … .db $AD ; Jump Speed, running - no object … .db $07 ; Gravity without Jump button pressed .db $04 ; Gravity with Jump button pressedChecked by claude, 2026-10-26 — read ToadStats; the probe measures as for mario-statsProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Super Mario Bros. 2

Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, the empty-handed Princess's jumps leave the ground at -4.8125 standing, -5.25 running, and -6.5 px/frame charged, and fall under Mario's gravity, 0.25 px/frame a frame with A held and 0.4375 without, apart from her float (float): PrincessStats' $B3, $AC, and $98, and $04 and $07. With an item, see carry-stats. smb2/princess-stats

About: Super Mario Bros. 2 Jump

Value
{
 "still": -77,
 "running": -84,
 "charged": -104,
 "gravity": 7,
 "gravityHeld": 4
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L346-L368PrincessStats: … .db $B3 ; Jump Speed, still - no object … .db $98 ; Jump Speed, charged - no object … .db $AC ; Jump Speed, running - no object … .db $07 ; Gravity without Jump button pressed .db $04 ; Gravity with Jump button pressedChecked by claude, 2026-10-26 — read PrincessStats; the probe measures as for mario-stats, with her float in place of the rise under the lighter gravityProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Super Mario Bros. 2

Each character's stats table holds a second take-off for each kind of jump, used while carrying something. Standing, charged, and running, they are: Mario $B0, $98, $AA; Luigi $D6, $C9, $D4; Toad $B2, $98, $AD; the Princess $B3, $98, $B3. Against the empty-handed ones (mario-stats and the rest), an item lowers only the running jump: Mario's and Luigi's by $04, and the Princess's to her standing one; Toad's are unchanged. The same tables hold the ground caps, $18 empty-handed for all four, and carrying $18, $16, $1D, and $15 (carry-speed). smb2/carry-stats

About: Super Mario Bros. 2 Held item

CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L271-L290MarioStats: … .db $B0 ; Jump Speed, still - with object … .db $98 ; Jump Speed, charged - with object … .db $AA ; Jump Speed, running - with object … .db $18 ; Running Speed, right - no object .db $18 ; Running Speed, right - with objectSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L321-L343LuigiStats: … .db $D6 ; Jump Speed, still - with object … .db $C9 ; Jump Speed, charged - with object … .db $D4 ; Jump Speed, running - with object … .db $18 ; Running Speed, right - no object .db $16 ; Running Speed, right - with objectSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L296-L318ToadStats: … .db $B2 ; Jump Speed, still - with object … .db $98 ; Jump Speed, charged - with object … .db $AD ; Jump Speed, running - with object … .db $18 ; Running Speed, right - no object .db $1D ; Running Speed, right - with objectSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L346-L368PrincessStats: … .db $B3 ; Jump Speed, still - with object … .db $98 ; Jump Speed, charged - with object … .db $B3 ; Jump Speed, running - with object … .db $18 ; Running Speed, right - no object .db $15 ; Running Speed, right - with objectChecked by claude, 2026-10-26 — read the four stats tables' rows with an object and their right-hand ground caps; jump-start picks the row with an object while one is held. Not measured: the movement probe jumps and runs empty-handed

Split from the four measured stats claims in the audit (2026-10-26), which keep only what the probe measured.

On ordinary ground, holding right adds $02 to the speed each frame, so a character reaches walking speed, $18 (1.5 px/frame), 12 frames from a standstill; with neither direction held the ground takes $03 a frame off the speed, to zero. Measured in Mesen (MesenCE 2.2.1) from power-on, on the floor at the bottom of 1-1's first area, each character reaches 1.5 px/frame in 12 frames from a standstill; letting go of everything at 2.25 px/frame drops the speed to the 1.5 cap at once, and friction stops the character 8 frames later. smb2/ground-speed

About: Super Mario Bros. 2 Running

Value
{
 "accel": 2,
 "friction": 3,
 "toWalk": 12,
 "stop": 8
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2424-L2426PlayerControlAcceleration: .db $FE .db $02Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2498-L2519LDA Player1JoypadHeld AND #ControllerInput_Right | ControllerInput_Left BEQ loc_BANK0_8C92 AND #$01 STA PlayerDirection TAY LDA GroundSlipperiness LSR A LSR A AND byte_RAM_10 BNE ResetCrouchJumpTimer LDA PlayerXVelocity …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2668-L2697PlayerXDeceleration: .db $FD .db $03 ; =============== S U B R O U T I N E ======================================= sub_BANK0_8D2C: LDA PlayerInAir BNE locret_BANK0_8D61 LDA byte_RAM_10 AND GroundSlipperiness BNE loc_BANK0_8D4D LDA PlayerXVelocity AND #$80 …Checked by claude, 2026-10-26 — read sub_BANK0_8C1A's left and right branch (skipped when the frame counter ANDed with GroundSlipperiness >> 2 is nonzero) and sub_BANK0_8D2C, called only when neither is held (or while ducking), which returns at once in the air and is skipped when the frame counter ANDed with GroundSlipperiness is nonzero; PlayerTileCollision zeroes GroundSlipperiness and sets $0F on an ice tile. The probe holds Right for 20 frames from a standstill, and lets go after 16 frames with BProbe: probes/super-mario-bros-2/movement.mjs

Cited by: Super Mario Bros. 2

Left and right push at the same $02 a frame in the air, and with neither held the air keeps the speed. Any push resets a crouch jump's charge (crouch-charge). Crouched on the ground, left and right do nothing, and the ground's friction slows the player. On ice the push comes on one frame in four and the friction on one in sixteen. smb2/ground-control

About: Super Mario Bros. 2 Running

CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2461-L2495loc_BANK0_8C3D: LDA PlayerRidingCarpet BNE loc_BANK0_8C92 … LDA PlayerInAir ; skip ahead if player is in air BNE ResetPartialCrouchJumpTimer LDA CrouchJumpTimer ; check if crouch jump is charged CMP #$3C BCS loc_BANK0_8C92 INC CrouchJumpTimer ; increment crouch jump charge BNE loc_BANK0_8C92Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2498-L2522LDA Player1JoypadHeld AND #ControllerInput_Right | ControllerInput_Left BEQ loc_BANK0_8C92 AND #$01 STA PlayerDirection TAY LDA GroundSlipperiness LSR A LSR A AND byte_RAM_10 BNE ResetCrouchJumpTimer LDA PlayerXVelocity …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2668-L2697PlayerXDeceleration: .db $FD .db $03 ; =============== S U B R O U T I N E ======================================= sub_BANK0_8D2C: LDA PlayerInAir BNE locret_BANK0_8D61 LDA byte_RAM_10 AND GroundSlipperiness BNE loc_BANK0_8D4DSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L3210-L3213BCC PlayerTileCollision_CheckJar LDA #$0F STA GroundSlipperinessChecked by claude, 2026-10-26 — read sub_BANK0_8C1A: on the ground with Down held it counts the charge and branches to loc_BANK0_8C92, the friction call, past the push; in the air it reaches the push at loc_BANK0_8C6F. sub_BANK0_8D2C returns at once in the air. The push is skipped when the frame counter ANDed with GroundSlipperiness >> 2 ($03 on ice) is nonzero, the friction when the counter ANDed with GroundSlipperiness ($0F) is. Not probed

What the player carries sets the ground cap: an enemy, a mushroom block, or a POW block uses the character's carrying speed (Mario $18, Luigi $16, Toad $1D, the Princess $15), and anything else (vegetables, shells, coins, bombs, rockets, keys, potions) the empty-handed $18. Sunk 4 pixels or more into quicksand, every character's cap is $04. B raises each by half (run-cap). smb2/carry-speed

About: Super Mario Bros. 2 Held item

Value
{
 "mario": 24,
 "luigi": 22,
 "toad": 29,
 "princess": 21,
 "quicksand": 4
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2823-L2850; Determine the max speed based on the terrain and what the player is carrying. sub_BANK0_8DC0: LDY #$02 LDA QuicksandDepth CMP #$02 BCS loc_BANK0_8DE0 DEY LDA HoldingItem BEQ loc_BANK0_8DDF LDX ObjectBeingCarriedIndex LDA ObjectType, X CMP #Enemy_VegetableSmall …Super Mario Bros. 2 instruction booklet (North America) · Know what each character can do, RunningThey all run at the same speed, but if they are carrying something, the order from the slowest to quickest is; Princess Toadstool, Luigi, Mario, Toad.Checked by claude, 2026-10-26 — read sub_BANK0_8DC0: index 2 when QuicksandDepth is 2 or more; else index 1 when holding an object of type below Enemy_VegetableSmall ($32, the enemies) or from Enemy_MushroomBlock ($39) to below Enemy_FallingLogs ($3B); else index 0. The index picks RunSpeedRight and RunSpeedLeft, the character's stats (smb2/mario-stats and the rest) copied to RAM

The manual's order is the carrying speeds' order; Mario's is the same as his empty-handed one, and Toad's is faster.

Cited by: Super Mario Bros. 2

Pulling something up, from the ground or off an enemy's or a block's top, holds a first pose for 6 frames, then steps through six more poses whose waits are the character's pick-up speeds, read from last to first: Mario's and Luigi's 7, 4, 1, 2, 4, 0, Toad's 2, 1, 1, 1, 1, 0, and the Princess's 12, 6, 2, 4, 6, 0, a wait of 0 lasting one frame. A small vegetable or dug sand takes Toad's waits whoever pulls it. Measured in Mesen (MesenCE 2.2.1) from power-on, pulling the large vegetable on the ledge in 1-1's first area, Mario and Luigi lift for 25 frames, Toad for 13, and the Princess for 37. smb2/pluck

About: Super Mario Bros. 2 Held item

Value
{
 "frames": {
  "mario": 25,
  "luigi": 25,
  "toad": 13,
  "princess": 37
 }
}
VerifiedSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L3627-L3636LDA #$07 STA ObjectBeingCarriedTimer, X STX ObjectBeingCarriedIndex LDA #PlayerState_Lifting STA PlayerState LDA #$06 STA PlayerStateTimer LDA #SpriteAnimation_Pulling STA PlayerAnimationFrame INC HoldingItemSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L11101-L11103LDA #$07 STA ObjectBeingCarriedTimer, X JSR SetPlayerStateLiftingSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2036-L2071HandlePlayerState_Lifting: LDA PlayerStateTimer BNE locret_BANK0_8AC1 LDX ObjectBeingCarriedIndex LDY ObjectBeingCarriedTimer, X CPY #$02 BCC loc_BANK0_8ABB CPY #$07 BNE loc_BANK0_8A9D LDA #DPCM_ItemPull STA DPCMQueue loc_BANK0_8A9D: …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2091-L2105PlayerLiftTimer: .db $00 .db $01 .db $01 .db $01 PlayerLiftFrames: .db $01 .db $02 .db $04 .db $04 .db $04 .db $04 …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L271-L277MarioStats: .db $00 ; Pick-up Speed, frame 1/6 - pulling .db $04 ; Pick-up Speed, frame 2/6 - pulling .db $02 ; Pick-up Speed, frame 3/6 - ducking .db $01 ; Pick-up Speed, frame 4/6 - ducking .db $04 ; Pick-up Speed, frame 5/6 - ducking .db $07 ; Pick-up Speed, frame 6/6 - duckingChecked by claude, 2026-10-26 — read the lift start for a tuft (TileBehavior_CheckPickUp's path) and for an enemy (B pressed while standing on it, not holding or ducking), both PlayerStateTimer 6 and a carried timer of 7, and HandlePlayerState_Lifting, which on each frame the state timer is 0 reads the carried timer Y (7 down to 2), decrements it, and sets the next wait from PickupSpeedAnimation-2,Y, or, for EnemyState_Sand or Enemy_VegetableSmall, PlayerLiftTimer-2,Y, which runs four bytes and then into PlayerLiftFrames' $01 and $02; below 2 the state ends. The probe counts the frames in PlayerState 2 after BProbe: probes/super-mario-bros-2/movement.mjs

The disassembly's comments number the pick-up speeds from the first byte, but the code reads them from the sixth. The two pulling poses ($08) take the last two bytes' waits.

Cited by: Super Mario Bros. 2

B throws what the player carries, unless it is sand from digging. A bomb, rocket, mushroom block, POW block, key, or potion needs room in the tile ahead; enemies, vegetables, shells, and coins fly at once. Those fly forward at $30 (3 px/frame), rising at $08 (0.5 px/frame) if the player was moving at $08 or more and falling at $18 if not. The others fly forward at $30 level if the player was moving, and if standing are set down 16 px ahead, falling at $18. smb2/throw

About: Super Mario Bros. 2 Held item

Value
{
 "speed": 48,
 "rise": -8,
 "drop": 24,
 "moving": 8,
 "setDown": 16
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2880-L2925; Check to see if we have an item that we want to throw. loc_BANK0_8E05: BIT Player1JoypadPress BVC locret_BANK0_8E41 LDA HoldingItem BEQ locret_BANK0_8E41 LDY #$00 LDX ObjectBeingCarriedIndex LDA EnemyState, X CMP #EnemyState_Sand BEQ locret_BANK0_8E41 LDA ObjectType, X …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2942-L2985STA byte_RAM_1 LDX ObjectBeingCarriedIndex LDA #Enemy_Coin CMP ObjectType, X ROL byte_RAM_1 LDA PlayerXVelocity BPL loc_BANK0_8E6F EOR #$FF CLC ADC #$01 loc_BANK0_8E6F: CMP #$08 …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2800-L2819ThrowXVelocity: .db $00 ; standing, left (blocks) .db $00 ; standing, right (blocks) .db $D0 ; moving, left (blocks) .db $30 ; moving, right (blocks) .db $D0 ; standing, left (projectiles) .db $30 ; standing, right (projectiles) .db $D0 ; moving, left (projectiles) .db $30 ; moving, right (projectiles) ThrowYVelocity: .db $18 ; standing (blocks) .db $00 ; moving (blocks) …Checked by claude, 2026-10-26 — read the throw: types below Enemy_Bomb ($37) skip the tile check, Enemy_MushroomBlock checks with collision type 0, and Bomb, Rocket, and $3A and up with type 2; byte_RAM_1 is 2 for types up to Enemy_Coin ($36) plus 1 for a speed of $08 or more either way, and indexes ThrowYVelocity, and doubled with PlayerDirection, ThrowXVelocity; only index 0 moves the object by SoftThrowOffset. Object speeds are 4.4 fixed point, as the player's (ApplyObjectPhysicsX)

Cited by: Super Mario Bros. 2

Holding Down on the ground charges the crouch jump for 60 frames, except on a flying carpet or in quicksand. Crouched on the ground, left and right do nothing; in the air, with Down held, they still steer. Let go of Down before then and the charge is lost; let go after and it is kept until left or right is pressed or the player jumps. smb2/crouch-charge

About: Super Mario Bros. 2 Jump

Value
{
 "frames": 60
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2461-L2495loc_BANK0_8C3D: LDA PlayerRidingCarpet BNE loc_BANK0_8C92 LDA QuicksandDepth BNE ResetPartialCrouchJumpTimer LDA Player1JoypadHeld ; skip if down button is not pressed AND #ControllerInput_Down BEQ ResetPartialCrouchJumpTimer INC PlayerDucking ; set ducking state? IFDEF PLAYER_HITBOX LDA PlayerDucking STA PlayerHitbox …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2516-L2519ResetCrouchJumpTimer: LDA #$00 STA CrouchJumpTimer BEQ loc_BANK0_8C95 ; unconditional branch?Checked by claude, 2026-10-26 — read sub_BANK0_8C1A: with Down held it sets ducking and, on the ground, counts CrouchJumpTimer to $3C and skips the left and right branch; in the air (PlayerInAir) it falls through ResetPartialCrouchJumpTimer to the left and right branch at loc_BANK0_8C6F; without Down a timer under $3C is zeroed and a full one kept, and the left and right branch zeroes it; PlayerStartJump zeroes it after a jump (smb2/jump-start)

Cited by: Super Mario Bros. 2

Standing in quicksand sinks the player at $01 a frame, or $08 in the fast kind, and sinking 12 pixels into the next row of tiles kills them. Sunk 4 pixels or more, they jump at $E0 (2 px/frame), fall under gravity $08, run no faster than $04 (carry-speed), and can't charge a crouch jump. smb2/quicksand

Value
{
 "slow": 1,
 "fast": 8,
 "jump": -32,
 "gravity": 8,
 "cap": 4
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L7691-L7698PlayerTileCollision_CheckQuicksand: LDA #$01 LDY byte_RAM_0 CPY #BackgroundTile_QuicksandSlow BEQ PlayerTileCollision_QuicksandSlow CPY #BackgroundTile_QuicksandFast BEQ PlayerTileCollision_QuicksandFastSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L7721-L7763PlayerTileCollision_QuicksandFast: LDA #$08 PlayerTileCollision_QuicksandSlow: STA PlayerYVelocity LDA QuicksandDepth BNE loc_BANK1_BA9B LDA PlayerYLo AND #$10 STA byte_RAM_4EB loc_BANK1_BA9B: ; check if player is too far under LDA PlayerYLo …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2543-L2550LDA QuicksandDepth CMP #$02 BCC PlayerStartJump_LoadXVelocity ; Quicksand LDA JumpHeightQuicksand STA PlayerYVelocity BNE PlayerStartJump_ExitSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2607-L2612LDA QuicksandDepth CMP #$02 BCC loc_BANK0_8CE5 LDA GravityQuicksand BNE loc_BANK0_8D13Checked by claude, 2026-10-26 — read PlayerTileCollision_CheckQuicksand (the retail build, without ENABLE_TILE_ATTRIBUTES_TABLE): it sets the Y speed each frame on a quicksand tile, remembers bit 4 of the Y position on entry, kills once that bit has changed and the low nibble is $0C or more, and returns the depth (the low nibble, or 1 below 4, or 4 once a row is crossed) that PlayerStartJump, PlayerGravity, and sub_BANK0_8DC0 test against 2 and the crouch routine against 0; all four characters' stats hold $E0 and $08

Cited by: Super Mario Bros. 2

On a vine, chain, or ladder the player climbs up at $F0 (1 px/frame), down at $20 (2 px/frame), and sideways at 1 px/frame. Holding up and down together reads past the end of the table, the byte $A5, and sends the player up at 5.6875 px/frame. Holding left and right together reads past the end of the sideways table too, again a byte $A5, the first of HandlePlayerState_Climbing, and sets the sideways speed to 5.6875 px/frame to the left. smb2/climbing

About: Super Mario Bros. 2 Climbing

Value
{
 "up": -16,
 "down": 32,
 "side": 16,
 "zip": -91,
 "sideZip": -91
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L2107-L2131byte_BANK0_8ACE: .db $00 .db $10 .db $F0 ; --------------------------------------------------------------------------- HandlePlayerState_Climbing: LDA Player1JoypadHeld AND #ControllerInput_Down | ControllerInput_Up LSR A LSR A TAY CPY #$02 …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L3328-L3336ClimbSpeed: .db $00 ClimbSpeedDown: .db $20 ClimbSpeedUp: .db $F0 ; Bug: The climb speed index is determined by checking the up/down flags in ; Player1JoypadHeld. If both are enabled, the index it out of bounds and uses ; the LDA ($A5) below, which zips the player up the vine!Super Mario Bros. 2 (USA) · 0x1f235-0x1f238 — ClimbSpeed's three bytes at $F225, and the next routine's first, $A5Super Mario Bros. 2 (USA) · 0xade-0xae1 — byte_BANK0_8ACE's three bytes at $8ACE, and HandlePlayerState_Climbing's first, $A5 (LDA Player1JoypadHeld)Checked by claude, 2026-10-26 — read HandlePlayerState_Climbing: the index is Player1JoypadHeld's up and down bits shifted right twice (none 0, down 1, up 2, both 3), and the sideways table byte_BANK0_8ACE is indexed by the right and left bits (1 right, 2 left, both 3); FIX_CLIMB_ZIP is off in the retail build, and the ROM's byte after each table is $A5

Cited by: Super Mario Bros. 2

Every eighth enemy defeated, counted as it falls off the screen, comes back as a heart 96 px above where it left; stray bullets and bosses don't count, and the count carries over deaths until the level ends. A heart adds one mark, up to the meter's length. smb2/hearts

About: Super Mario Bros. 2 Healing item

Value
{
 "every": 8,
 "rise": 96
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L1023-L1027LDA EnemyState, X BNE MakeEnemyFlipUpsideDown LDA EnemyArray_SpawnsDoor, X BEQ EnemyDeathMaybeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L1058-L1083EnemyDeathMaybe: LDA ObjectType, X CMP #Enemy_Bullet ; "Stray bullet" enemy type BEQ MakeEnemyFlipUpsideDown INC EnemiesKilledForHeart LDY EnemiesKilledForHeart CPY #$08 ; number of enemies to kill before a heart appears BCC MakeEnemyFlipUpsideDown LDA #$00 ; reset enemy kill counter for heart counter STA EnemiesKilledForHeart LDA #EnemyState_Alive ; convert dead enemy to living heart STA EnemyState, X …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L10942-L10958; check if it's a heart LDA ObjectType, Y BNE CheckCollisionWithPlayer_NotHeart ; accept the heart into your life STA EnemyState, Y LDA #SoundEffect1_CherryGet STA SoundEffectQueue1 LDY PlayerMaxHealth LDA PlayerHealth CLC ADC #$10 STA PlayerHealth …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L1348-L1358ResetAreaAndProcessGameMode_NotTitleCard: LDA #PlayerHealth_2_HP STA PlayerHealth LDA #$00 STA PlayerMaxHealth STA KeyUsed STA Mushroom1upPulled STA Mushroom1Pulled STA Mushroom2Pulled STA SubspaceVisits STA EnemiesKilledForHeartChecked by claude, 2026-10-26 — read HandleEnemyState_Dead (a dead enemy whose state HandleEnemyScreenBounds has cleared, and that doesn't spawn the boss door, reaches EnemyDeathMaybe), EnemyDeathMaybe, and the heart in CheckCollisionWithPlayer, which adds $10 and refills to the table value when the sum reaches it; EnemiesKilledForHeart is cleared only in ResetAreaAndProcessGameMode_NotTitleCard

Cited by: Super Mario Bros. 2

A level has up to two Subspace mushrooms, each adding a mark to the life meter and refilling it. One taken stays taken, and the extra marks stay, through deaths until the level ends, a game over, or a warp, which set PlayerHealth to PlayerHealth_2_HP and PlayerMaxHealth to 0: a meter of two marks, both full. smb2/mushrooms

About: Super Mario Bros. 2 Health upgrade

Value
{
 "perLevel": 2
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-6-7.asm#L3747-L3762CMP #BackgroundTile_SubspaceMushroom1 BEQ DoSubspaceTileRemap_CheckCreateMushroom CMP #BackgroundTile_SubspaceMushroom2 BEQ DoSubspaceTileRemap_CheckCreateMushroom JMP DoSubspaceTileRemap_Exit DoSubspaceTileRemap_CheckCreateMushroom: SEC SBC #BackgroundTile_SubspaceMushroom1 TAY LDA Mushroom1Pulled, Y BNE DoSubspaceTileRemap_AfterCreateMushroomSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L3402-L3407EnemyBehavior_PickUpMushroom: LDX EnemyVariable INC Mushroom1Pulled, X LDX byte_RAM_12 INC PlayerMaxHealth JSR RestorePlayerToFullHealthSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L1348-L1357ResetAreaAndProcessGameMode_NotTitleCard: LDA #PlayerHealth_2_HP STA PlayerHealth LDA #$00 STA PlayerMaxHealth STA KeyUsed STA Mushroom1upPulled STA Mushroom1Pulled STA Mushroom2Pulled STA SubspaceVisitsChecked by claude, 2026-10-26 — read DoSubspaceTileRemap (a mushroom tile makes the mushroom only if its Mushroom1Pulled entry is 0), the pick-up, and ResetAreaAndProcessGameMode, which clears both entries and PlayerMaxHealth for the bonus chance, game over, and warp modes but not after a death's title card; the respawn after a death calls RestorePlayerToFullHealth

Cited by: Super Mario Bros. 2

A thrown potion that lands makes a door in a puff of smoke, except in a vertical area, where only the smoke is left. Through the door, Subspace lasts 96 ticks of four frames, about 384 frames, and ends early if the player dies. Its grass gives coins on the level's first two visits that pull a coin, and small vegetables after. smb2/subspace

About: Super Mario Bros. 2 Area transition

Value
{
 "ticks": 96,
 "frames": 384,
 "coinVisits": 2
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L3553-L3593EnemyBehavior_SubspacePotion_CheckGroundCollision: PLA AND #CollisionFlags_Down BEQ EnemyBehavior_Vegetable JSR ResetObjectYVelocity LDA ObjectYLo, X SEC SBC #$10 STA ObjectYLo, X LDA ObjectXLo, X ADC #$07 AND #$F0 …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L4859-L4860LDA #$60 STA SubspaceTimerSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-2-3.asm#L4831-L4846LDY SubspaceTimer BEQ loc_BANK2_9741 LDA byte_RAM_10 AND #$03 BNE loc_BANK2_9741 LDY PlayerState CPY #PlayerState_Dying BEQ loc_BANK2_9741 DEC SubspaceTimer BNE loc_BANK2_9741 STA InSubspaceOrJar JSR DoAreaResetSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L5676-L5683LDA InSubspaceOrJar BEQ HandlePlayerState_Respawning_Regular HandlePlayerState_Respawning_Subspace: ; Exit subspace immediately LDA #$00 STA InSubspaceOrJar STA SubspaceTimerSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L3811-L3828LDX InSubspaceOrJar CPX #$02 BNE loc_BANK0_91E3 LDA SubspaceVisits CMP #$02 BCS loc_BANK0_91E2 ; skip if we've already visited Subspace twice INC SubspaceCoins LDX #$00 loc_BANK0_91E2: TXA loc_BANK0_91E3: CLC …Checked by claude, 2026-10-26 — read EnemyBehavior_SubspacePotion, the Subspace entry that sets SubspaceTimer to $60, the Subspace door's countdown (every frame the counter's low two bits are 0, not while dying; at 0 it leaves Subspace), the respawn's early exit, and the grass pick-up in Subspace; SubspaceCoins is cleared on entering a subarea and SubspaceVisits rises on leaving with coins pulled, and clears with the level (super-mario-bros-2-ddp/subspace-coins)

The countdown's first tick falls 1 to 4 frames after entry, by the frame counter, so the stay is 381 to 384 frames.

Cited by: Super Mario Bros. 2

The fifth large vegetable pulled since the level began or the player last died is a stopwatch, and the count starts over. smb2/stopwatch

Value
{
 "every": 5
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-0-1.asm#L3604-L3617CMP #Enemy_VegetableLarge BNE loc_BANK0_90EA LDY BigVeggiesPulled INY CPY #$05 BCC loc_BANK0_90E7 LDA #Enemy_Stopwatch STA ObjectType, X LDY #$00 loc_BANK0_90E7: STY BigVeggiesPulledSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L1314-L1318ShowCardAfterTransition: LDA #GameMode_InGame STA GameMode STA StarInvincibilityTimer STA BigVeggiesPulledSuper Mario Bros. 2 instruction booklet (North America) · Really useful items, Time StopIf you have already taken four and you take a fifth one, a stopwatch will appear.Checked by claude, 2026-10-26 — read the large-vegetable check in the pull (BigVeggiesPulled plus one, a stopwatch at 5) and ResetAreaAndProcessGameMode, which zeroes BigVeggiesPulled for every mode, the title card after a death included, but not on a door or jar transition

Cited by: Super Mario Bros. 2

The Bonus Chance after a level spins three reels of eight positions, one coin a spin. Each position holds one of four symbols: a Snifit, a turnip, a star, or a cherry. Each reel steps every 4 frames, and A stops the leftmost still spinning. A cherry on the first reel wins a life, cherries on the first two win two, three cherries five, and three of another symbol one; lives stop at 255. Each reel holds one cherry. smb2/slot-machine

About: Super Mario Bros. 2 Bonus stage

Value
{
 "reels": 3,
 "symbols": 8,
 "step": 4,
 "oneCherry": 1,
 "twoCherries": 2,
 "threeCherries": 5,
 "threeOther": 1
}
CodeSuper Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/defs.asm#L248-L251Slot_Cherry = $00 Slot_Star = $08 Slot_Turnip = $10 Slot_Snifit = $18Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L1652-L1665StartSlotMachine: DEC SlotMachineCoins JSR WaitForNMI JSR sub_BANKF_EA68 LDA #$01 ; Set all reel timers STA ObjectXLo STA ObjectXLo + 1 STA ObjectXLo + 2 LSR A ; Set all reels to the first position STA ObjectXLo + 6 STA ObjectXLo + 7 STA ObjectXLo + 8Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L1693-L1732LDY #$00 LDX ObjectXLo + 6 ; Load reel 1 LDA SlotMachineReelOrder1RAM, X BNE CheckReel2Symbol ; Is this reel a cherry? INY ; Yes; add one life CheckReel2Symbol: LDX ObjectXLo + 7 ; Load reel 2 CMP SlotMachineReelOrder2RAM, X BNE AddSlotMachineExtraLives ; Does this match the previous symbol? CMP #$00 ; Yes; are they both cherries? BNE CheckReel3Symbol ; If no, skip to third reel INY ; They are both cherries, add another life or something …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-e-f.asm#L2114-L2160sub_BANKF_EAC2: LDA Player1JoypadPress BPL locret_BANKF_EAD1 LDX #$00 loc_BANKF_EAC8: LDA ObjectXLo, X BNE loc_BANKF_EAD2 INX CPX #$03 BCC loc_BANKF_EAC8 locret_BANKF_EAD1: RTS …Super Mario Bros. 2, Discombobulated: a disassembly for asm6f (Xkeeper0/smb2) · src/prg-a-b.asm#L580-L607BonusChanceReel1Order: .db Slot_Snifit ; $00 .db Slot_Turnip ; $01 ; Graphics exist for a mushroom (not used) .db Slot_Star ; $02 .db Slot_Turnip ; $03 .db Slot_Snifit ; $04 .db Slot_Star ; $05 .db Slot_Cherry ; $06 .db Slot_Turnip ; $07 BonusChanceReel2Order: .db Slot_Star ; $00 .db Slot_Snifit ; $01 …Super Mario Bros. 2 instruction booklet (North America) · A Bonus Chance at the end of an AreaYou get 1 play for each coin you have collected from the last.Checked by claude, 2026-10-26 — read StartSlotMachine (a coin taken, reel timers set to 1, positions to 0), the payout after all three stop, sub_BANKF_EAC2 (A clears the first nonzero reel flag), sub_BANKF_EADC (each spinning reel's step timer reloads with 4 and the position counts down, wrapping 0 to 7), and the three reel tables, one Slot_Cherry ($00) in each

Cited by: Super Mario Bros. 2