On this page
  1. Related
  2. Games
  3. References
  4. Sources

Drop speed is how often a piece falls a row with no input; falling-block players often call it gravity. The games read here count frames and drop the piece one row when the count reaches a value from a table. In NES Tetris the level picks the value, from 48 frames per row at level 0, falling to 2 at level 19 and 1 at level 291. In Dr. Mario the speed setting picks the start and every 10th pill moves one step down the table2,3. Game Boy Tetris reads its table by level index, from 53 frames per row at level 0, down to 3 at the top index4, and hard mode starts further down it5.

The table sets how long a player has to place each piece, along with delayed auto shift, which sets how far a piece can move in that time10.

Games

GameYearHowNote
Tetris (Game Boy)1989Level tablea 21-entry table, shifted by 10 in hard mode
Tetris (NES)1989Level tablea table of frames per row by level
Dr. Mario (NES)1990Piece rampLow, Med, or Hi sets the start, and every 10th pill speeds it up a step
Every claim about this mechanic, by game (9)
Tetris (Game Boy) 1989Gravity reloads a countdown from a table of 21 values, one per level index from 52 at index 0 down to 2 at index 20, and the piece falls a row when the countdown passes 0, so it falls every 53 frames at index 0 and every 3 at index 20.Verified
Holding Down while pressing Start on the title screen turns on hard mode, which adds 10 to the level index, up to 20.Verified
Tetris (NES) 1989Gravity comes from framesPerDropTable; a piece falls one row every 48 frames at level 0, never more slowly at a higher level, holding steady across levels 10–12, 13–15, and 16–18, down to 2 frames at levels 19–28, and 1 frame from level 29 on.Verified
From level 29 ($1D) on, the game skips the table and drops the piece a row every frame.Verified
fallTimer counts frames, and when it reaches the level's value the piece moves down a row; if that row is blocked, the piece locks where it is, so a resting piece locks after one gravity interval.Code
The PAL build's gravity table starts at 36 frames per row at level 0 and reaches 1 frame at level 19.Code
Dr. Mario (NES) 1990fallingPill_checkYMove counts frames at the pill's row and drops it when the count passes an entry of speedCounterTable, so a row takes the entry plus one frame. The speed setting picks the starting entry, index 15, 25, or 31 for Low, Med, and Hi, which is 40, 20, or 14 frames per row; entries 0 to 14 are never reached.Code
Every 10th pill moves the speed one step further along speedCounterTable, up to 49 steps, and each level past 20 starts a step further. After 49 steps a row takes 4 frames at Low, 2 at Med, and 1 at Hi, the table's last entry.Code
Holding Down, and no other direction, drops the pill a row on every other frame, and the drop resets the gravity count.Code

References

  1. ^ abGravity comes from framesPerDropTable; a piece falls one row every 48 frames at level 0, never more slowly at a higher level, holding steady across levels 10–12, 13–15, and 16–18, down to 2 frames at levels 19–28, and 1 frame from level 29 on.VerifiedCelestialAmber/TetrisNESDisasm · Birken, "Applying AI to Nintendo Tetris" · “Tetris (USA)” · Tetris Wiki, “Tetris (NES, Nintendo)”revised
    How we know
    1607.else
    1608    .byte   $30,$2B,$26,$21,$1C,$17,$12,$0D
    1609    .byte   $08,$06,$05,$05,$05,$04,$04,$04
    1610    .byte   $03,$03,$03,$02,$02,$02,$02,$02
    1611    .byte   $02,$02,$02,$02,$02,$01
    
    main.asm lines 1607–1611 at 94581c0 · upstream ↗
    1584@lookupDropSpeed:
    1585        lda     #$01
    1586        ldx     levelNumber
    1587        cpx     #$1D
    1588        bcs     @noTableLookup
    1589        lda     framesPerDropTable,x
    
    main.asm lines 1584–1595 at 94581c0 · upstream ↗
    The table only contains 30 entries. Above level 29, the frames per drop is locked at 1.
    Dropping Tetriminos · archived copy ↗

    In the cartridge (“Tetris (USA)”): framesPerDropTable, CPU $898E. We don't reproduce the bytes.

    The following table of gravity speeds was observed and later found to be stored at $898E (offset $099E in the iNES format ROM)
    Details · archived copy ↗

    Measured by a script in MesenCE 2.2.1 (build 4b8a196), on Tetris (USA) (SHA-1 3026d28b63d9…). 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.

    Revised after a check by a second AI model, 2026-10-21: Gravity holds steady across levels 10–12, 13–15, and 16–18.

    In the claim ledger

  2. ^ abfallingPill_checkYMove counts frames at the pill's row and drops it when the count passes an entry of speedCounterTable, so a row takes the entry plus one frame. The speed setting picks the starting entry, index 15, 25, or 31 for Low, Med, and Hi, which is 40, 20, or 14 frames per row; entries 0 to 14 are never reached.CodeNostaljipi/dr-mario-disassembly
    How we know
    242        inc currentP_speedCounter   ;Down not pressed, get amount of frames (speed counter) spent at this vertical position so far
    ⋮
    246        lda baseSpeedSettingValue,X
    ⋮
    248        adc currentP_speedIndex  
    ⋮
    250        lda speedCounterTable,X
    251        cmp currentP_speedCounter   ;The speed counter must be over the data in the table for the gravity to occur
    252        bcs @exit_fallingPill_checkYMove    
    
    prg/drmario_prg_game_logic.asm lines 242–252 at ecb9899 · upstream ↗
    254        dec currentP_fallingPillY   ;Decrease the pill's y position
    255        lda #$00                    ;Reset the speed counter
    256        sta currentP_speedCounter
    
    prg/drmario_prg_game_logic.asm lines 253–256 at ecb9899 · upstream ↗
    423.db $0F,$19,$1F         ;Low ($0F = $27), Med ($19 = $13), Hi ($1F = $0D)
    
    data/drmario_data_game.asm lines 422–423 at ecb9899 · upstream ↗
    778speedCounterTable:
    779if !ver_EU
    780    .db $45,$43,$41,$3F,$3D,$3B,$39,$37
    781    .db $35,$33,$31,$2F,$2D,$2B,$29,$27     ;Slowest actually starts at $27 (index $0F)
    782    .db $25,$23,$21,$1F,$1D,$1B,$19,$17
    783    .db $15,$13,$12,$11,$10,$0F,$0E,$0D
    
    data/drmario_data_game.asm lines 778–789 at ecb9899 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  3. ^ abEvery 10th pill moves the speed one step further along speedCounterTable, up to 49 steps, and each level past 20 starts a step further. After 49 steps a row takes 4 frames at Low, 2 at Med, and 1 at Hi, the table's last entry.CodeNostaljipi/dr-mario-disassembly
    How we know
    534        lda currentP_pillsCounter_decimal
    ⋮
    537        and #$0F                            ;Every 10 pills, check if we speed up
    ⋮
    542        cmp #speedUps_max                   ;Prevents speed increase after 49 increases
    ⋮
    545        inc currentP_speedUps               ;We speed up, play the associated sfx, 
    
    prg/drmario_prg_game_logic.asm lines 532–546 at ecb9899 · upstream ↗
    14speedUps_max            =   $31     ;Prevents speed increase after $31 (49) increases
    
    defines/drmario_constants.asm line 14 at ecb9899 · upstream ↗
    121        lda lvlsOver20           
    122        sta currentP_speedUps           ;Starts 1 step further in speed table for each level over 20
    
    prg/drmario_prg_level_init.asm lines 121–122 at ecb9899 · upstream ↗
    784    .db $0C,$0B,$0A,$09,$09,$08,$08,$07
    ⋮
    787    .db $04,$04,$04,$04,$03,$03,$03,$03
    788    .db $03,$02,$02,$02,$02,$02,$01,$01
    789    .db $01,$01,$01,$01,$01,$01,$01,$01
    790    .db $00
    
    data/drmario_data_game.asm lines 784–790 at ecb9899 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  4. ^ abGravity reloads a countdown from a table of 21 values, one per level index from 52 at index 0 down to 2 at index 20, and the piece falls a row when the countdown passes 0, so it falls every 53 frames at index 0 and every 3 at index 20.Verifiedalexsteb/tetris_disassembly · “Tetris (World) (Rev 1)”
    How we know
    4549l_1afa:
    4550	ld hl, $1b06
    4551	ld d, $00
    4552	add hl, de
    4553	ld a, [hl]
    4554	ldh [rGRAVITY], a
    4555	ldh [$ff00 + $9a], a
    4556	ret
    ⋮
    4558	db $34, $30, $2C, $28, $24, $20, $1B, $15, $10, $0A, $09, $08
    4559	db $07, $06, $05, $05, $04, $04, $03, $03, $02
    
    main.asm lines 4549–4559 at b4bbceb · upstream ↗
    5522	ldh a, [rGRAVITY]
    5523	and a
    5524	jr z, l_20b5
    5525	dec a
    5526	ldh [rGRAVITY], a
    ⋮
    5537	and a
    ⋮
    5539	ldh a, [$ff00 + $9a]
    5540	ldh [rGRAVITY], a
    
    main.asm lines 5519–5540 at b4bbceb · upstream ↗

    In the cartridge (“Tetris (World) (Rev 1)”): the level lookup and its table, func_1ae8. We don't reproduce the bytes.

    Measured by a script in MesenCE 2.2.1 (build 4b8a196), on Tetris (World) (Rev 1) (SHA-1 74591cc9501a…). 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.

    In the claim ledger

  5. ^ abHolding Down while pressing Start on the title screen turns on hard mode, which adds 10 to the level index, up to 20.Verifiedalexsteb/tetris_disassembly
    How we know
    4534func_1ae8:
    4535	ldh a, [$ff00 + $a9]
    4536	ld e, a
    4537	ldh a, [rHARD_MODE]
    4538	and a
    4539	jr z, l_1afa
    4540	ld a, $0a
    4541	add a, e
    4542	cp $15
    4543	jr c, l_1af9
    4544	ld a, $14
    ⋮
    4547	ld e, a
    
    main.asm lines 4534–4547 at b4bbceb · upstream ↗
    823first_player_selected:
    824	push af
    825	ldh a, [rBUTTON_DOWN]
    826	bit BTN_DOWN, a
    827	jr z, .skip_hard_mode	; set hard mode only if (Start + Down) are pressed.
    828	ldh [rHARD_MODE], a
    
    main.asm lines 823–828 at b4bbceb · 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.

    In the claim ledger

  6. ^From level 29 ($1D) on, the game skips the table and drops the piece a row every frame.VerifiedCelestialAmber/TetrisNESDisasm
    How we know
    1585        lda     #$01
    1586        ldx     levelNumber
    1587        cpx     #$1D
    1588        bcs     @noTableLookup
    ⋮
    1590@noTableLookup:
    1591        sta     dropSpeed
    
    main.asm lines 1584–1591 at 94581c0 · 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.

    In the claim ledger

  7. ^fallTimer counts frames, and when it reaches the level's value the piece moves down a row; if that row is blocked, the piece locks where it is, so a resting piece locks after one gravity interval.CodeCelestialAmber/TetrisNESDisasm · Birken, "Applying AI to Nintendo Tetris"
    How we know
    1441gameModeState_updateCountersAndNonPlayerState:
    ⋮
    1448        inc     player1_fallTimer
    
    main.asm lines 1441–1449 at 94581c0 · upstream ↗
    1570@drop:  lda     #$00
    1571        sta     fallTimer
    1572        lda     tetriminoY
    1573        sta     originalY
    1574        inc     tetriminoY
    1575        jsr     isPositionValid
    1576        beq     @ret
    1577        lda     originalY
    1578        sta     tetriminoY
    1579        lda     #$02
    1580        sta     playState
    ⋮
    1592        lda     fallTimer
    ⋮
    
    main.asm lines 1570–1594 at 94581c0 · upstream ↗
    This means that the lock delay—the maximum number of frames that a Tetrimino waits while supported before locking—is equal to the drop delay.
    Dropping Tetriminos · archived copy ↗

    Checked against the evidence by its author, an AI model, 2026-10-20.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  8. ^The PAL build's gravity table starts at 36 frames per row at level 0 and reaches 1 frame at level 19.CodeCelestialAmber/TetrisNESDisasm
    How we know
    1601framesPerDropTable:
    1602.if PAL = 1
    1603    .byte   $24,$20,$1D,$19,$16,$12,$0F,$0B
    1604    .byte   $07,$05,$04,$04,$04,$03,$03,$03
    1605    .byte   $02,$02,$02,$01,$01,$01,$01,$01
    1606    .byte   $01,$01,$01,$01,$01,$01
    
    main.asm lines 1601–1606 at 94581c0 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-20.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  9. ^Holding Down, and no other direction, drops the pill a row on every other frame, and the drop resets the gravity count.CodeNostaljipi/dr-mario-disassembly
    How we know
    233        lda frameCounter         
    234        and #fast_drop_speed                 
    ⋮
    239        cmp #btn_down               ;This implies that ONLY down must be pressed on the d-pad for the fast drop to occur
    240        beq @lowerPillY          
    
    prg/drmario_prg_game_logic.asm lines 233–240 at ecb9899 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-21.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  10. ^At level 29 on an empty board, a piece is under control for 19 frames; held from spawn it shifts 2 columns, with DAS charged 4, and tapped it shifts once every 2 frames.VerifiedCelestialAmber/TetrisNESDisasm
    How we know
    1585        lda     #$01
    1586        ldx     levelNumber
    1587        cpx     #$1D
    1588        bcs     @noTableLookup
    
    main.asm lines 1584–1591 at 94581c0 · upstream ↗
    1628        inc     autorepeatX
    1629        lda     autorepeatX
    1630        cmp     #DAS_RESET
    1631        bmi     @ret
    1632        lda     #DAS_DELAY
    1633        sta     autorepeatX
    ⋮
    1638        sta     autorepeatX
    ⋮
    1665        sta     autorepeatX
    
    main.asm lines 1622–1665 at 94581c0 · 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.

    In the claim ledger

Sources

Code

Secondary