On this page
  1. Related
  2. Games
  3. References
  4. Sources

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

GameYearHowNote
Tecmo Super Bowl1991Slot pairing8 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)
Tecmo Super Bowl 1991Each 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.Code
Reactions 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 runRush command; 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 calls boostRS emits $E3, which the command table maps to the routine that adds to max speed.Code
A 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.Code

References

  1. ^ 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.

    In the claim ledger

  2. ^ 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 runRush command; 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 calls boostRS emits $E3, which the command table maps to the routine that adds to max speed.Codebruddog/Tecmo_Super_Bowl_NES_Disassemblyrevised
    How 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.

    In the claim ledger

  3. ^ 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_Disassemblyrevised
    How 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_5
    
    Bank12_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         = $0990
    
    constants_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.

    In the claim ledger

Sources

Code