Delayed auto shift
Holding a direction shifts a falling piece once, waits, then keeps shifting it at a fixed rate.
On this page
Delayed auto shift (DAS), also called autorepeat, is what a falling-block game does with a held direction: the piece shifts once, waits, then shifts again and again while the direction stays held1. The wait keeps a single press from sliding a piece across the well; the repeat lets a player cross it without pressing for every column.
#How it works
A counter starts at the press and counts held frames:
every frame:
if the direction was just pressed: count = 0; shift
else if it is held:
count += 1
if count reaches DELAY: count = DELAY − REPEAT; shift
Two numbers define it: the delay before the first repeat, and the interval between repeats. A game also decides what the count does when a shift is blocked, whether it survives from one piece to the next, and whether other buttons stop it.
Some games, especially early ones on home computers, time nothing themselves and take the repeat from the keyboard’s autorepeat in the hardware or operating system17.
#Implementations
#Tetris (NES) (1989)
Tetris for the NES shifts a held piece at once, then after 16 frames, then every 68,8. Its counter, autorepeatX, follows the loop above with a threshold of 16 and a restart value of 108.
- A blocked shift sets the count to 169, so a piece pushed against a wall or the stack stays charged and moves on the first frame the way is clear9.
- Spawning leaves the count alone, and the count doesn’t run between pieces. A piece that spawns with the direction still held and the count charged moves on frames 0, 6, 12, and 1810,10.
- Every new press resets the count and shifts at once, so pressing on alternate frames moves a piece every 2 frames12,12.
- Holding Down stops all shifting11.
The PAL build, from the same source, uses 12 frames, then every 414,14.
At level 29 a piece falls 1 frame per row18, and the DAS timing becomes the limit. Before it locks on an empty board, a piece shifts 2 columns if held from spawn and 4 if DAS is already charged, in 19 frames of control13. Most pieces need 3 shifts to the right wall and 4 to the left (I needs 3 each way, O 4)19,19, so a fresh hold reaches neither wall13.
#Tetris (Game Boy) (1989)
Tetris for the Game Boy counts down instead of up. A press moves the piece and sets the count to 23; held, the piece moves again after 23 frames, then every 92,2.
- A blocked shift leaves the count at 13, a charge like the NES game’s3.
- Releasing the direction resets the count, so a charge never survives a release4.
- The count holds still while no piece is falling5. A piece that spawned with Left still held and the count charged first moved 8 frames after it appeared, then every 97,7.
- Down doesn’t block shifting, the reverse of the NES rule6,11.
#Dr. Mario (1990)
Dr. Mario keeps the NES Tetris timing: a held pill moves at once, then after 16 frames, then every 615,8. A blocked shift sets the count to 1516, so a pill against a wall also moves on the first frame the way is clear9.
#Playing against the delay
In competitive classic Tetris, moving pieces by holding the D-pad is itself called DAS20. Because a new press always shifts at once12, pressing fast beats holding. Birken names Thor Aackerlund as a player who overcame DAS at the NES game’s level 29 by vibrating the D-pad21. Players now call quick repeated pressing hypertapping; it spread after the 2018 Classic Tetris World Championship22. Rolling, worked out in late 2020, is faster still23.
Some games with an entry delay let a player charge DAS during it, so the next piece starts moving as soon as it appears24. NES Tetris doesn’t count during the delay, but it keeps a charge built before it10.
#History
Games
| Game | Year | How | Note |
|---|---|---|---|
| Tetris (Game Boy) | 1989 | Delay, then repeat | 23 frames, then every 9 |
| Tetris (NES) | 1989 | Delay, then repeat | 16 frames, then every 6; charge survives walls and spawns |
| Dr. Mario (NES) | 1990 | Delay, then repeat | 16 frames, then every 6; a blocked shift stays charged |
Every claim about this mechanic, by game (23)
References
- ^Delayed auto shift, also called autorepeat, is how most falling-block games handle a held direction; the piece shifts once, waits, then shifts repeatedly while the key stays held.WikiTetris Wiki, “DAS”
How we know
The game will shift the falling piece sideways, wait, and then shift it repeatedly if the player continues to hold the key.
lead · archived copy ↗ The quote matches our archived copy.
- ^ abcPressing Left or Right moves the piece at once and sets a counter to 23; each held frame counts it down, and at 0 the piece moves and the counter restarts at 9, so a held piece moves again 23 frames after the press and then every 9.Verifiedalexsteb/tetris_disassembly · “Tetris (World) (Rev 1)”
How we know
6342l_2509: 6343 ld hl, rBLOCK_X 6344 ldh a, [rBUTTON_HIT] 6345 ld b, a 6346 ldh a, [rBUTTON_DOWN] 6347 ld c, a 6348 ld a, [hl] ⋮ 6350 bit 4, b 6351 ld a, $17 6352 jr nz, l_2527 6353 bit 4, c 6354 jr z, l_254c ⋮
main.asm lines 6342–6365 at b4bbceb · upstream ↗ In the cartridge (“Tetris (World) (Rev 1)”): the shift routine, l_2509. 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.
- ^ abcA blocked shift leaves the counter at 1, so a piece held against a wall tries to move again on the next frame.Verifiedalexsteb/tetris_disassembly
How we know
6373l_253a: 6374 ld hl, rBLOCK_X 6375 xor a 6376 ld [$dfe0], a 6377 ldh a, [$ff00 + $a0] 6378 ld [hl], a 6379 call func_2683 6380 ld a, $01 ⋮ 6383 ldh [$ff00 + $aa], a
main.asm lines 6373–6383 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.
- ^ abWith neither Left nor Right held, the counter goes back to 23, so a released direction keeps no charge.Codealexsteb/tetris_disassembly
How we know
6387l_254c: 6388 bit 5, b 6389 ld a, $17 6390 jr nz, l_255e 6391 bit 5, c 6392 jr z, l_2549
main.asm lines 6387–6392 at b4bbceb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abThe rotation and shift routine returns at once while no piece is falling, so the counter holds its value between pieces.Codealexsteb/tetris_disassembly
How we know
6273func_24bb: 6274 ld hl, rBLOCK_VISIBILITY 6275 ld a, [hl] 6276 cp $80 6277 ret z ; return if there is no falling block (visible)
main.asm lines 6273–6277 at b4bbceb · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-20.
Checked by a second AI model, 2026-10-21.
- ^ abHolding Down doesn't stop a piece from shifting, and holding Left or Right with Down stops the soft drop.Verifiedalexsteb/tetris_disassembly
How we know
5513func_209c: 5514 ldh a, [rBUTTON_DOWN] 5515 and $b0 5516 cp $80 5517 jr z, l_2071
main.asm lines 5513–5517 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.
- ^ abcWith Left held through a lock against the wall and on into the next piece, that piece first moved 8 frames after it appeared and then every 9.Verifiedalexsteb/tetris_disassembly
How we know
6274 ld hl, rBLOCK_VISIBILITY 6275 ld a, [hl] 6276 cp $80
main.asm lines 6273–6277 at b4bbceb · upstream ↗ 6391 bit 5, c 6392 jr z, l_2549 6393 ldh a, [$ff00 + $aa] 6394 dec a 6395 ldh [$ff00 + $aa], a 6396 ret nz 6397 ld a, $09 ⋮ 6400 ldh [$ff00 + $aa], a
main.asm lines 6387–6400 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-25.
Checked by a second AI model, 2026-10-21.
Checked by a second AI model, 2026-10-25.
- ^ abcdeHolding Left or Right moves the piece at once, again 16 frames later, and then every 6 frames; the press zeroes
autorepeatX, each held frame adds 1, and atDAS_RESET(16) the piece moves and the count drops toDAS_DELAY(10).VerifiedCelestialAmber/TetrisNESDisasm · Birken, "Applying AI to Nintendo Tetris" · “Tetris (USA)”How we know
89DAS_DELAY := $0A 90DAS_RESET := $10
constants.asm lines 89–90 at 94581c0 · upstream ↗ 1622 lda newlyPressedButtons 1623 and #BUTTON_LEFT+BUTTON_RIGHT 1624 bne @resetAutorepeatX 1625 lda heldButtons 1626 and #BUTTON_LEFT+BUTTON_RIGHT 1627 beq @ret 1628 inc autorepeatX 1629 lda autorepeatX 1630 cmp #DAS_RESET 1631 bmi @ret 1632 lda #DAS_DELAY 1633 sta autorepeatX ⋮
main.asm lines 1622–1638 at 94581c0 · upstream ↗ holding down one of those direction buttons causes the game to automatically shift the piece every 6 frames after an initial delay of 16 frames.
Shifting Tetriminos · archived copy ↗ In the cartridge (“Tetris (USA)”): shift_tetrimino, CPU $89AE. We don't reproduce the bytes.
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.
Checked by a second AI model, 2026-10-21.
- ^ abcdA blocked shift sets
autorepeatXto 16, so a piece held against a wall or the stack keeps DAS charged and moves on the first frame the way is clear.VerifiedCelestialAmber/TetrisNESDisasmHow we know
1661@restoreX: 1662 lda originalY 1663 sta tetriminoX 1664 lda #DAS_RESET 1665 sta autorepeatX
main.asm lines 1661–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-20.
Checked by a second AI model, 2026-10-21.
- ^ abcdSpawning a piece leaves
autorepeatXalone, so a charge carries over; with the direction held through the entry delay, the new piece moves on its first frame and every 6 frames after.VerifiedCelestialAmber/TetrisNESDisasm · Tetris Wiki, “Tetris (NES, Nintendo)”How we know
2920@spawnPiece: 2921 lda #$00 2922 sta twoPlayerPieceDelayCounter 2923 sta fallTimer 2924 sta tetriminoY 2925 lda #$01 2926 sta playState 2927 lda #$05 2928 sta tetriminoX ⋮ 2943@resetDownHold: 2944 lda #$00 2945 sta autorepeatY
main.asm lines 2920–2945 at 94581c0 · upstream ↗ 489playState_playerControlsActiveTetrimino: 490 jsr shift_tetrimino
main.asm lines 489–492 at 94581c0 · upstream ↗ This means that any DAS charge left over from the previous piece can be redirected during ARE.
Details · archived copy ↗ 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.
- ^ abcWhile Down is held the piece can't shift;
shift_tetriminoreturns before reading Left or Right.VerifiedCelestialAmber/TetrisNESDisasmHow we know
1616shift_tetrimino: 1617 lda tetriminoX 1618 sta originalY 1619 lda heldButtons 1620 and #BUTTON_DOWN 1621 bne @ret
main.asm lines 1616–1621 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.
- ^ abcdEvery new press of Left or Right zeroes the DAS count and moves the piece at once, so pressing on every other frame moves it every 2 frames.VerifiedCelestialAmber/TetrisNESDisasm · Birken, "Applying AI to Nintendo Tetris"
How we know
1622 lda newlyPressedButtons 1623 and #BUTTON_LEFT+BUTTON_RIGHT 1624 bne @resetAutorepeatX
main.asm lines 1622–1624 at 94581c0 · upstream ↗ as long as the horizontal direction button is released exactly every other frame, it is possible to shift the Tetrimino at half the rate that it drops on levels 29 and above.
Dropping Tetriminos · archived copy ↗ 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.
- ^ abcAt 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.
- ^ abcThe PAL build's DAS waits 12 frames and then repeats every 4.CodeCelestialAmber/TetrisNESDisasm
How we know
72.if PAL = 1 ⋮ 74DAS_DELAY := $08 75DAS_RESET := $0C
constants.asm lines 72–75 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.
- ^ abA press of Left or Right moves the pill at once and zeroes
currentP_horVelocity; held, the count rises each frame and at 16 the pill moves and the count restarts at 10, so it moves again 16 frames after the press and then every 6. The European build uses 13 and 5.CodeNostaljipi/dr-mario-disassemblyHow we know
298 inc currentP_horVelocity ;If held, we increase the horizontal velocity ⋮ 300 cmp #hor_accel_speed ;Takes 16 frames for initial build up of speed ⋮ 302 lda #hor_accel_speed - hor_max_speed ;Then it takes 6 frames for subsequent movements ⋮ 306 lda #$00 ;If btn was instead pressed, reset horizontal velocity
prg/drmario_prg_game_logic.asm lines 291–308 at ecb9899 · upstream ↗ 85 hor_accel_speed = $0D 86 hor_max_speed = $05
defines/drmario_constants.asm lines 81–87 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.
- ^ abA blocked shift sets the count to 15, so a pill held against a wall or the stack moves on the first frame the way is clear.CodeNostaljipi/dr-mario-disassembly
How we know
328 @cantMove_right: 329 dec currentP_fallingPillX ;Restore the previous x value 330 lda #hor_accel_speed-1 ;This makes so that as soon as the pill can move, it will move without delay with regard to velocity
prg/drmario_prg_game_logic.asm lines 326–331 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.
- ^Some games, especially early ones on home computers, take the repeat from the keyboard's autorepeat in the hardware or operating system instead of timing it themselves.WikiTetris Wiki, “DAS”
How we know
Other games, especially earlier games running on home computers, rely on the automatic repeat provided by the hardware or operating system, which the user often has the ability to configure.
lead · archived copy ↗ The quote matches our archived copy.
- ^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.
- ^ abPieces spawn centered on column 5 of 0–9; in spawn orientation T, J, Z, S, and L cover columns 4–6, O 4–5, and I 3–6, so most pieces need 3 shifts to reach the right wall and 4 to reach the left.CodeCelestialAmber/TetrisNESDisasm
How we know
2927 lda #$05 2928 sta tetriminoX
main.asm lines 2927–2928 at 94581c0 · upstream ↗ 1760 ; y offset, tile ID, x offset per mino per orientation ⋮ 1763 .byte 0, tile1,-1, 0, tile1, 0, 0, tile1, 1, 1, tile1, 0 ; $02 t down (spawn) ⋮ 1774 .byte 0, tile1,-1, 0, tile1, 0, 1, tile1,-1, 1, tile1, 0 ; $0A o (spawn) ⋮ 1785 .byte 0, tile1,-2, 0, tile1,-1, 0, tile1, 0, 0, tile1, 1 ; $12 i horizontal (spawn)
main.asm lines 1760–1785 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 competitive classic Tetris, holding the D-pad to move pieces is called DAS, for delayed auto shift.MagazineTrew 2022 · Birken, "Applying AI to Nintendo Tetris"
How we know
holding down the D-pad to move the pieces (a technique called "delayed auto shift/DAS" in competitive Tetris lingo)
section on Neubauer and Saelee · archived copy ↗ Nintendo Tetris provides Delayed Auto Shift (DAS).
Shifting Tetriminos · archived copy ↗ The quote matches our archived copy.
Checked by a second AI model, 2026-10-21.
- ^Birken names Thor Aackerlund as a player who beat DAS at level 29 by vibrating the D-pad.WebBirken, "Applying AI to Nintendo Tetris"
How we know
However, some players, most notably Thor Aackerlund, overcome the DAS by rapidly vibrating the D-pad.
Dropping Tetriminos · archived copy ↗ The quote matches our archived copy.
Checked by a second AI model, 2026-10-21.
- ^Hypertapping is moving pieces with many quick presses of the D-pad instead of holding it; it spread in competition after a hypertapping player won the 2018 Classic Tetris World Championship.MagazineZwiezen 2021 · Trew 2022
How we know
But another way to play is called “hypertapping.” This involves hitting the d-pad with lots of quick presses, resulting in faster movement. … It wasn’t until 2018, after a young player won a prestigious competition using hypertapping, that more players starting using it.
paragraph 4 · archived copy ↗ He used a style called "hypertapping" – a contorted mix of fingers and thumbs designed to sidestep the game's built-in speed limit – and it allows you to move pieces much faster than DAS.
section on Neubauer and Saelee · archived copy ↗ Saelee's victory at the 2018 CTWC finals may have surprised everyone
section on Saelee · archived copy ↗ The quote matches our archived copy.
Checked by a second AI model, 2026-10-21.
- ^Rolling, which the player Cheez worked out in late 2020, keeps light pressure on the D-pad while the fingers roll across the back of the controller, and moves pieces faster than hypertapping.MagazineZwiezen 2021 · Trew 2022
How we know
Eventually, in November 2020, Cheez_Fish figured out that they could roll their fingers on the back of the controller while pressing the d-pad buttons in the desired direction using a slight amount of pressure.
paragraph 6 · archived copy ↗ you can move pieces left and right even faster than with hypertapping.
section on rolling · archived copy ↗ The quote matches our archived copy.
Checked by a second AI model, 2026-10-21.
- ^Some games with an entry delay let the player charge DAS by holding the direction during the delay, so the next piece starts moving as soon as it appears.WikiTetris Wiki, “DAS”
How we know
Some games that have ARE or line clear delays allow the player to "charge" DAS by holding the movement key during these delays, so that the piece starts moving sideways as soon as it appears.
lead · archived copy ↗ The quote matches our archived copy.
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
- 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
- Nostaljipi. 2021. “Dr. Mario (NES) Disassembly.” Commit ecb9899. Nostaljipi/dr-mario-disassembly @ ecb9899 · licence, all uses
Secondary
- Tetris Wiki contributors. 2025. “DAS.” Tetris Wiki. original · archived · licence, all uses
- 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
- Trew, James. 2022. “How Gen Z is pushing NES Tetris to its limits.” Engadget. original · archived · licence, all uses
- Zwiezen, Zack. 2021. “NES Tetris Players Call It 'Rolling,' And They're Setting New World Records.” Kotaku. original · archived · licence, all uses