Super Mario World
Nintendo's 1990 platformer for the Super Famicom and SNES, read through SMWDisX and measured in its USA release.
On this page
The atlas reads Super Mario World through SMWDisX, IsoFrieze’s disassembly built on mikeyk’s, with most comments by kaizoman666. It assembles all five releases, and the claims cite the code the USA one runs. Every number here was also measured in that ROM, running in Mesen from a new game, on the flat start of Yoshi’s Island 1.
#Jumping
On the ground, a fresh press of B starts a jump and A a spin jump1. Mario’s horizontal speed picks the take-off speed from a table, −5 to −6.06 px/frame (spin −4.63 to −5.63)2. A spin jump takes off slower and climbs 54.8 px held, 28.5 px tapped3.
Variable jump height comes from two gravities, as in Super Mario Bros., but with no switch. Gravity is 0.1875 px/frame² held, 0.375 released4, depending only on whether A or B is down that frame, rising or falling. Letting go and pressing again brings the lighter gravity back. Mario falls no faster than 4.375 px/frame (4.1875 holding the button)5.
every frame: # player routine, CODE_00CD24
y += speed # CODE_00DC2D, sixteenths of a pixel
if on the ground and B or A goes down: # CODE_00D5F2
speed = TAKEOFF[|x speed| / 8] # the spin column for A
if speed > 0: speed = min(speed, FALL_CLAMP) # CODE_00D928
speed += A or B held ? GRAVITY_HELD : GRAVITY # negative speed is up
The move comes first, so the press frame doesn’t lift him, and his first step up is the take-off speed plus a frame of held gravity6. Measured from a standstill, Mario climbs 64.2 px held, 33.3 px tapped7.
Positions are sixteenths of a pixel8. Landing doesn’t clear the fraction, so the same jump can draw a pixel higher or lower from one take-off to the next8. The heights here are exact sixteenths, given in pixels to one decimal.
#Running and the jump
A faster run picks a faster take-off, and so a higher jump. Held, the jump climbs 64.2 px standing, 72.6 px walking, 81.6 px running, and 85.3 or 91.1 px sprinting9. Mario’s top speeds are 1.25 px/frame walking, 2.25 running, and 2.94–3.06 sprinting10. At a full P-meter his speed wobbles across a step of the table, so a sprinting jump takes off at one of two speeds depending on the frame10.
#Compared with Super Mario Bros.
| Super Mario Bros. | Super Mario World | |
|---|---|---|
| Take-off speed | −4 px/frame (−5 running)11 | −5 to −6.06 px/frame (spin −4.63 to −5.63)2 |
| Gravity with the button held | 0.117–0.156 px/frame² ($1E–$28)12, while rising, until the first release13 | 0.1875 px/frame² held, 0.375 released4, rising or falling |
| Gravity without it | 0.375–0.5625 px/frame² ($60–$90)14, for the rest of the jump13 | the heavier value, until the button goes down again4 |
| Fastest fall | 4 px/frame15 | 4.375 px/frame (4.1875 holding the button)5 |
| Held jump | 66 px standing, 71 px walking, and 83 px running16 | 64.2 px standing, 72.6 px walking, 81.6 px running, and 85.3 or 91.1 px sprinting9 |
| Units | 8.8 fixed point17 | sixteenths of a pixel8 |
The two jumps reach much the same heights16,9. They differ in control: SMB1 swaps in the heavier gravity once, for good13, and Super Mario World picks a gravity every frame4.
#Moving in the air
Mario steers with momentum. With neither Left nor Right held, he keeps his speed, since the air skips friction18. Holding a direction accelerates him at 0.09375 px/frame² (0.3125 turning)19, faster while he still moves the other way. Measured on a running jump: momentum kept; moving the other way 8 frames after the turn, at full speed after 2920. See air control.
Mechanics
| Mechanic | Kind | How |
|---|---|---|
| Variable jump height | Held gravity | a lighter gravity on any frame the button is held |
| Jump | Speed from the run | one of eight take-off speeds, by horizontal speed |
| Gravity | Lighter while held | a lighter gravity on any frame the button is held |
| Air control | Momentum | the d-pad pushes against the speed Mario carries, and with it released he keeps that speed |
| Running | P-meter | a full P-meter raises the top speed from 2.25 to 3 px/frame |
| Hitbox | Points and a box | six points against blocks, and a box against sprites |
| Invincibility frames | Frame timer | after the power-down animation, 127 frames counted every frame |
| Mode 7 | Rotate and scale | an angle and two scales turned into the matrix with a sine table; Reznor's wheel turns once in 512 frames |
| Status bar split | Scanline IRQ | in the Mode 7 boss rooms but Bowser's an interrupt at line 36 switches from Mode 1 to Mode 7 below the bar |
| Sampled sound | Sampled instruments | each instrument is a 5-byte entry naming a sample, its envelope, and a pitch multiplier |
| Music driver | Fractional tempo | a 2 ms timer tick adds the tempo to an 8-bit accumulator, and each carry calls the sound engine's step |
| Coyote time | None | a jump starts only while Mario isn't in the air, and walking off a ledge puts him there before the jump code runs |
Every claim about this game, by concept (47)
References
- ^On the ground, a fresh press of B (or X) starts Mario's jump and a fresh press of A a spin jump;
CODE_00D5F2takes the take-off speed fromDATA_00D2BDat an index set by his horizontal speed.CodeSMWDisXHow we know
9921CODE_00D5F2: 9922 LDA.B PlayerInAir 9923 BEQ + 9924 JMP CODE_00D682
bank_00.asm lines 9921–9924 at 30643c7 · upstream ↗ 9940 LDA.B byetudlrFrame 9941 ORA.B axlr0000Frame 9942 BMI CODE_00D630
bank_00.asm lines 9940–9942 at 30643c7 · upstream ↗ 9953CODE_00D630: 9954 LDA.B PlayerXSpeed+1 ⋮ 9958 + LSR A 9959 LSR A 9960 AND.B #$FE 9961 TAX 9962 LDA.B axlr0000Frame 9963 BPL CODE_00D65E ⋮ 9975 INX ⋮ 9981 + LDA.W DATA_00D2BD,X 9982 STA.B PlayerYSpeed+1
bank_00.asm lines 9953–9982 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ ab
DATA_00D2BDgives a normal jump −80/16 to −97/16 px/frame ($B0–$9F) and a spin jump −74/16 to −90/16 ($B6–$A6), faster for every 0.5 px/frame of horizontal speed.CodeSMWDisXHow we know
9673DATA_00D2BD: 9674 db $B0,$B6,$AE,$B4,$AB,$B2,$A9,$B0 9675 db $A6,$AE,$A4,$AB,$A1,$A9,$9F,$A6
bank_00.asm lines 9673–9675 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^Measured in the game, a standing spin jump climbs 54.8 px with A held and 28.5 px tapped, against 64.2 and 33.3 for a normal jump.VerifiedSMWDisX
How we know
9673DATA_00D2BD: 9674 db $B0,$B6,$AE,$B4,$AB,$B2,$A9,$B0
bank_00.asm lines 9673–9675 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcdEach frame
CODE_00D928adds 3/16 px/frame to Mario's vertical speed while A or B is held and 6/16 otherwise, rising or falling.CodeSMWDisXHow we know
10167DATA_00D7A5: ;! 10168 db $06,$03,$04,$10,$F4,$01,$03,$04 ;!
bank_00.asm lines 10167–10169 at 30643c7 · upstream ↗ 10439CODE_00D928: 10440 LDY.B #$01 10441 LDA.B byetudlrHold 10442 BMI + 10443CODE_00D92E: 10444 LDY.B #$00
bank_00.asm lines 10439–10444 at 30643c7 · upstream ↗ 10457CODE_00D948: ;! 10458 CLC ;! 10459 ADC.W DATA_00D7A5,Y ;!
bank_00.asm lines 10457–10459 at 30643c7 · upstream ↗ 821 + LDA.W axlr0000P1Hold,X ;\ 822 AND.B #!ButA|!ButX ;| Set up $15, sharing the top two bits of controller data 2 (for A/X). 823 ORA.W byetudlrP1Hold,X ;| 824 STA.B byetudlrHold ;/
bank_00.asm lines 821–824 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abGravity's routine cuts a downward speed above
$40(4 px/frame) back to$40before adding gravity, so Mario falls at most 70/16 px/frame, or 67/16 holding the button.VerifiedSMWDisXHow we know
10171DATA_00D7AF: ;! 10172 db $40,$40,$20,$40,$40,$40,$40,$40 ;!
bank_00.asm lines 10171–10173 at 30643c7 · upstream ↗ 10446 + LDA.B PlayerYSpeed+1 ;! \ If Mario's Y speed is negative (up), 10447 BMI CODE_00D948 ;! / branch to $D948 10448 CMP.W DATA_00D7AF,Y ;! 10449 BCC + ;! 10450 LDA.W DATA_00D7AF,Y ;!
bank_00.asm lines 10446–10450 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^Each frame the player routine moves Mario by his current speed (
CODE_00DC2D), then handles a jump press (CODE_00D5F2), then adds gravity (CODE_00D7E4), so the press frame doesn't lift him and his first step up is the take-off speed plus held gravity.CodeSMWDisXHow we know
8897CODE_00CD24: ⋮ 8904 + JSR CODE_00DC2D 8905 JSR CODE_00E92B
bank_00.asm lines 8897–8905 at 30643c7 · upstream ↗ 8946CODE_00CD82: 8947 JSR CODE_00D5F2 8948 JSR CODE_00D062 8949 JSR CODE_00D7E4
bank_00.asm lines 8946–8949 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^Measured in the game from a standstill, Mario's climb grows with each frame B is held, from 33.3 px tapped to 64.2 px at 28 frames or more.VerifiedSMWDisX
How we know
10440 LDY.B #$01 10441 LDA.B byetudlrHold 10442 BMI + ⋮ 10444 LDY.B #$00
bank_00.asm lines 10439–10459 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abc
CODE_00DC4Fadds a speed's low nybble to a subpixel byte and its high nybble, sign-extended, plus the carry to the 16-bit position, so Mario moves in sixteenths of a pixel.CodeSMWDisXHow we know
10909CODE_00DC4F: ;! 10910 LDA.B PlayerXSpeed+1,X ;! 10911 ASL A ;! 10912 ASL A ;! 10913 ASL A ;! 10914 ASL A ;! 10915 CLC ;! 10916 ADC.W PlayerXPosSpx,X ;! ⋮ 10920 LDA.B PlayerXSpeed+1,X ;! ⋮ 10930 ADC.B PlayerXPosNext,X ;!
bank_00.asm lines 10909–10933 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abcMeasured in the game, Mario climbs 64.2 px held and 33.3 px tapped from a standstill, 72.6 px held at walking speed, 81.6 px held running, and 85.3 or 91.1 px held sprinting.VerifiedSMWDisX
How we know
9673DATA_00D2BD: 9674 db $B0,$B6,$AE,$B4,$AB,$B2,$A9,$B0
bank_00.asm lines 9673–9675 at 30643c7 · upstream ↗ 10440 LDY.B #$01 10441 LDA.B byetudlrHold 10442 BMI + ⋮ 10444 LDY.B #$00
bank_00.asm lines 10439–10459 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abMeasured on flat ground, Mario's top speed is 20/16 px/frame walking, 36/16 holding Y, and 47/16 to 49/16 once the P-meter is full, near
DATA_00D535's$14,$24, and$30.VerifiedSMWDisXHow we know
9764DATA_00D535: ;! 9765 db $EC,$14,$DC,$24,$DC,$24,$D0,$30 ;!
bank_00.asm lines 9764–9765 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^
PlayerYSpdDatastarts a jump at −4 px/frame (rows 0–2) or −5 px/frame (rows 3–4).CodeXkeeper0/smb1 · Jdaster64 n.d.How we know
4864PlayerYSpdData: 4865 .db $fc, $fc, $fc, $fb, $fb, $fe, $ff
src/prg.asm lines 4864–4865 at 1cc3c92 · upstream ↗ 4972 LDA PlayerYSpdData,y 4973 STA Player_Y_Speed
src/prg.asm lines 4972–4973 at 1cc3c92 · upstream ↗ 04000 | 04000 | 05000
JUMPING/VERTICAL PHYSICS, Mario table, Initial Velocity (−Y) · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^While a jump rises with A held, gravity is
JumpMForceData's$20,$20,$1E,$28,$28subpixels/frame² for rows 0–4.CodeXkeeper0/smb1 · Jdaster64 n.d.How we know
4858JumpMForceData: 4859 .db $20, $20, $1e, $28, $28, $0d, $04
src/prg.asm lines 4858–4859 at 1cc3c92 · upstream ↗ 4966 LDA JumpMForceData,y ; store appropriate jump/swim 4967 STA VerticalForce ; data here
src/prg.asm lines 4966–4967 at 1cc3c92 · upstream ↗ 00200 | 001E0 | 00280
JUMPING/VERTICAL PHYSICS, Mario table, Holding “A” Gravity (+Y) · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^ abc
JumpSwimSubswaps in falling gravity, never back, once speed is zero or downward, or once the jump has risen at leastDiffToHaltJumpon a frame when A is not held, or was not held the frame before.CodeXkeeper0/smb1 · Jdaster64 n.d.revisedHow we know
4757 BPL DumpFall ; or moving downwards, branch to falling ⋮ 4760 AND PreviousA_B_Buttons ; and was pressed in previous frame 4761 BNE ProcSwim ; if so, branch elsewhere ⋮ 4765 CMP DiffToHaltJump ; compare to value set here to see if player is in mid-jump ⋮ 4768 LDA VerticalForceDown ; otherwise dump falling into main fractional 4769 STA VerticalForce
src/prg.asm lines 4756–4769 at 1cc3c92 · upstream ↗ so long as they are moving upward in a jump, holding “A” will make them rise more slowly
JUMPING/VERTICAL PHYSICS · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-27.
Revised after a check by a second AI model, 2026-10-27: "Not held both this frame and last" read two ways; held gravity stays only while A is held on both frames.
- ^After the switch, gravity is
FallMForceData's$70,$70,$60,$90,$90subpixels/frame² for rows 0–4.CodeXkeeper0/smb1 · Jdaster64 n.d.How we know
4861FallMForceData: 4862 .db $70, $70, $60, $90, $90, $0a, $09
src/prg.asm lines 4861–4862 at 1cc3c92 · upstream ↗ 4968 LDA FallMForceData,y 4969 STA VerticalForceDown
src/prg.asm lines 4968–4969 at 1cc3c92 · upstream ↗ 00700 | 00600 | 00900
JUMPING/VERTICAL PHYSICS, Mario table, Falling Gravity (+Y) · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^
MovePlayerVerticallygivesImposeGravity4 px/frame as Mario's maximum fall speed; the clamp sets the speed back to 4 only when its whole part is at least 4 and its fraction byte at least$80.CodeXkeeper0/smb1 · Jdaster64 n.d.revisedHow we know
6549 LDA #$04 ; set maximum vertical speed here 6550 JMP ImposeGravitySprObj ; then jump to move player vertically
src/prg.asm lines 6547–6550 at 1cc3c92 · upstream ↗ 6688 CMP $02 ; compare to maximum speed ⋮ 6691 CMP #$80 ; if less positively than preset maximum, skip this part ⋮ 6694 STA SprObject_Y_Speed,x ; keep vertical speed within maximum value ⋮ 6696 STA SprObject_Y_MoveForce,x ; clear fractional
src/prg.asm lines 6688–6696 at 1cc3c92 · upstream ↗ their vertical downward velocity caps at 04800 in most cases, wrapping back to 04000 when exceeded
JUMPING/VERTICAL PHYSICS · archived copy ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Revised after a check by a second AI model, 2026-10-27: The clamp sets the speed back to 4 only when its whole part is at least 4 and its fraction at least $80, so 4 px/frame alone overstated it.
- ^ abMeasured in the game with A held, Mario's jumps peak at 66 px standing, 71 px walking, and 83 px running.VerifiedXkeeper0/smb1revised
How we know
4758 LDA A_B_Buttons ⋮ 4763 SEC ⋮ 4767DumpFall: ⋮ 4769 STA VerticalForce
src/prg.asm lines 4756–4769 at 1cc3c92 · upstream ↗ 6681 LDA SprObject_Y_MoveForce,x 6682 CLC ⋮ 6684 STA SprObject_Y_MoveForce,x ⋮ 6686 ADC #$00 6687 STA SprObject_Y_Speed,x ⋮ 6690 LDA SprObject_Y_MoveForce,x
src/prg.asm lines 6664–6696 at 1cc3c92 · upstream ↗ 4958 STA DiffToHaltJumpsrc/prg.asm lines 4957–4958 at 1cc3c92 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Revised after a check by a second AI model, 2026-10-25.
- ^Vertical motion is 8.8 fixed point; each frame,
ImposeGravityadds speed to position, the fraction via theYMF_Dummysubpixel byte, then gravity to speed.CodeXkeeper0/smb1How we know
6668 ADC SprObject_Y_MoveForce,x 6669 STA SprObject_YMF_Dummy,x ⋮ 6676 ADC SprObject_Y_Position,x ; add vertical position to vertical speed plus carry ⋮ 6683 ADC $00 ; add downward movement amount to contents of $0433 ⋮ 6685 LDA SprObject_Y_Speed,x ; add carry to vertical speed and store
src/prg.asm lines 6666–6687 at 1cc3c92 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-27.
- ^In the air with neither Left nor Right held, Mario's horizontal routine returns before friction, so he keeps his speed.CodeSMWDisX
How we know
9998 LDA.B byetudlrHold 9999 AND.B #$03 10000 BNE CODE_00D6B1
bank_00.asm lines 9998–10000 at 30643c7 · upstream ↗ 10021 + JMP CODE_00D764bank_00.asm line 10021 at 30643c7 · upstream ↗ 10125CODE_00D764: 10126 JSR CODE_00D968 10127 LDA.B PlayerInAir 10128 BNE Return00D7A4
bank_00.asm lines 10125–10128 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^Holding a direction in the air accelerates Mario by
MarioAccel_'s 1.5/16 px/frame each frame up to his top speed, or by 5/16 (2.5/16 without Y) while he still moves the other way.CodeSMWDisXHow we know
9699 dw $FE80,$FE80,$0180,$0180 ;!bank_00.asm line 9699 at 30643c7 · upstream ↗ 9717 dw $FD80,$FB00,$0280,$0500 ;!bank_00.asm line 9717 at 30643c7 · upstream ↗ 10061 LDA.B PlayerXSpeed+1 10062 BEQ CODE_00D713 10063 EOR.W MarioAccel_+1,X 10064 BPL CODE_00D713 ⋮ 10072 + TXA 10073 CLC 10074 ADC.B #$90 10075 TAX
bank_00.asm lines 10061–10075 at 30643c7 · upstream ↗ 10107CODE_00D742: 10108 LDA.B PlayerXSpeed+1 10109 SEC 10110 SBC.W DATA_00D535,Y ⋮ 10115 LDA.W MarioAccel_,X
bank_00.asm lines 10107–10123 at 30643c7 · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
- ^Measured in the game, a running jump keeps 36/16 px/frame when Right is let go, and turning Left in the air reverses it within 8 frames and reaches 36/16 the other way 29 frames after the turn.VerifiedSMWDisX
How we know
10126 JSR CODE_00D968 10127 LDA.B PlayerInAir 10128 BNE Return00D7A4
bank_00.asm lines 10125–10128 at 30643c7 · upstream ↗ 10061 LDA.B PlayerXSpeed+1 10062 BEQ CODE_00D713 10063 EOR.W MarioAccel_+1,X 10064 BPL CODE_00D713 ⋮ 10073 CLC 10074 ADC.B #$90 10075 TAX
bank_00.asm lines 10061–10075 at 30643c7 · upstream ↗ Measured by a script in MesenCE 2.2.1 (build 4b8a196), on . It fails if the result disagrees with the claim.
The numbers come from the run; its author, an AI model, checked the script measures what the claim says, 2026-10-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
Sources
Code
- IsoFrieze, kaizoman666, mikeyk, and loveemu. 2026. “SMWDisX: Super Mario World disassembly (IsoFrieze/SMWDisX).” Commit 30643c7. IsoFrieze/SMWDisX @ 30643c7 · licence, all uses
- doppelganger and Xkeeper. 2022. “smb1: Super Mario Bros. disassembly for asm6f (Xkeeper0/smb1).” Commit 1cc3c92. Xkeeper0/smb1 @ 1cc3c92 · licence, all uses
Secondary
- Jdaster64. n.d. “A Complete Guide to SMB's Physics Engine.” original · archived · licence, all uses