Drop speed
How fast a falling-block game's piece falls on its own, usually as frames per row, and how that speeds up over a game.
On this page
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.
- Level tableTetris (Game Boy) (1989). A 21-entry table, shifted by 10 in hard mode.4,5Tetris (NES) (1989). A table of frames per row by level.1,6,7,8
- Piece rampDr. Mario (NES) (1990). Low, Med, or Hi sets the start, and every 10th pill speeds it up a step.2,3,9
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
| Game | Year | How | Note |
|---|---|---|---|
| Tetris (Game Boy) | 1989 | Level table | a 21-entry table, shifted by 10 in hard mode |
| Tetris (NES) | 1989 | Level table | a table of frames per row by level |
| Dr. Mario (NES) | 1990 | Piece ramp | Low, Med, or Hi sets the start, and every 10th pill speeds it up a step |
Every claim about this mechanic, by game (9)
References
- ^ 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)”revisedHow 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.
- ^ ab
fallingPill_checkYMovecounts frames at the pill's row and drops it when the count passes an entry ofspeedCounterTable, 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-disassemblyHow 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.
- ^ 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-disassemblyHow 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) increasesdefines/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.
- ^ 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.
- ^ 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.
- ^From level 29 (
$1D) on, the game skips the table and drops the piece a row every frame.VerifiedCelestialAmber/TetrisNESDisasmHow 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.
- ^
fallTimercounts 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.
- ^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.
- ^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.
- ^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.
Sources
Code
- (CelestialAmber), Amber Brault and contributors. 2024. “TetrisNESDisasm: a disassembly of Tetris (NES).” Commit 94581c0. CelestialAmber/TetrisNESDisasm @ 94581c0 · licence, all uses
- 1989. “Tetris (USA).” · licence, all uses
- Nostaljipi. 2021. “Dr. Mario (NES) Disassembly.” Commit ecb9899. Nostaljipi/dr-mario-disassembly @ ecb9899 · licence, all uses
- alexsteb. 2021. “tetris_disassembly: a disassembly of Tetris (Game Boy).” Commit b4bbceb. alexsteb/tetris_disassembly @ b4bbceb · licence, all uses
- 1989. “Tetris (World) (Rev 1).” · licence, all uses
Secondary
- Birken, Michael. 2014. “Applying Artificial Intelligence to Nintendo Tetris.” original · archived · licence, all uses
- Tetris Wiki contributors. 2024. “Tetris (NES, Nintendo).” Tetris Wiki. original · archived · licence, all uses