v0.1 ⌊ALPHA⌉
Claim set · data/claims/smb1.yaml

Super 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 commit

Cited 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
]
T3 code-verifieddisputedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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 commit

Disputed: 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 commit

Cited 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
}
T3 code-verifieddisputedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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 commit

Disputed: 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
]
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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 commit

Native 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
]
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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 commit

Cited 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
]
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#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 commit

In 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
]
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#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 commit

In 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 frame

Row 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.mjs

The 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 commit

Cited 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 commit

The 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 commit

Cited 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 commit

Position 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
}
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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.49

ImposeGravity 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 commit

Cited 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
  }
 }
}
T4 reproducedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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.mjs

Heights 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
}
T4 reproducedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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.mjs

The 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 $80

So 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
]
T3 code-verifiedsmb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1) · 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 row

Cited by: Super Mario Bros., Variable jump height