data/claims/smb1.yamlSuper Mario Bros. (doppelganger's SMBDIS via Xkeeper0/smb1)
Game: Super Mario Bros..
A jump starts only on the frame A goes down while Mario is grounded; InitJS zeroes the vertical subpixel and sets the jumping state. smb1/jump-start
About: Super Mario Bros. Jump
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4913-L4923LDA A_B_Buttons ; check for A button press
…
AND PreviousA_B_Buttons ; if button not pressed in previous frame, branch
…
LDA Player_State ; check player state
BEQ InitJS ; if on the ground, branchsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4931-L4942STY Player_YMF_Dummy
…
LDA #$01 ; set player state to jumping/swimmingsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4139-L4141STA PreviousA_B_Buttons ; into temp variable to be used on next frameChecked by claude, 2026-10-20 — read CheckForJumping/ProcJumping/InitJS and SaveAB at the pinned commitCited by: Super Mario Bros., Variable jump height
InitJS picks one of five jump rows by take-off horizontal speed, stepping up at $09, $10, $19, and $1C. smb1/jump-row-thresholds
About: Super Mario Bros. Jump
Value
[ 9, 16, 25, 28 ]
src/prg.asm#L4943-L4955LDA Player_XSpeedAbsolute ; check value related to walking/running speed
CMP #$09
…
CMP #$10
…
CMP #$19
…
CMP #$1c
BCC ChkWtr ; note that for jumping, range is 0-4 for YA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICS, Mario table — the chart's speed bandsLess than 01000 | 01000 – 024FF | 02500 or greaterChecked by claude, 2026-10-20 — read InitJS at the pinned commitDisputed: Jdaster64's chart groups the speeds as below 1 px/frame, 1 to 2.3125 px/frame ("02500" in its notation) and above. The code moves to the fast rows at $19 (1.5625 px/frame), just above the walking top speed $18, so the code's boundary is used here.
Rows 0 and 1 hold identical values in every table, as do rows 3 and 4, so there are three distinct jumps. Horizontal speed is 4.4 fixed point (see x-speed-format).
Cited by: Super Mario Bros., Variable jump height
Horizontal speeds are 4.4 fixed point, whole pixels and sixteenths per frame; MoveObjectHorizontally shifts the sixteenths into the subpixel byte. smb1/x-speed-format
About: Super Mario Bros. Running
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L6492-L6503ASL ; and move low nybble to high
…
LSR ; move high nybble to lowChecked by claude, 2026-10-20 — read MoveObjectHorizontally at the pinned commitCited by: Subpixel
Mario's top ground speed is $18 walking and $28 running (B held). smb1/walk-run-max-speed
About: Super Mario Bros. Running
Value
{
"run": 40,
"walk": 24
}src/prg.asm#L4873-L4874MaxRightXSpdData:
.db $28, $18, $10smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L5000-L5014AND #B_Button
BNE SetRTmr ; if pressed, skip ahead to set timer
…
INY ; if running timer not set or level type is water,A Complete Guide to SMB's Physics Engine · SMB PHYSICS 101 / GROUND PHYSICS, Mario tableMaximum walk speed (normal, castle cutscene) 01900 | Maximum running speed 02900Checked by claude, 2026-10-20 — read X_Physics and the max-speed table at the pinned commitDisputed: Jdaster64's chart gives 01900 and 02900 (1.5625 and 2.5625 px/frame), one sixteenth above the code's caps. The ledger follows the code.
So a walking jump uses row 2 and a full-speed running jump row 4.
Cited by: Super Mario Bros., Variable jump height
PlayerYSpdData starts a jump at −4 px/frame (rows 0–2) or −5 px/frame (rows 3–4). smb1/jump-y-speed
About: Super Mario Bros. Jump
Value
[ -4, -4, -4, -5, -5 ]
src/prg.asm#L4864-L4865PlayerYSpdData:
.db $fc, $fc, $fc, $fb, $fb, $fe, $ffsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4972-L4973LDA PlayerYSpdData,y
STA Player_Y_SpeedA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICS, Mario table, Initial Velocity (−Y)04000 | 04000 | 05000Checked by claude, 2026-10-20 — read the table and GetYPhy at the pinned commitNative units are px/frame already. Negative is up. Rows 5–6 are swimming.
Cited by: Variable jump height
InitMForceData gives jump rows 0–4 a zero speed fraction, so take-off is exactly −4.00 or −5.00 px/frame. smb1/jump-init-moveforce
About: Super Mario Bros. Jump
Value
[ 0, 0, 0, 0, 0 ]
src/prg.asm#L4867-L4868InitMForceData:
.db $00, $00, $00, $00, $00, $80, $00smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4970-L4971LDA InitMForceData,y
STA Player_Y_MoveForceChecked by claude, 2026-10-20 — read the table and GetYPhy at the pinned commitCited by: Variable jump height
While a jump rises with A held, gravity is JumpMForceData's $20, $20, $1E, $28, $28 subpixels/frame² for rows 0–4. smb1/jump-gravity-held
About: Super Mario Bros. Variable jump height
Value
[ 32, 32, 30, 40, 40 ]
src/prg.asm#L4858-L4859JumpMForceData:
.db $20, $20, $1e, $28, $28, $0d, $04smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4966-L4967LDA JumpMForceData,y ; store appropriate jump/swim
STA VerticalForce ; data hereA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICS, Mario table, Holding “A” Gravity (+Y)00200 | 001E0 | 00280Checked by claude, 2026-10-20 — read the table and GetYPhy at the pinned commitIn px/frame² (exact) 0.125, 0.125, 0.1171875, 0.15625, 0.15625.
Cited by: Variable jump height
After the switch, gravity is FallMForceData's $70, $70, $60, $90, $90 subpixels/frame² for rows 0–4. smb1/jump-gravity-fall
About: Super Mario Bros. Variable jump height
Value
[ 112, 112, 96, 144, 144 ]
src/prg.asm#L4861-L4862FallMForceData:
.db $70, $70, $60, $90, $90, $0a, $09smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4968-L4969LDA FallMForceData,y
STA VerticalForceDownA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICS, Mario table, Falling Gravity (+Y)00700 | 00600 | 00900Checked by claude, 2026-10-20 — read the table and GetYPhy at the pinned commitIn px/frame² (exact) 0.4375, 0.4375, 0.375, 0.5625, 0.5625, about 3.5 times the held value.
Cited by: Variable jump height
In rows 0–1, the standing and slow jumps, held gravity is $20/256 = 0.125 px/frame². smb1/standing-gravity-held
About: Super Mario Bros. Variable jump height
Value: 0.125 px/frame²
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4858-L4859JumpMForceData:
.db $20, $20, $1e, $28, $28, $0d, $04smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L6681-L6687LDA SprObject_Y_MoveForce,x
CLC
ADC $00 ; add downward movement amount to contents of $0433
STA SprObject_Y_MoveForce,x
LDA SprObject_Y_Speed,x ; add carry to vertical speed and store
ADC #$00Checked by claude, 2026-10-20 — read JumpMForceData (L4858-L4859) and ImposeGravity (L6681-L6687) at the pinned commit; the force adds to the speed's fraction byte and carries into the pixel byte, so $20 is 32/256 px/frame² per frameRow 0 is a take-off below $09 (standing or barely moving); row 1 holds the same values.
Cited by: Variable jump height
In rows 0–1, falling gravity is $70/256 = 0.4375 px/frame². smb1/standing-gravity-fall
About: Super Mario Bros. Variable jump height
Value: 0.4375 px/frame²
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4861-L4862FallMForceData:
.db $70, $70, $60, $90, $90, $0a, $09smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L6681-L6687ADC $00 ; add downward movement amount to contents of $0433
STA SprObject_Y_MoveForce,xChecked by claude, 2026-10-20 — read FallMForceData (L4861-L4862) and ImposeGravity (L6681-L6687) at the pinned commit; $70 is 112/256 px/frame²Cited by: Variable jump height
In rows 0–1, falling gravity ($70) is 3.5 times held gravity ($20). smb1/standing-gravity-ratio
About: Super Mario Bros. Variable jump height
Value: 3.5 ×
T4 reproducedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4858-L4862.db $20, $20, $1e, $28, $28, $0d, $04
…
.db $70, $70, $60, $90, $90, $0a, $09Checked by claude, 2026-10-20 — read both tables at the pinned commit; the probe divides row 0 of jump-gravity-fall by row 0 of jump-gravity-held (112 / 32) and prints 3.5Probe: probes/jump-physics/jump-heights.mjsThe other rows give 3.2 (walking, row 2) and 3.6 (running, rows 3–4).
Cited by: Variable jump height
JumpSwimSub swaps in falling gravity, never back, once speed is zero or downward, or once A is not held both this frame and last after a DiffToHaltJump rise. smb1/gravity-switch
About: Super Mario Bros. Variable jump height
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4756-L4769BPL DumpFall ; or moving downwards, branch to falling
…
AND PreviousA_B_Buttons ; and was pressed in previous frame
BNE ProcSwim ; if so, branch elsewhere
…
CMP DiffToHaltJump ; compare to value set here to see if player is in mid-jump
LDA VerticalForceDown ; otherwise dump falling into main fractional
STA VerticalForceA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICSso long as they are moving upward in a jump, holding “A” will make them rise more slowlyChecked by claude, 2026-10-20 — read JumpSwimSub at the pinned commitCited by: Super Mario Bros., Variable jump height
InitJS sets DiffToHaltJump to 1, so a release switches gravity only once Mario has risen at least 1 pixel. smb1/diff-to-halt-jump
About: Super Mario Bros. Variable jump height
Value: 1 px
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4957-L4958LDA #$01 ; set value here (apparently always set to 1)
STA DiffToHaltJumpChecked by claude, 2026-10-20 — read ChkWtr at the pinned commitThe press frame always moves Mario up 4 or 5 pixels, so in practice a release on the second frame already switches.
Cited by: Variable jump height
The press frame already moves Mario, since PlayerPhysicsSub starts the jump before the state dispatch runs JumpSwimSub and MovePlayerVertically. smb1/jump-frame-moves
About: Super Mario Bros. Jump
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4713-L4725JSR PlayerPhysicsSub ; run sub related to jumping and swimming
…
JSR JumpEngine
.dw OnGroundStateSub
.dw JumpSwimSubsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L4796JMP MovePlayerVertically ; jump to move player vertically, then leaveChecked by claude, 2026-10-20 — read PlayerMovementSubs and JumpSwimSub at the pinned commitCited by: Variable jump height
Vertical motion is 8.8 fixed point; each frame, ImposeGravity adds speed to position, the fraction via the YMF_Dummy subpixel byte, then gravity to speed. smb1/subpixel-motion
About: Super Mario Bros. Gravity
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L6666-L6687ADC SprObject_Y_MoveForce,x
STA SprObject_YMF_Dummy,x
…
ADC SprObject_Y_Position,x ; add vertical position to vertical speed plus carry
…
ADC $00 ; add downward movement amount to contents of $0433
…
LDA SprObject_Y_Speed,x ; add carry to vertical speed and storeChecked by claude, 2026-10-20 — read ImposeGravity at the pinned commitPosition moves by the old speed before gravity is added, so one frame's displacement is the speed at the start of that frame. Resolution is 1/256 px.
Cited by: Subpixel, Super Mario Bros., Variable jump height
MovePlayerVertically gives ImposeGravity a maximum fall speed of 4 px/frame for Mario. smb1/max-fall-speed
About: Super Mario Bros. Gravity
Value
{
"speed": 4,
"fraction": 128
}src/prg.asm#L6547-L6550LDA #$04 ; set maximum vertical speed here
JMP ImposeGravitySprObj ; then jump to move player verticallysmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L6688-L6696CMP $02 ; compare to maximum speed
…
CMP #$80 ; if less positively than preset maximum, skip this part
…
STA SprObject_Y_Speed,x ; keep vertical speed within maximum value
…
STA SprObject_Y_MoveForce,x ; clear fractionalA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICStheir vertical downward velocity caps at 04800 in most cases, wrapping back to 04000 when exceededChecked by claude, 2026-10-20 — read MovePlayerVertically (L6540-L6550: LDA #$04 into the maximum, then ImposeGravitySprObj) and ImposeGravity's clamp (L6688-L6696) at the pinned commit; re-read when the statement dropped the "4 + $80/256" wording, which missed speeds of 5.00-5.49ImposeGravity applies the cap only when the speed's fraction byte is $80 or more (smb1/fall-clamp-test).
Cited by: Super Mario Bros., Variable jump height
Mario gets no grace window after leaving a ledge; ProcJumping refuses airborne jumps unless he is swimming. smb1/no-coyote-time
About: Super Mario Bros. Coyote time
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L4921-L4925LDA Player_State ; check player state
BEQ InitJS ; if on the ground, branch
LDA SwimmingFlag ; if swimming flag not set, jump to do something else
BEQ NoJump ; to prevent midair jumping, otherwise continueChecked by claude, 2026-10-20 — read ProcJumping at the pinned commitCited by: Coyote time, Super Mario Bros., Variable jump height
Simulating the jump code on flat ground gives apexes, tapped/held, of 24/66 px standing, 27/71 px walking (row 2), and 29/83 px running (row 4). smb1/apex-by-hold
About: Super Mario Bros. Variable jump height
Value
{
"row0": {
"tap": {
"apex": 24,
"airtime": 21
},
"full": {
"apex": 66,
"airtime": 53
}
},
"row2": {
"tap": {
"apex": 27,
"airtime": 24
},
"full": {
"apex": 71,
"airtime": 58
}
},
"row4": {
"tap": {
"apex": 29,
"airtime": 21
},
"full": {
"apex": 83,
"airtime": 57
}
}
}src/prg.asm#L4756-L4769 — gravity switchsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L6664-L6696 — motion and capChecked by claude, 2026-10-20 — ran the probe and the widget model tests; both agreeProbe: probes/jump-physics/jump-heights.mjsHeights are whole drawn pixels above the take-off row; airtime is frames from the press until back at take-off height. Tapped means A held for the press frame only.
Cited by: Variable jump height
Simulated with A held, Mario's jumps peak at 66 px standing, 71 px walking, and 83 px running. smb1/apex-held
About: Super Mario Bros. Variable jump height
Value
{
"row0": 66,
"row2": 71,
"row4": 83
}src/prg.asm#L4756-L4769 — gravity switchsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · src/prg.asm#L6664-L6696 — motion and capChecked by claude, 2026-10-20 — ran the probe; it simulates rows 0, 2, and 4 with A held for 60 frames and prints apexes of 66, 71, and 83 px, the same values as apex-by-hold's held columnProbe: probes/jump-physics/jump-heights.mjsThe same simulation as apex-by-hold. Walking is row 2 and a full-speed run row 4 (walk-run-max-speed).
Cited by: Variable jump height
ImposeGravity clamps a fall of 4 px/frame or more only when the fraction byte is at least $80. smb1/fall-clamp-test
About: Super Mario Bros. Gravity
Value: 128 1/256 px/frame
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) ·src/prg.asm#L6688-L6696CMP $02 ; compare to maximum speed
BMI ChkUpM ; if less than preset value, skip this part
LDA SprObject_Y_MoveForce,x
CMP #$80 ; if less positively than preset maximum, skip this part
BCC ChkUpMA Complete Guide to SMB's Physics Engine · JUMPING/VERTICAL PHYSICStheir vertical downward velocity caps at 04800 in most cases, wrapping back to 04000 when exceededChecked by claude, 2026-10-20 — read ImposeGravity L6681-L6696 at the pinned commit; the speed byte is compared with the maximum (4), then only the fraction byte with $80So 4.00-4.49 and 5.00-5.49 px/frame both pass unclamped, and the next step clamps them. Jdaster64's chart gives the 4.5 threshold "in most cases".
Cited by: Variable jump height
Swimming jumps use row 5 of the jump tables, or row 6 in a whirlpool. smb1/swim-rows
About: Super Mario Bros. Jump
Value
[ 5, 6 ]
src/prg.asm#L4959-L4964LDA SwimmingFlag ; if swimming flag disabled, branch
BEQ GetYPhy
LDY #$05 ; otherwise set Y to 5, range is 5-6
LDA Whirlpool_Flag ; if whirlpool flag not set, branch
BEQ GetYPhy
INY ; otherwise increment to 6Checked by claude, 2026-10-20 — read ChkWtr (L4956-L4964) at the pinned commit; GetYPhy then loads every table at that rowCited by: Super Mario Bros., Variable jump height