data/claims/smb2.yamlSuper 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 commitPlayerStartJump 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
}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 LDACited 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
}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.mjsCited 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
}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.mjsCited 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
}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 fallCited 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
]
}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.mjsCited 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
}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.mjsCited 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 nothingHealth 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
}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 LDACited 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
}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.mjsCited 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
}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.mjsCited 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-handedSplit 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
}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.mjsCited 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 probedWhat 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
}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 RAMThe 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
}
}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.mjsThe 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
}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
}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
}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 $08Cited 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
}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 $A5Cited 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
}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_NotTitleCardCited 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
}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 RestorePlayerToFullHealthCited 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
}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
}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 transitionCited 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
}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 eachCited by: Super Mario Bros. 2