Play calling
Each side picks a play before the snap from a short menu, and the pairing of the two picks decides what the players on the field do.
On this page
Play calling is the choice of a play before each snap. In Tecmo Super Bowl both sides pick a slot, and the defense’s play comes from a table keyed by the offense’s play id and the defense’s slot. Picking the column of the play’s group, which a playbook set on the playbook screen makes the offense’s own slot, is the only way to get one of 11 guess-only defensive plays1. Some of their scripts, such as reaction 128, set the top running-speed step and add 48 more max speed and 48 more HP2. A computer defense picks its slot at random except on short third and fourth downs3.
- Slot pairingTecmo Super Bowl (1991). 8 slots a side; the defense's slot matching the play's group gets one of 11 defensive plays, some with boosted rushers.1,2,3
Games
| Game | Year | How | Note |
|---|---|---|---|
| Tecmo Super Bowl | 1991 | Slot pairing | 8 slots a side; the defense's slot matching the play's group gets one of 11 defensive plays, some with boosted rushers |
Every claim about this mechanic, by game (3)
References
- ^ abEach side picks one of eight slots. The offense's slot reads a play id (0 to 63) from its playbook, and before the snap the game reads the defense's play from a 64-row table: the row is the offense's play id, and the column is the defense's slot. In all 64 rows, the entry in column id ÷ 8, the play's group, is a defensive play that appears nowhere else in the table, one of 11 such plays (computed from the table by the atlas). The playbook-change screen offers slot k only the plays of group k (ids k × 8 to k × 8 + 7), so for a playbook set there, that column is the slot the offense called.Codebruddog/Tecmo_Super_Bowl_NES_Disassemblyrevised
How we know
3061P1_ON_OFF_LOAD_PLAY_INFO_PLAYER_RAM: ; P1 ON OFFENSE LOAD PLAY INFORMATION INTO PLAYER RAM(A=PLAY SELECTED 3062 LDX P1_PLAY_CALL ; LOAD P1 SLOT CALLED 3063 LDA P1_PLAYBOOK_EDIT,X ; GET ACTUAL PLAY CALLED USING SLOT AS INDEX TO P1 PLAYBOOK IN SRAM ⋮ 3089 TAX ; ⋮ 3092@get_def_reaction_based_on_off_play: ⋮ 3095 LDY P1_PLAY_CALL ; LOAD PLAYER 1 PLAY CALL 3096 LDA P1_PLAYBOOK_EDIT,Y ; GET ACTUAL PLAY 3097@multiply_by_eight_add_starting_offset: ⋮ 3105 ADC #<DEF_REACTION_START_ADDR ; = OFFSET PLUS DEFENSIVE REACTION LIST STARTING ADDR 0X1DC10= $BC00 ⋮ 3112 LDY P2_PLAY_CALL ; SAVE DEFENSIVE PLAY INDEX IN X 3113 LDA (def_reaction_addr),Y ; 3114 TAX ; ⋮
Bank19_20_on_field_gameplay_loop.asm lines 3061–3115 at f3bae0e · upstream ↗ 2979DRAW_SUB_PLAYS_IN_SCROLLING_WINDOW: ; DRAW SUBSTITUTE PLAYS (A= PLAY SLOT) 2980 ASL ; SHIFT BY 8 SINCE 8 PLAYS PER SLOT 2981 ASL ; 2982 ASL ; 2983 AND #$38 ; MAKE SURE ADJUSTED PLAY SLOT IS 0 THROUGH 7
Bank17_18_main_game_loop.asm lines 2979–2983 at f3bae0e · upstream ↗ 2885 LDA current_play_index_in_slot ; MAKE SURE PLAY INDEX IS BETWEEN 0 -7 2886 AND #$07 ; 2887 STA current_play_index_in_slot ; 2888 CLC ; 2889 ADC MENU_X ; + PLAY SLOT OFFSET 2890 STA current_play_id ; = PLAY ID
Bank17_18_main_game_loop.asm lines 2885–2890 at f3bae0e · upstream ↗ 2812DEFENSIVE_PLAY_INDEX_TABLE: ; DEFENSE REACTION INDEX TO SET OF PLAYER POINTERS 2813 .DB $5B,$5A,$5A,$58,$58,$59,$59,$59 ; REACTION TO T- FAKE SWEEP ⋮ 2876 .DB $2A,$2A,$29,$29,$2B,$2B,$2B,$22 ; REACTIONS TO RED-GUN SLANT
Bank15_faces_playbooks.asm lines 2812–2876 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.
- ^ abReactions 128 and 177 are player scripts used only by the 11 guess-only defensive plays (computed by the atlas over bank 4). Reaction 128 waits for the snap, sets the player's running-speed rating to 15, adds 48 to his max speed and 48 to his hitting power, moves, and then loops a
runRushcommand; reaction 177 stands for 30 frames after the snap and then jumps into reaction 128's boosts. Execution 188, one of the 11, gives reactions 128 to 134 to its first seven players. The script command the disassembly's macro callsboostRSemits$E3, which the command table maps to the routine that adds to max speed.Codebruddog/Tecmo_Super_Bowl_NES_DisassemblyrevisedHow we know
4811DEFENSE_PLAYER_REACTION_128: ⋮ 4814DEFENSE_PLAYER_REACTION_JUMP_059:
Bank5_6_off_def_play_data.asm lines 4811–4819 at f3bae0e · upstream ↗ 5200DEFENSE_PLAYER_REACTION_177:Bank5_6_off_def_play_data.asm lines 5200–5204 at f3bae0e · upstream ↗ 5281DEFENSE_PLAYER_REACTION_191:Bank5_6_off_def_play_data.asm lines 5281–5284 at f3bae0e · upstream ↗ 258.MACRO PlayerCommandData.setRS value 259 .DB $E0 ⋮ 273.MACRO PlayerCommandData.boostRS boost 274 .DB $E3
macros/play_data_macros.asm lines 258–276 at f3bae0e · upstream ↗ 350.MACRO PlayerCommandData.boostHP boost 351 .DB $F7
macros/play_data_macros.asm lines 350–352 at f3bae0e · upstream ↗ 383 .WORD SET_RS_COMMAND_START-1 ; EO SET RS ⋮ 386 .WORD INCR_DECR_MS_COMMAND_START-1 ; E3 BOOST MS ⋮ 409 .WORD CHANGE_HITTING_POWER_COMMAND_START-1 ; F7 BOOST HP
Bank21_22_play_commands_on_field_logic.asm lines 383–409 at f3bae0e · upstream ↗ 329.MACRO PlayerCommandData.stand time 330 .DB $F3
macros/play_data_macros.asm lines 329–330 at f3bae0e · upstream ↗ 4321stand_frames = PLAYER_COMMAND_ARG1 ⋮ 4323STAND_COMMAND_START: ; F3 STAND (TIME) ⋮ 4325 LDA stand_frames ; LOAD # OF FRAMES TO WAIT
Bank21_22_play_commands_on_field_logic.asm lines 4321–4329 at f3bae0e · upstream ↗ 3131SET_RS_COMMAND_START: ; E0 SET RS 3132 LOAD_CUR_PLAYER_RP_RS_INDEXES 3133 AND #$F0 ; MASK OUT RS SKILL INDEX NIBBLE 3134 ORA new_rs_value ; = OLD RP INDEX + NEW RS INDEX
Bank21_22_play_commands_on_field_logic.asm lines 3131–3135 at f3bae0e · upstream ↗ 3212INCR_DECR_MS_COMMAND_START: ; E3 CHANGE MS (AMOUNT) 3213 LOAD_CUR_PLAYER_MAX_SPEED 3214 CLC ; 3215 ADC change_max_speed_value ; + AMOUNT TO BOOST MAX SPEED 3216 STA (CURRENT_PLAYER_ADDR),Y ; SAVE PLAYER MAX SPEED
Bank21_22_play_commands_on_field_logic.asm lines 3212–3216 at f3bae0e · upstream ↗ 4421CHANGE_HITTING_POWER_COMMAND_START: ; F7 BOOST HP 4422 LDA hp_change_value ; = AMOUNT TO BOOST HP + CURRENT HP 4423 LDY #HP_INDEX ; 4424 CLC ; 4425 ADC (CURRENT_PLAYER_ADDR),Y ;
Bank21_22_play_commands_on_field_logic.asm lines 4421–4428 at f3bae0e · upstream ↗ 3233LOAD_DEFENSIVE_CODE_ADDRESSES: ; LOAD DEFENSIVE PLAYER POINTERS STARTING ADDRESS 3234 LDA #SIZE_OF_ALL_PLAY_POINTERS ; LOAD 11 PLAYERS * 2 BYTES PER PLAYER = 22 PLAY POINTER BYTES/ PLAY 3235 JSR MULTIPLY_A_TIMES_X ; 3236 ; PLAY POINTER OFFSET + DEFENSIVE PLAY POINTER STARTING ADDRESS 3237 ADD_16BIT_CONST_TO_ZP[val_addr] $A000, play_ptrs_addr
Bank19_20_on_field_gameplay_loop.asm lines 3233–3237 at f3bae0e · upstream ↗ 2252DEFENSIVE_EXECUTION_188:Bank4_def_spec_play_pointers_data.asm lines 2252–2259 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.
- ^ abA computer-controlled defense picks its slot at random, 0 to 7, except on third and fourth down. There, with under 25 eighths of a yard to the first-down line (3 yards or less), it calls a run slot (0–3) when a sum of random bytes is under 205 (computed: 80%) and a pass slot (4–7) otherwise. As the atlas reads it, the check meant to favor passes on longer yardage compares the distance's high byte with 57 (
$39), and that byte is at most 3 on a 100-yard field, so every longer third or fourth down also gets a random slot.Codebruddog/Tecmo_Super_Bowl_NES_DisassemblyrevisedHow we know
4342DO_COM_DEFENSIVE_PLAY_CALL: ; CHECK FOR COM DEFENSIVE PLAY CALL ⋮ 4345 LDA DOWN ; IS DOWN = 3RD DOWN 4346 CMP #THIRD_DOWN ; 4347 BEQ @check_yards_less_three_third_or_fourth_down ; YES->CHECK FOR YDS TO GO <3 ON 3RD ANF 4TH DOWN 4348 CMP #FOURTH_DOWN ; IS DOWN = 4TH DOWN 4349 BEQ @check_yards_less_three_third_or_fourth_down ; YES->CHECK FOR YDS TO GO <3 ON 3RD ANF 4TH DOWN ⋮ 4354 AND #$07 ; MAKE RAND # 0 THRU 7 = EQUAL CHANCE OF ANY PLAY ⋮ 4359 LDA yards_to_go ; IS YARDS TO FIRST >= 3 4360 CMP #$19 ; 4361 LDA yards_to_go + 1 ; 4362 SBC #$00 ; 4363 BCS @check_yards_to_go_greater_than_7 ; YES-> ⋮
Bank12_13_sim_update_stats.asm lines 4342–4372 at f3bae0e · upstream ↗ 4123HEAVY_RUN_80PCT_COM_PLAY_CALL: ; HEAVILY RANDOMIZED PLAY CALL 80% RUN, 20% PASS ⋮ 4135 CMP #$CD ; RAND # < 0XCD = 80% CHANCE RUN PLAY, 20% PASS 4136 BCC @call_random_com_run_play ; YES->CALL RANDOM RUN PLAY ⋮ 4139 LDA temp_rand_value + 1 ; MAKE PLAY CALL = RANDOM PASS PLAY CALL(4-7) ⋮ 4150 LDA temp_rand_value + 1 ; MAKE PLAY CALL = RANDOM RUN PLAY CALL (0-3)
Bank12_13_sim_update_stats.asm lines 4123–4153 at f3bae0e · upstream ↗ 4285CHECK_IF_COM_TAKES_TIMEOUT_ON_DEFENSE: ; COM ON DEFENSE CHECK IF TIMEOUTS NEEDED ⋮ 4292 BPL DO_COM_DEFENSIVE_PLAY_CALL ; NO->CHECK FOR COM DEFENSIVE PLAY CALL
Bank12_13_sim_update_stats.asm lines 4285–4296 at f3bae0e · upstream ↗ 3468yards_to_go = LOCAL_5Bank12_13_sim_update_stats.asm line 3468 at f3bae0e · upstream ↗ 1864yards_for_first = LOCAL_5 ⋮ 1918 SBC LOS_X ⋮ 1925 ADC #$50 ; ADD 10 yards ⋮ 1931 CMP #<FRONT_RIGHT_ENDZONE ⋮ 1942 SBC LOS_X
Bank20_playcall.asm lines 1864–1946 at f3bae0e · upstream ↗ 30FRONT_RIGHT_ENDZONE = $0990constants_variables/field_locations.asm lines 22–30 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.
Sources
Code
- bruddog. 2025. “Tecmo Super Bowl (NES), commented disassembly (bruddog).” Commit f3bae0e. bruddog/Tecmo_Super_Bowl_NES_Disassembly @ f3bae0e · licence, all uses