data/claims/tetris-game-boy.yamlTetris (Game Boy) (alexsteb/tetris_disassembly, and the Rev 1 ROM in Mesen)
Game: Tetris (Game Boy).
The Rev 1 ROM carries the header the disassembly writes, and its bytes sum to the global checksum the disassembly gives, $16BF. tetris-game-boy/rom-is-disassembly
Value: $16BF
Verifiedtetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L181-L183db $01 ;mask rom version number
db $0a ;header check [ok]
db $16, $bf ;global check [ok]Tetris (World) (Rev 1) · 0x14C-0x14F — the same four header bytesChecked by claude, 2026-10-20 — read the header section at the pinned commit; the probe compares the ROM's header bytes and its 16-bit byte sum with the values there, and the cited routines' bytes match the disassembly's instructions at the same addressesProbe: probes/tetris/tetris-game-boy.mjsA byte sum is weaker evidence than a hash, so the routines cited here were also checked byte by byte.
Cited by: Tetris (Game Boy)
Pressing 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. tetris-game-boy/das
About: Tetris (Game Boy) Delayed auto shift
Value
{
"delay": 23,
"repeat": 9
}main.asm#L6342-L6365l_2509:
ld hl, rBLOCK_X
ldh a, [rBUTTON_HIT]
ld b, a
ldh a, [rBUTTON_DOWN]
ld c, a
…
bit 4, b
ld a, $17
jr nz, l_2527
bit 4, c
jr z, l_254c
…Tetris (World) (Rev 1) · 0x2509-0x2572 — the shift routine, l_2509Checked by claude, 2026-10-20 — read l_2509 at the pinned commit (bit 4 is Right; Left at l_254c is the same with bit 5); the probe held Left on a level-0 game and the piece moved on frames 0, 23, 32, 41, and 50Probe: probes/tetris/tetris-game-boy.mjsPositions are in pixels, 8 to a column. The Tetris Wiki counts DAS delays including the press frame, which makes this 24.
Cited by: Delayed auto shift, Tetris (Game Boy)
A blocked shift leaves the counter at 1, so a piece held against a wall tries to move again on the next frame. tetris-game-boy/das-wall-charge
About: Tetris (Game Boy) Delayed auto shift
Value: 1
Verifiedtetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L6373-L6383l_253a:
ld hl, rBLOCK_X
xor a
ld [$dfe0], a
ldh a, [$ff00 + $a0]
ld [hl], a
call func_2683
ld a, $01
…
ldh [$ff00 + $aa], aChecked by claude, 2026-10-20 — read l_253a; the probe read the counter as 1 after holding a piece against the left wallProbe: probes/tetris/tetris-game-boy.mjsCited by: Delayed auto shift, Tetris (Game Boy)
With neither Left nor Right held, the counter goes back to 23, so a released direction keeps no charge. tetris-game-boy/das-release
About: Tetris (Game Boy) Delayed auto shift
Codetetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L6387-L6392l_254c:
bit 5, b
ld a, $17
jr nz, l_255e
bit 5, c
jr z, l_2549Checked by claude, 2026-10-20 — read l_254c; with Left not held either, the jump to l_2549 stores the $17 just loadedCited by: Delayed auto shift, Tetris (Game Boy)
The rotation and shift routine returns at once while no piece is falling, so the counter holds its value between pieces. tetris-game-boy/das-only-while-falling
About: Tetris (Game Boy) Delayed auto shift
Codetetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L6273-L6277func_24bb:
ld hl, rBLOCK_VISIBILITY
ld a, [hl]
cp $80
ret z ; return if there is no falling block (visible)Checked by claude, 2026-10-20 — read func_24bb at the pinned commitCited by: Delayed auto shift, Tetris (Game Boy)
Holding Down doesn't stop a piece from shifting, and holding Left or Right with Down stops the soft drop. tetris-game-boy/down-allows-shift
About: Tetris (Game Boy) Delayed auto shift
Verifiedtetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L5513-L5517func_209c:
ldh a, [rBUTTON_DOWN]
and $b0
cp $80
jr z, l_2071Checked by claude, 2026-10-20 — read func_209c ($b0 is Down, Left, and Right; the soft drop needs Down alone) and l_2509, which never reads Down; the probe held Down and Right and the piece moved on frames 0 and 23Probe: probes/tetris/tetris-game-boy.mjsCited by: Delayed auto shift, Tetris (Game Boy)
With 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. tetris-game-boy/das-carry-measured
About: Tetris (Game Boy) Delayed auto shift
Value
[ 8, 17 ]
main.asm#L6273-L6277 — no shifting while no piece is fallingld hl, rBLOCK_VISIBILITY
ld a, [hl]
cp $80
ret ztetris_disassembly: a disassembly of Tetris (Game Boy) · main.asm#L6387-L6400 — the held-Left branchbit 5, c
jr z, l_2549
ldh a, [$ff00 + $aa]
dec a
ldh [$ff00 + $aa], a
ret nz
ld a, $09Checked by claude-agent, 2026-10-25 — Read func_24bb's guard (main.asm L6273-6277: no shift while no piece is falling) and the held-Left branch (L6387-6400: a counter at $FFAA counts down and reloads 9 on each move) at the pinned commit; the 8 frames before the first move are the probe's measurement in the game, not explained by these lines.Probe: probes/tetris/tetris-game-boy.mjsThe 8 frames before the first move aren't explained by the shift code alone; the spawn and lock code between pieces has no claims yet.
Cited by: Delayed auto shift, Tetris (Game Boy)
Gravity 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. tetris-game-boy/frames-per-row
About: Tetris (Game Boy) Drop speed
Value
[ 53, 49, 45, 41, 37, 33, 28, 22, 17, 11, 10, 9, 8, 7, 6, 6, 5, 5, 4, 4, 3 ]
main.asm#L4549-L4559l_1afa:
ld hl, $1b06
ld d, $00
add hl, de
ld a, [hl]
ldh [rGRAVITY], a
ldh [$ff00 + $9a], a
ret
…
db $34, $30, $2C, $28, $24, $20, $1B, $15, $10, $0A, $09, $08
db $07, $06, $05, $05, $04, $04, $03, $03, $02tetris_disassembly: a disassembly of Tetris (Game Boy) · main.asm#L5519-L5540ldh a, [rGRAVITY]
and a
jr z, l_20b5
dec a
ldh [rGRAVITY], a
…
ldh a, [$ff00 + $9a]
ldh [rGRAVITY], aTetris (World) (Rev 1) · 0x1AE8-0x1B1A — the level lookup and its table, func_1ae8Checked by claude, 2026-10-20 — read func_1ae8 and func_209c at the pinned commit; the probe started games at levels 0-9 in both modes and timed four rows of the first piece at each, indexes 0-19Probe: probes/tetris/tetris-game-boy.mjsThe table's value V gives a drop every V + 1 frames, since the countdown spends a frame at 0. Index 20 is reached only in hard mode above level 9, so it wasn't measured.
Cited by: Drop speed, Tetris (Game Boy)
Holding Down while pressing Start on the title screen turns on hard mode, which adds 10 to the level index, up to 20. tetris-game-boy/hard-mode
About: Tetris (Game Boy) Drop speed
Verifiedtetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L4534-L4547func_1ae8:
ldh a, [$ff00 + $a9]
ld e, a
ldh a, [rHARD_MODE]
and a
jr z, l_1afa
ld a, $0a
add a, e
cp $15
jr c, l_1af9
ld a, $14tetris_disassembly: a disassembly of Tetris (Game Boy) · main.asm#L823-L828first_player_selected:
push af
ldh a, [rBUTTON_DOWN]
bit BTN_DOWN, a
jr z, .skip_hard_mode ; set hard mode only if (Start + Down) are pressed.
ldh [rHARD_MODE], aChecked by claude, 2026-10-20 — read func_1ae8 and first_player_selected; in the probe, hard-mode games fell at the speeds of indexes 10-19Probe: probes/tetris/tetris-game-boy.mjsCited by: Drop speed, Tetris (Game Boy)
To pick a piece, the game reads the hardware divider DIV, reduces it modulo 7, and checks the result against the piece now spawning and the one after it; it reads again when the three type ids OR together to the spawning piece's, and takes the third read regardless. tetris-game-boy/randomizer
About: Tetris (Game Boy) Piece randomizer
Codetetris_disassembly: a disassembly of Tetris (Game Boy) ·main.asm#L5414-L5417ld a, [rNEXT_BLOCK_TYPE]
ld [hl], a
and $fc
ld c, atetris_disassembly: a disassembly of Tetris (Game Boy) · main.asm#L5444-L5479ld h, $03
l_2043:
ldh a, [rDIV]
ld b, a
l_2046:
xor a
l_2047:
dec b
jr z, l_2054
inc a
inc a
inc a
…Tetris (World) (Rev 1) · 0x2007-0x2070 — the spawn routine, func_2007Checked by claude, 2026-10-20 — read func_2007 at the pinned commit; the loop turns DIV into 4 × ((DIV − 1) mod 7), a type id, and the preview always shows the pick made one spawn earlierType ids are L $00, J $04, I $08, O $0C, Z $10, S $14, T $18. The OR test rerolls a triple of the same piece, but also any pick whose bits fall inside the spawning piece's: with a T ($18) spawning, an L, I, Z, or T next and an L, I, Z, or T picked all reroll.
Cited by: Piece randomizer, Tetris (Game Boy)
If its three reads were independent and uniform, the routine would deal L 10.86% of the time and O 16.22%, with the others between, and 10.71% of pieces would repeat the one before. tetris-game-boy/randomizer-model
About: Tetris (Game Boy) Piece randomizer
Value
{
"frequency": {
"L": 0.1086,
"J": 0.1383,
"I": 0.1383,
"O": 0.1622,
"Z": 0.1354,
"S": 0.1586,
"T": 0.1586
},
"repeatRate": 0.1071
}main.asm#L5444-L5479 — func_2007's picking loopldh a, [rDIV]
ld b, a
…
cp $1c
…
dec h
jr z, l_2062
or d
or c
and $fc
cp c
jr z, l_2043Checked by claude-agent, 2026-10-25 — Read func_2007's picking loop (main.asm L5444-5479) at the pinned commit: up to three reads of rDIV, each reduced to a piece id by counting down in steps of 4 modulo $1C, with a reroll when the OR of the ids masked by $FC equals the spawning piece's; the shares are the probe's computation over every DIV value, and its 200-piece run in the ROM checks each pick against this routine.Probe: probes/tetris/tetris-game-boy.mjsOne read gives L, J, I, and O 37/256 each and Z, S, and T 36/256, because DIV − 1 runs over 256 values and 256 isn't a multiple of 7. L is rarest because its id, $00, has no bits set: an L pick rerolls whenever the next piece's id lies inside the spawning piece's, while any other pick also needs its own bits inside the spawning piece's.
Cited by: Piece randomizer, Tetris (Game Boy)
In 9,000 pieces dealt over 474 games on the original Game Boy, L came 10.84% of the time and O 16.74%, and 11.55% of pieces repeated the one before. tetris-game-boy/randomizer-measured
About: Tetris (Game Boy) Piece randomizer
Value
{
"pieces": 9000,
"repeatRate": 11.55,
"frequency": {
"L": 10.84,
"J": 13.93,
"I": 13.54,
"O": 16.74,
"Z": 13.68,
"S": 15.54,
"T": 15.71
}
}0x2007-0x2070 — the spawn routine, func_2007tetris_disassembly: a disassembly of Tetris (Game Boy) · main.asm#L5444-L5479 — func_2007's picking loopldh a, [rDIV]
ld b, a
…
cp $1c
…
dec h
jr z, l_2062
or d
or c
and $fc
cp c
jr z, l_2043Checked by claude-agent, 2026-10-25 — Read func_2007's picking loop (main.asm L5444-5479) at the pinned commit: three DIV reads with the reroll test; the 9,000-piece shares are the probe's games played in the ROM.Probe: probes/tetris/tetris-game-boy-sample.mjsShares were J 13.49%, I 14.20%, Z 13.36%, S 15.44%, and T 15.81%. Nothing was written to RAM. The rates are reproducible: the same inputs give the same pieces.
Cited by: Piece randomizer, Tetris (Game Boy)