Mechanic · input & timing · sports
Button mashing
A contest won by pressing a button more times than the opponent, or more than a set count, inside a time window.
On this page
Button mashing decides a contest by press count. In Tecmo Super Bowl, when a human-controlled player collides with a computer-controlled one, a large enough lead in hitting power wins at once; otherwise the human needs 2 A presses in a 64-frame hold1, and two humans compare their counts. Two computer players settle it by hitting power and random rolls instead2.
- Press countTecmo Super Bowl (1991). A human needs 2 A presses in a 64-frame hold to beat a computer player, unless 32 more HP wins at once.1,2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Tecmo Super Bowl | 1991 | Press count | a human needs 2 A presses in a 64-frame hold to beat a computer player, unless 32 more HP wins at once |
Every claim about this mechanic, by game (2)
References
- ^ abAn ordinary collision (not a dive or a chop block) between a human-controlled and a computer-controlled player goes to
MAN_VS_COM_POPCORN_CHECK. If the human player's HP is at least 32 higher (8 rating steps), the computer player is thrown at once; otherwise both hold for 64 frames while the game counts the human's A presses, and 2 or more throw the computer player, and fewer throw the human. Between two human players, both players' presses count over the same 64 frames. The defender wins with at least as many presses as the offensive player; if neither pressed, both go down.Codebruddog/Tecmo_Super_Bowl_NES_DisassemblyrevisedHow we know
530@offense_colliding_defender: ; ; /OFFENSIVE PLAYER COLLIDING WITH DEFENDER START/ 531 LOAD_CUR_PLAYER_MOVEMENT_STATUS ; IS PLAYER DIVING FOR TACKLE/ CHOP BLOCKING? 532 AND #(PLAYER_DIVE_TACKLE_BITFLAG+PLAYER_CHOP_BLOCK_BITFLAG) ⋮ 535 JMP OFFENSE_DIVING_FOR_TACKLE ; YES->OFFENSE PLAYER DIVING FOR TACKLE COLLISION ⋮ 540 JMP OFFENSIVE_CHOP_BLOCK_COLLISION ; YES-> OFFENSIVE PLAYER CHOP BLOCK ⋮ 548@check_defender_diving_chop_block: ; CHECK FOR DEFENDER DIVING OR CHOPPING 549 LDA (defender_addr),Y ; DOES DEFENDER MOVEMENT = DIVING FOR TACKLE OR CHOP BLOCKING? 550 AND #(PLAYER_DIVE_TACKLE_BITFLAG+PLAYER_CHOP_BLOCK_BITFLAG) 551 BEQ START_OF_NORMAL_COLLISION_OFF_DEF ; NO-> NORMAL PLAYER COLLISION
Bank21_22_play_commands_on_field_logic.asm lines 530–551 at f3bae0e · upstream ↗ 570START_OF_NORMAL_COLLISION_OFF_DEF: ; NORMAL OFF AND DEF PLAYER COLLISION ⋮ 574 LDY #<(CHECK_COL_TYPE_MAN_OR_COM-1) ; SET COLLISION ADDR = CHECK COLLISION TYPE (MAN,COM)
Bank21_22_play_commands_on_field_logic.asm lines 570–576 at f3bae0e · upstream ↗ 749CHECK_COL_TYPE_MAN_OR_COM: ; CHECK COLLISION TYPE (MAN,COM) ⋮ 752 AND #PLAYER_MAN_COM_BITFLAG ; 753 BEQ @com_vs_com_check ; NO->CHECK FOR MAN DEFENDER ⋮ 757 AND #PLAYER_MAN_COM_BITFLAG ; 758 BEQ @man_vs_com_jump_popcorn_check ; NO->MAN VS COM POPCORN CHECK JUMP ⋮ 761 JMP MAN_VS_MAN_GRAPPLE_START ; YES->MAN V MAN GRAPPLE START ⋮ 764 JMP MAN_VS_COM_POPCORN_CHECK ; JUMP->MAN VS COM POPCORN CHECK ⋮ 766@com_vs_com_check: ; CHECK FOR MAN DEFENDER GRAPPLE ⋮ 768 AND #PLAYER_MAN_COM_BITFLAG ; ⋮ 770 JMP PAUSE_COLL_CHECK_RECHECK_COLL_TYPE ; *** should never reach here
Bank21_22_play_commands_on_field_logic.asm lines 749–770 at f3bae0e · upstream ↗ 987PAUSE_COLL_CHECK_RECHECK_COLL_TYPE: ; *** should never reach here 988 LDY #<(CHECK_COL_TYPE_MAN_OR_COM-1) ; SET COMMAND ADDR = CHECK COLLISION TYPE (MAN,COM) 989 LDX #>(CHECK_COL_TYPE_MAN_OR_COM-1) ; 990 JSR UPDATE_LOCAL_PLAYER_COMMAND_ADDR_IF_VALID ; LOAD COMMAND ADDRESS AND UPDATE COMMAND COUNTER ( TARGET: $3E $3F)
Bank21_22_play_commands_on_field_logic.asm lines 987–991 at f3bae0e · upstream ↗ 10MAN_VS_COM_POPCORN_THRESHOLD = $20 ; 50 HP differentialBank21_22_play_commands_on_field_logic.asm line 10 at f3bae0e · upstream ↗ 1001MAN_VS_COM_POPCORN_CHECK: ; MAN VS COM POPCORN CHECK ⋮ 1003 LDY #HP_INDEX ; MAN HP - COM HP 1004 LDA (CURRENT_PLAYER_ADDR),Y ; 1005 SEC ; 1006 SBC (com_addr ),Y ; 1007 BCC @man_vs_com_grapple_check ; COM HP >MAN? YES->MAN VS COM GRAPPLE CHECK 1008 CMP #MAN_VS_COM_POPCORN_THRESHOLD ; MAN HP 50 HP MORE THAN COM? 1009 BCS @com_popcorned_or_outapped ; YES->COM THROWN ⋮ 1015 RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 64 1016 LDY #players_taps ; LOAD MAN PRESSES 1017 LDA (CURRENT_PLAYER_ADDR),Y ; 1018 CMP #com_total_taps ; MAN PRESSES > (COM PRESSES = 2) ⋮
Bank21_22_play_commands_on_field_logic.asm lines 1001–1019 at f3bae0e · upstream ↗ 998players_taps = EXTRA_PLAYER_RAM_3 999com_total_taps = $02
Bank21_22_play_commands_on_field_logic.asm lines 998–999 at f3bae0e · upstream ↗ 606COUNT_PRESSES_GRAPPLE_IF_MAN: ; SET GRAPPLES PRESSES TO ZERO, CHECK FOR MAN OR COM 607 RETURN_PLAYER_ACTIONS_IN_1_FRAME 608 LDA #$00 ; SET COLLISION PRESSES = ZERO 609 LDY #presses ; ⋮ 615@count_man_a_presses: ; GRAPPLE COLLISION MAN BUTTON PRESS LOOP 616 RETURN_PLAYER_ACTIONS_IN_1_FRAME 617 JSR GET_PLAYER_JOY_PRESS ; GET P1 OR P2 JOYPAD PRESS() ⋮ 619 LDY #presses ; PRESSES++ ⋮ 624 JMP @count_man_a_presses ; JUMP->GRAPPLE COLLISION MAN BUTTON PRESS LOOP
Bank21_22_play_commands_on_field_logic.asm lines 606–624 at f3bae0e · upstream ↗ 1043MAN_VS_MAN_GRAPPLE_START: ; MAN V MAN GRAPPLE START ⋮ 1047 RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 64 ⋮ 1049 LDY #players_taps ; DEFENSE PRESSES >= OFFENSE PRESSES 1050 LDA (defender_addr),Y ; 1051 CMP (CURRENT_PLAYER_ADDR),Y ; 1052 BCS @defense_wins_man_man_grapple ; YES->DEFENSE WINS GRAPPLE ⋮ 1060@defense_wins_man_man_grapple: ; DEFENSE WINS MAN GRAPPLE 1061 TAX ; DID DEFENSE TIE OFFENSE? 1062 BEQ @defense_wins_man_man_grapple_equal_presses ; YES->DEFENSE WINS GRAPPLE EQUAL PRESSES ⋮ 1069@defense_wins_man_man_grapple_equal_presses: ; DEFENSE TIES MAN GRAPPLE EQUAL PRESSES 1070 LDY #<(PLAYER_ON_GRND_CHECK_TACKLE_IF_BALL_CARRIER-1) ; SET DEFENDER COMMAND ADDR = PLAYER FLATTENED,IF PLAYER BALL CARRIER CHECK FOR TACKLE ⋮ 1074 JMP PLAYER_ON_GRND_CHECK_TACKLE_IF_BALL_CARRIER ; JUMP->PLAYER FLATTENED,IF PLAYER BALL CARRIER CHECK FOR TACKLE
Bank21_22_play_commands_on_field_logic.asm lines 1043–1074 at f3bae0e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Revised after a check by a second AI model, 2026-10-22.
- ^ abWhen two computer-controlled players collide, the game compares their hitting power (HP), loaded from a table at 4 per rating step (0 to 60). If neither leads by 16 (4 steps), they hold for 8 frames plus random waits of up to 255, 255, and 63 frames, and one random bit picks the winner. With a lead of 16 to 31, the stronger player wins when a random byte is under 170 (computed: 66%); otherwise they grapple as before. With a lead of 32 or more, the stronger player wins on a byte under 205 (computed: 80%); otherwise they hold 64 frames and then grapple.Codebruddog/Tecmo_Super_Bowl_NES_Disassembly
How we know
1263SET_PLAYER_HP_AND_SKIN_COLOR: ; SET PLAYER HITTING POWER 1264 LDY #HITTING_POWER_INDEX ; SET SKILL INDEX = HITTING POWER INDEX 1265 JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) 1266 TAX ; 1267 LDA HITTING_POWER_VALS,X ; LOAD HITTING POWER FROM HITTING POWER TABLE
Bank27_misc.asm lines 1263–1269 at f3bae0e · upstream ↗ 5435HITTING_POWER_VALS: ; HITTING_POWER_VALUES: 5436 .DB $00, $04, $08, $0C, $10, $14, $18, $1C 5437 .DB $20, $24, $28, $2C, $30, $34, $38, $3C
Bank31_fixed_bank.asm lines 5435–5437 at f3bae0e · upstream ↗ 4COM_VS_COM_OFF_HP_THRESH_1 = $10 ; 25 HP 5COM_VS_COM_OFF_HP_THRESH_2 = $20 ; 50 HP ⋮ 7COM_VS_COM_DEF_HP_THRESH_1 = $F0 ; 25 HP 8COM_VS_COM_DEF_HP_THRESH_2 = $E0 ; 50 HP
Bank21_22_play_commands_on_field_logic.asm lines 4–8 at f3bae0e · upstream ↗ 55MEDIUM_COM_COM_OL_THROW_CHANCE = $AA ; 33% dont throw 56HIGH_COM_COM_OL_THROW_CHANCE = $CD ; 20% dont throw ⋮ 60MEDIUM_COM_COM_DEF_THROW_CHANCE = $AA ; 66% chance player busts in vs continue grapple 61HIGH_COM_COM_DEF_THROW_CHANCE = $CD ; 20% dont throw
Bank21_22_play_commands_on_field_logic.asm lines 55–61 at f3bae0e · upstream ↗ 777COM_V_COM_COLLIDED_START: ; COM VS COM GRAPPLE START 778 LOAD_CUR_PLAYER_HITTING_POWER ; PLAYER HP- TARGET HP 779 SEC ; 780 SBC (defense_addr),Y ; 781 BCC COM_DEF_HP_MORE_THAN_OFF ; DEFENSE HP > OFFENSE HP? YES-> DEFENSE HP > OFFENSE ⋮ 787 CMP #COM_VS_COM_OFF_HP_THRESH_1 ; OFFENSE HP > DEFENSE HP BY >= 4 NOTCHES (25HP)? 788 BCC COM_VS_COM_LONG_GRAPPLE_START ; NO-> COM V COM NORMAL GRAPPLE ⋮ 791 CMP #COM_VS_COM_OFF_HP_THRESH_2 ; OFFENSE HP > DEFENSE HP BY >=8 NOTCHES (50HP)? ⋮ 801 CMP #COM_VS_COM_DEF_HP_THRESH_1 +1 ; DEFENSE HP < 4 NOTCHES GREATER? 802 BCS COM_VS_COM_LONG_GRAPPLE_START ; YES->COM V COM NORMAL GRAPPLE ⋮ 805 CMP #COM_VS_COM_DEF_HP_THRESH_2 +1 ; DEFENSE HP >= 8 NOTCHES MORE THAN OFFENSE HP
Bank21_22_play_commands_on_field_logic.asm lines 777–810 at f3bae0e · upstream ↗ 817COM_VS_COM_SET_RANDOM_GRAPPLE_TIME: ; NORMAL GRAPPLE TIME DELAY START 818 RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 8 819 JSR UPDATE_RANDOM_1 ; UPDATE RANDOM $3B AND LOAD VALUE() = SET FRAMES TO WAIT = RANDOM 0-0xFF FRAMES (0-4.2 sec) ⋮ 824 AND #$3F ; ⋮ 826 JSR UPDATE_RANDOM_1 ; UPDATE RANDOM $3B AND LOAD VALUE() 827 BMI DEFENSE_WINS_COM_COM_GRAPPLE ; 50%->COM V COM DEFENDER WINS, BUSTS IN WITH OFFENSE RANDOMLY THROWN ON GROUND
Bank21_22_play_commands_on_field_logic.asm lines 817–827 at f3bae0e · upstream ↗ 862MEDIUM_CHANCE_DEF_COM_THROWN: ; OFFENSE HP > DEFENSE BY > 4 NOTCHES <8 ⋮ 867 JSR UPDATE_RANDOM_3 ; UPDATE RANDOM $3D AND LOAD VALUE() 868 CMP #MEDIUM_COM_COM_OL_THROW_CHANCE ; 869 BCC @defender_thrown ; 60% -> COM DEFENDER THROWN, OFFENSIVE PLAYER FLATTENED OR STAYS STANDING 870 JMP COM_VS_COM_SET_RANDOM_GRAPPLE_TIME ; 40% -> COM V COM NORMAL GRAPPLE
Bank21_22_play_commands_on_field_logic.asm lines 862–870 at f3bae0e · upstream ↗ 895HIGH_CHANCE_DEF_COM_THROWN: ; OFFENSE HP > DEFENSE BY 8 NOTCHES ⋮ 901 CMP #HIGH_COM_COM_OL_THROW_CHANCE ; 902 BCS DELAY_THEN_NORMAL_GRAPPLE ; 25% ->64(1 SEC) FRAME DELAY THEN JUMP TO NORMAL GRAPPLE ⋮ 922DELAY_THEN_NORMAL_GRAPPLE: ; 64 (~1 SEC) FRAME DELAY THEN JUMP TO COM V COM GRAPPLE 923 RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 64 924 JMP COM_VS_COM_SET_RANDOM_GRAPPLE_TIME ; JUMP -> COM V COM NORMAL GRAPPLE
Bank21_22_play_commands_on_field_logic.asm lines 895–924 at f3bae0e · upstream ↗ 926MEDIUM_CHANCE_OFF_COM_THROWN: ; DEFENSE HP > OFFFENSE BY > 4 NOTCHES <8 ⋮ 932 CMP #MEDIUM_COM_COM_DEF_THROW_CHANCE ; 933 BCC @offense_thrown ; 66%-> DEFENDER WINS GRAPPLE OFFENSIVE PLAYER THROWN ⋮ 958HIGH_CHANCE_OFF_COM_THROWN: ; OFFENSIVE PLAYER THROWN DEFENSE HP > OFFFENSE BY > 8 NOTHCES ⋮ 964 CMP #HIGH_COM_COM_DEF_THROW_CHANCE ; 965 BCS DELAY_THEN_NORMAL_GRAPPLE ; 20% ->(~1 SEC) FRAME DELAY THEN JUMP TO COM V COM GRAPPLE
Bank21_22_play_commands_on_field_logic.asm lines 926–965 at f3bae0e · upstream ↗ Checked against the evidence by its author, an AI model, 2026-10-22.
Checked by a second AI model, 2026-10-22.
Sources
Code
- bruddog. 2025. “Tecmo Super Bowl (NES), commented disassembly (bruddog).” Commit f3bae0e. bruddog/Tecmo_Super_Bowl_NES_Disassembly @ f3bae0e · licence, all uses