Claim set · data/claims/tecmo-super-bowl.yaml

Tecmo Super Bowl (bruddog's commented disassembly of the US NES release)

Game: Tecmo Super Bowl.

Tecmo Super Bowl stores each player rating as a 4-bit index from 0 to 15, two to a byte. The player data screen shows an index as 6, 13, 19, 25, 31, 38, 44, 50, 56, 63, 69, 75, 81, 88, 94, or 100. When the game reads a rating, it adds the player's condition (bad 0, average 1, good 2, excellent 3) less 1 and clamps the result to 0–15, so a bad player plays one step down and an excellent one two steps up. tecmo-super-bowl/ratings

About: Tecmo Super Bowl Player ratings

Value
{
 "steps": 16,
 "shown": [
  6,
  13,
  19,
  25,
  31,
  38,
  44,
  50,
  56,
  63,
  69,
  75,
  81,
  88,
  94,
  100
 ],
 "condition_steps": {
  "bad": -1,
  "average": 0,
  "good": 1,
  "excellent": 2
 }
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank31_fixed_bank.asm#L5039-L5050@get_player_skill: ; GET PLAYER SKILL(Y=STARTER ID, A = SKILL TO GET) … LSR ; SHIFT RIGHT SINCE TWO SKILLS PER BYTE … BCS @save_skill_value ; SKILL IN SECOND NIBBLE? YES-> SKILL IS IN SECOND NIBBLE OF BYTE … AND #$0F ; MASK OUT UPPER NIBBLETecmo Super Bowl (NES), commented disassembly (bruddog) · Bank31_fixed_bank.asm#L5063-L5075@add_condition_to_skill: ; UPDATE PLAYER SKILL VALUE BASED ON CONDITION … CLC ; FINAL SKILL INDEX= SKILL VALUE INDEX + PLAYER CONDITION ADC player_addr ; SEC ; SET FINAL SKILL INDEX = 0, IF FINAL SKILL INDEX <0 SBC #$01 ; … CMP #MAX_SKILL + 1 ; SET FINAL SKILL INDEX = 0X0F, IF FINAL SKILL INDEX >0X0FTecmo Super Bowl (NES), commented disassembly (bruddog) · constants_variables/constants.asm#L128-L131BAD_CONDITION = $00 AVERAGE_CONDITION = $01 GOOD_CONDITION = $02 EXCELLENT_CONDITION = $03Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank25_leaders_player_data_pro_bowl_abbrev.asm#L2726-L2728SKILL_NUMBER_VALUE_TABLE: ; SKILL VALUES .WORD $0006, $0013, $0019, $0025, $0031, $0038, $0044, $0050 .WORD $0056, $0063, $0069, $0075, $0081, $0088, $0094, $0100Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank25_leaders_player_data_pro_bowl_abbrev.asm#L2245-L2249@draw_skill_number: LDA skill_value ; LOAD SKILL INDEX ASL ; SHIFT SINCE EACH ENTRY IS TWO DIGITS TAY ; LOAD FIRST DIGIT FROM SKILL VALUES LDA SKILL_NUMBER_VALUE_TABLE+1,Y ;Checked by claude, 2026-10-22 — read GET_PLAYER_SKILL_OR_FACE, the condition constants, and the skill-number table and its use on the player data screen at the pinned commit

The displayed numbers are binary-coded decimal words, read here as decimal. GET_PLAYER_COND_INJURY_STATUS returns the condition as two bits (Bank31_fixed_bank.asm L5145-L5148). The ratings named in constants_variables/skill_indexes.asm are rushing power (RP), running speed (RS), max speed (MS), and hitting power (HP) for everyone, plus passing speed, pass control (PC), passing accuracy, and avoid pass block for quarterbacks; ball control and reception (REC) for ball carriers; interception (INT) and quickness for defenders; and kicking ratings for kickers and punters.

Cited by: Player ratings, Tecmo Super Bowl

On the field each player carries a current speed and a max speed. The max speed (MS) rating picks a max speed of 21 to 36 for an offensive player and 37 to 52 for a defender, one per step. Running speed (RS) sets the starting current speed, 14 to 29, and rushing power (RP) sets a countdown of 13 frames at step 0 down to 1 at steps 14 and 15. On each frame a player is moving, the countdown drops by 1; when it reaches 0 it reloads, and the current speed rises by 1 unless it has reached max speed. A computer-controlled defense facing a human-controlled offense loads differently: it adds CPU_DEF_MS_BOOST to its max speed and to its RS and RP steps, capping the steps at 15. tecmo-super-bowl/speed

About: Tecmo Super Bowl Player ratings

Value
{
 "max_speed_offense": [
  21,
  36
 ],
 "max_speed_defense": [
  37,
  52
 ],
 "start_speed": [
  14,
  29
 ],
 "rp_frames": [
  13,
  12,
  11,
  10,
  9,
  8,
  7,
  6,
  5,
  4,
  3,
  3,
  2,
  2,
  1,
  1
 ]
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank27_misc.asm#L1211-L1238SET_OFFENSIVE_PLAYER_SKILLS: ; SET OFFENSIVE PLAYER SKILLS ($40 = PLAYER POINTER) … LDY #MAX_SPEED_INDEX ; SET SKILL INDEX = MAX SPEED INDEX JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) LDA OFF_MAX_SPEED_VALS,Y ; LOAD SPEED VALUE FROM OFFENSIVE MAX SPEED TABLE … SET_DEFENSIVE_PLAYER_SKILLS: ; SET DEFENSIVE PLAYER SKILLS NORMAL($40 = PLAYER POINTER) … LDA DEF_MAX_SPEED_VALS,Y ; LOAD SPEED VALUE FROM DEFENSIVE MAX SPEED TABLE … SET_PLAYER_RUNNING_SPEED: ; SET PLAYER SPEED LDY #MAX_SPEED ; SET CURRENT PLAYER MAX SPEED = MAX SPEED VALUE …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank27_misc.asm#L1146-L1158@p1_on_defense: ; P1 ON DEFENSE … LDA TEAM_CONTROL_TYPES ; IS P1 PLAYER TYPE = MAN AND #$F0 ; BEQ @set_p1_defensive_skills ; YES->SET NORMAL DEFENSE SKILLS … LDA TEAM_CONTROL_TYPES ; IS P2 PLAYER TYPE = COA,COM, SKP AND #$0F ; BNE @set_p1_defensive_skills ; YES->SET NORMAL DEFENSE SKILLS … JSR SET_DEFENSIVE_SKILLS_WITH_COM_BOOST ; SET BOOSTED COM DEFENSIVE RS,RP,MS AND NORMAL HP($40 = PLAYER POINTER)Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank27_misc.asm#L1241-L1261SET_DEFENSIVE_SKILLS_WITH_COM_BOOST: ; SET BOOSTED COM DEFENSIVE RS,RP,MS AND NORMAL HP($40 = PLAYER POINTER) … LDA DEF_MAX_SPEED_VALS,Y ; LOAD SPEED VALUE FROM DEFENSIVE MAX SPEED TABLE CLC ; ADC CPU_DEF_MS_BOOST ; + DEFENSIVE COM MAXIMUM SPEED BOOST … JSR ADD_COM_DEF_MS_BOOST ; ADD COM DEFENSIVE RS,RP,MS BOOST INDEX, SET TO MAX VALUE IF TO LARGE(A= MAX SPEED INDEX)Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank27_misc.asm#L1308-L1314ADD_COM_DEF_MS_BOOST: ; ADD COM DEFENSIVE SPEED BOOST INDEX, SET TO MAX VALUE IF TO LARGE(A= MAX SPEED INDEX) CLC ; = MAX SPEED INDEX ADC CPU_DEF_MS_BOOST ; + COM DEFENSIVE SPEED BOOST INDEX CMP #MAX_SKILL + 1 ; IS INDEX < MAX INDEX? … LDA #MAX_SKILL ; SET MAXIMUM SPEED SKILL INDEX = MAX INDEXTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank31_fixed_bank.asm#L5427-L5433OFF_MAX_SPEED_VALS: ; OFFENSIVE_MAX_SPEED_VALUES .DB $15, $16, $17, $18, $19, $1A, $1B, $1C .DB $1D, $1E, $1F, $20, $21, $22, $23, $24 DEF_MAX_SPEED_VALS: ; DEFENSIVE_MAX_SPEED_VALUES .DB $25, $26, $27, $28, $29, $2A, $2B, $2C .DB $2D, $2E, $2F, $30, $31, $32, $33, $34Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L423-L434RESET_CURRENT_SPEED_RP_TO_INITIAL_VALUES: ; INITIALIZE PLAYER RUSHING POWER AND CURRENT SPEED TO DEFAULT VALUES … LDA RUSHING_POWER_VALUES_TABLE,Y ; SET PLAYER RUSHING POWER COUNTER FROM RUSHING POWER TABLE ADDR + SKILL INDEX OFFSET … LDA RUNNING_SPEED_VALUES_TABLE,Y ; SET PLAYER RUSHING CURRENT SPEED = STARTING SPEED TABLE ADDR + SKILL INDEX OFFSETTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L440-L475UPDATE_RP_CNT_AND_CUR_SPEED_THEN_COLL_CHECK: ; CHECK FOR PLAYER MOVING AND UPDATE SPEED. IF MOVING RP= RP - 1 RETURN_PLAYER_ACTIONS_IN_1_FRAME … BNE COLL_CHECK_START ; RUSHING POWER COUNTER > 0 YES->COLLISION CHECK START. … LDA RUSHING_POWER_VALUES_TABLE,X ; SET PLAYER RUSHING POWER COUNTER = FROM RUSHING POWER TABLE ADDR + SKILL INDEX OFFSET … CMP (CURRENT_PLAYER_ADDR),Y ; PLAYER CURRENT SPEED >= MAX SPEED? BCS COLL_CHECK_START ; YES->COLLISION CHECK START … CLC ; NO->PLAYER CURRENT SPEED++ ADC #$01 ;Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L11366-L11370RUSHING_POWER_VALUES_TABLE: ;RUSHING_POWER_VALUES .DB $0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$03,$02,$02,$01,$01 RUNNING_SPEED_VALUES_TABLE: ;RUNNING_SPEED_VALUES .DB $0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1DChecked by claude, 2026-10-22 — read the skill loader in bank 27, the speed tables in banks 21 and 31, and the per-frame speed update at the pinned commit

At the same MS rating a defender's max speed is 16 higher than a ball carrier's. The speed unit isn't named in the code read here. The P2 side mirrors the boost check (Bank27_misc.asm L1186-L1196). SET_COMPUTER_BOOST_VALUES (L188-L267) sets CPU_DEF_MS_BOOST from a table or to 0; the atlas hasn't claimed when each applies.

Cited by: Player ratings, Tecmo Super Bowl

When 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. tecmo-super-bowl/grapple-com

About: Tecmo Super Bowl Button mashing

Value
{
 "hp": [
  0,
  60
 ],
 "hp_per_step": 4,
 "leads": [
  16,
  32
 ],
 "win_chance": {
  "lead_16": "170/256",
  "lead_32": "205/256"
 }
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank27_misc.asm#L1263-L1269SET_PLAYER_HP_AND_SKIN_COLOR: ; SET PLAYER HITTING POWER LDY #HITTING_POWER_INDEX ; SET SKILL INDEX = HITTING POWER INDEX JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) TAX ; LDA HITTING_POWER_VALS,X ; LOAD HITTING POWER FROM HITTING POWER TABLETecmo Super Bowl (NES), commented disassembly (bruddog) · Bank31_fixed_bank.asm#L5435-L5437HITTING_POWER_VALS: ; HITTING_POWER_VALUES: .DB $00, $04, $08, $0C, $10, $14, $18, $1C .DB $20, $24, $28, $2C, $30, $34, $38, $3CTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L4-L8COM_VS_COM_OFF_HP_THRESH_1 = $10 ; 25 HP COM_VS_COM_OFF_HP_THRESH_2 = $20 ; 50 HP … COM_VS_COM_DEF_HP_THRESH_1 = $F0 ; 25 HP COM_VS_COM_DEF_HP_THRESH_2 = $E0 ; 50 HPTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L55-L61MEDIUM_COM_COM_OL_THROW_CHANCE = $AA ; 33% dont throw HIGH_COM_COM_OL_THROW_CHANCE = $CD ; 20% dont throw … MEDIUM_COM_COM_DEF_THROW_CHANCE = $AA ; 66% chance player busts in vs continue grapple HIGH_COM_COM_DEF_THROW_CHANCE = $CD ; 20% dont throwTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L777-L810COM_V_COM_COLLIDED_START: ; COM VS COM GRAPPLE START LOAD_CUR_PLAYER_HITTING_POWER ; PLAYER HP- TARGET HP SEC ; SBC (defense_addr),Y ; BCC COM_DEF_HP_MORE_THAN_OFF ; DEFENSE HP > OFFENSE HP? YES-> DEFENSE HP > OFFENSE … CMP #COM_VS_COM_OFF_HP_THRESH_1 ; OFFENSE HP > DEFENSE HP BY >= 4 NOTCHES (25HP)? BCC COM_VS_COM_LONG_GRAPPLE_START ; NO-> COM V COM NORMAL GRAPPLE … CMP #COM_VS_COM_OFF_HP_THRESH_2 ; OFFENSE HP > DEFENSE HP BY >=8 NOTCHES (50HP)? … CMP #COM_VS_COM_DEF_HP_THRESH_1 +1 ; DEFENSE HP < 4 NOTCHES GREATER? …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L817-L827COM_VS_COM_SET_RANDOM_GRAPPLE_TIME: ; NORMAL GRAPPLE TIME DELAY START RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 8 JSR UPDATE_RANDOM_1 ; UPDATE RANDOM $3B AND LOAD VALUE() = SET FRAMES TO WAIT = RANDOM 0-0xFF FRAMES (0-4.2 sec) … AND #$3F ; … BMI DEFENSE_WINS_COM_COM_GRAPPLE ; 50%->COM V COM DEFENDER WINS, BUSTS IN WITH OFFENSE RANDOMLY THROWN ON GROUNDTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L862-L870MEDIUM_CHANCE_DEF_COM_THROWN: ; OFFENSE HP > DEFENSE BY > 4 NOTCHES <8 … JSR UPDATE_RANDOM_3 ; UPDATE RANDOM $3D AND LOAD VALUE() CMP #MEDIUM_COM_COM_OL_THROW_CHANCE ; BCC @defender_thrown ; 60% -> COM DEFENDER THROWN, OFFENSIVE PLAYER FLATTENED OR STAYS STANDING JMP COM_VS_COM_SET_RANDOM_GRAPPLE_TIME ; 40% -> COM V COM NORMAL GRAPPLETecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L895-L924HIGH_CHANCE_DEF_COM_THROWN: ; OFFENSE HP > DEFENSE BY 8 NOTCHES … CMP #HIGH_COM_COM_OL_THROW_CHANCE ; BCS DELAY_THEN_NORMAL_GRAPPLE ; 25% ->64(1 SEC) FRAME DELAY THEN JUMP TO NORMAL GRAPPLE … DELAY_THEN_NORMAL_GRAPPLE: ; 64 (~1 SEC) FRAME DELAY THEN JUMP TO COM V COM GRAPPLE RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 64 JMP COM_VS_COM_SET_RANDOM_GRAPPLE_TIME ; JUMP -> COM V COM NORMAL GRAPPLETecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L926-L965MEDIUM_CHANCE_OFF_COM_THROWN: ; DEFENSE HP > OFFFENSE BY > 4 NOTCHES <8 … CMP #MEDIUM_COM_COM_DEF_THROW_CHANCE ; BCC @offense_thrown ; 66%-> DEFENDER WINS GRAPPLE OFFENSIVE PLAYER THROWN … HIGH_CHANCE_OFF_COM_THROWN: ; OFFENSIVE PLAYER THROWN DEFENSE HP > OFFFENSE BY > 8 NOTHCES … CMP #HIGH_COM_COM_DEF_THROW_CHANCE ; BCS DELAY_THEN_NORMAL_GRAPPLE ; 20% ->(~1 SEC) FRAME DELAY THEN JUMP TO COM V COM GRAPPLEChecked by claude, 2026-10-22 — read the HP loader and table, the collision constants, and COM_V_COM_COLLIDED_START through HIGH_CHANCE_OFF_COM_THROWN at the pinned commit

The code's comments give some of these chances as 60% and 25%; the comparisons give 170/256 and 205/256 for a win. Leads are signed: the defense's thresholds $F0 and $E0 plus 1 make the same 16 and 32 from the other side. The comments call 16 HP "25 HP" and 32 "50 HP", on the 6-to-100 display scale. After a win, further random bytes decide whether the winner stays on his feet and how far the loser is thrown.

Cited by: Button mashing, Tecmo Super Bowl

An 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. tecmo-super-bowl/grapple-man

About: Tecmo Super Bowl Button mashing

Value
{
 "popcorn_lead": 32,
 "hold_frames": 64,
 "presses_to_beat_computer": 2
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L530-L551@offense_colliding_defender: ; ; /OFFENSIVE PLAYER COLLIDING WITH DEFENDER START/ LOAD_CUR_PLAYER_MOVEMENT_STATUS ; IS PLAYER DIVING FOR TACKLE/ CHOP BLOCKING? AND #(PLAYER_DIVE_TACKLE_BITFLAG+PLAYER_CHOP_BLOCK_BITFLAG) … JMP OFFENSE_DIVING_FOR_TACKLE ; YES->OFFENSE PLAYER DIVING FOR TACKLE COLLISION … JMP OFFENSIVE_CHOP_BLOCK_COLLISION ; YES-> OFFENSIVE PLAYER CHOP BLOCK … @check_defender_diving_chop_block: ; CHECK FOR DEFENDER DIVING OR CHOPPING LDA (defender_addr),Y ; DOES DEFENDER MOVEMENT = DIVING FOR TACKLE OR CHOP BLOCKING? AND #(PLAYER_DIVE_TACKLE_BITFLAG+PLAYER_CHOP_BLOCK_BITFLAG) BEQ START_OF_NORMAL_COLLISION_OFF_DEF ; NO-> NORMAL PLAYER COLLISIONTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L570-L576START_OF_NORMAL_COLLISION_OFF_DEF: ; NORMAL OFF AND DEF PLAYER COLLISION … LDY #<(CHECK_COL_TYPE_MAN_OR_COM-1) ; SET COLLISION ADDR = CHECK COLLISION TYPE (MAN,COM)Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L749-L770CHECK_COL_TYPE_MAN_OR_COM: ; CHECK COLLISION TYPE (MAN,COM) … AND #PLAYER_MAN_COM_BITFLAG ; BEQ @com_vs_com_check ; NO->CHECK FOR MAN DEFENDER … BEQ @man_vs_com_jump_popcorn_check ; NO->MAN VS COM POPCORN CHECK JUMP … JMP MAN_VS_MAN_GRAPPLE_START ; YES->MAN V MAN GRAPPLE START … JMP MAN_VS_COM_POPCORN_CHECK ; JUMP->MAN VS COM POPCORN CHECK … @com_vs_com_check: ; CHECK FOR MAN DEFENDER GRAPPLE …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L987-L991PAUSE_COLL_CHECK_RECHECK_COLL_TYPE: ; *** should never reach here LDY #<(CHECK_COL_TYPE_MAN_OR_COM-1) ; SET COMMAND ADDR = CHECK COLLISION TYPE (MAN,COM) LDX #>(CHECK_COL_TYPE_MAN_OR_COM-1) ; JSR UPDATE_LOCAL_PLAYER_COMMAND_ADDR_IF_VALID ; LOAD COMMAND ADDRESS AND UPDATE COMMAND COUNTER ( TARGET: $3E $3F)Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L10-L10MAN_VS_COM_POPCORN_THRESHOLD = $20 ; 50 HP differentialTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L1001-L1019MAN_VS_COM_POPCORN_CHECK: ; MAN VS COM POPCORN CHECK … LDY #HP_INDEX ; MAN HP - COM HP LDA (CURRENT_PLAYER_ADDR),Y ; SEC ; SBC (com_addr ),Y ; BCC @man_vs_com_grapple_check ; COM HP >MAN? YES->MAN VS COM GRAPPLE CHECK CMP #MAN_VS_COM_POPCORN_THRESHOLD ; MAN HP 50 HP MORE THAN COM? BCS @com_popcorned_or_outapped ; YES->COM THROWN … RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 64 LDY #players_taps ; LOAD MAN PRESSES …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L998-L999players_taps = EXTRA_PLAYER_RAM_3 com_total_taps = $02Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L606-L624COUNT_PRESSES_GRAPPLE_IF_MAN: ; SET GRAPPLES PRESSES TO ZERO, CHECK FOR MAN OR COM RETURN_PLAYER_ACTIONS_IN_1_FRAME LDA #$00 ; SET COLLISION PRESSES = ZERO … @count_man_a_presses: ; GRAPPLE COLLISION MAN BUTTON PRESS LOOP RETURN_PLAYER_ACTIONS_IN_1_FRAME JSR GET_PLAYER_JOY_PRESS ; GET P1 OR P2 JOYPAD PRESS() … LDY #presses ; PRESSES++ … JMP @count_man_a_presses ; JUMP->GRAPPLE COLLISION MAN BUTTON PRESS LOOPTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L1043-L1074MAN_VS_MAN_GRAPPLE_START: ; MAN V MAN GRAPPLE START … RETURN_PLAYER_ACTIONS_IN_NUM_FRAMES[frames] 64 … LDY #players_taps ; DEFENSE PRESSES >= OFFENSE PRESSES LDA (defender_addr),Y ; CMP (CURRENT_PLAYER_ADDR),Y ; BCS @defense_wins_man_man_grapple ; YES->DEFENSE WINS GRAPPLE … @defense_wins_man_man_grapple: ; DEFENSE WINS MAN GRAPPLE TAX ; DID DEFENSE TIE OFFENSE? BEQ @defense_wins_man_man_grapple_equal_presses ; YES->DEFENSE WINS GRAPPLE EQUAL PRESSES …Checked by claude, 2026-10-22 — read CHECK_COL_TYPE_MAN_OR_COM, PAUSE_COLL_CHECK_RECHECK_COLL_TYPE, COUNT_PRESSES_GRAPPLE_IF_MAN, MAN_VS_COM_POPCORN_CHECK, and MAN_VS_MAN_GRAPPLE_START at the pinned commit

Routing: the offensive player's script runs CHECK_COL_TYPE_MAN_OR_COM. A human offense goes to the popcorn check or the man-against-man contest directly. A computer offense against a human defender takes the branch the comment calls unreachable, PAUSE_COLL_CHECK_RECHECK_COLL_TYPE, which points the defender's script at the same check, so the defender then runs it as the human side. "Tie" in the comments is a test of the defender's count against 0 (TAX, BEQ after CMP, which leaves A unchanged), so only 0 against 0 puts both players down; equal counts above 0 go to the defender. The computer player's HP lead never wins outright here.

Cited by: Button mashing, Tecmo Super Bowl

Each 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. tecmo-super-bowl/play-call

About: Tecmo Super Bowl Play calling

Value
{
 "slots": 8,
 "offensive_plays": 64,
 "table": "64 × 8",
 "guess_only_plays": 11
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank19_20_on_field_gameplay_loop.asm#L3061-L3115P1_ON_OFF_LOAD_PLAY_INFO_PLAYER_RAM: ; P1 ON OFFENSE LOAD PLAY INFORMATION INTO PLAYER RAM(A=PLAY SELECTED LDX P1_PLAY_CALL ; LOAD P1 SLOT CALLED LDA P1_PLAYBOOK_EDIT,X ; GET ACTUAL PLAY CALLED USING SLOT AS INDEX TO P1 PLAYBOOK IN SRAM … @get_def_reaction_based_on_off_play: … LDY P1_PLAY_CALL ; LOAD PLAYER 1 PLAY CALL LDA P1_PLAYBOOK_EDIT,Y ; GET ACTUAL PLAY @multiply_by_eight_add_starting_offset: … ADC #<DEF_REACTION_START_ADDR ; = OFFSET PLUS DEFENSIVE REACTION LIST STARTING ADDR 0X1DC10= $BC00 … …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank17_18_main_game_loop.asm#L2979-L2983DRAW_SUB_PLAYS_IN_SCROLLING_WINDOW: ; DRAW SUBSTITUTE PLAYS (A= PLAY SLOT) ASL ; SHIFT BY 8 SINCE 8 PLAYS PER SLOT ASL ; ASL ; AND #$38 ; MAKE SURE ADJUSTED PLAY SLOT IS 0 THROUGH 7Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank17_18_main_game_loop.asm#L2885-L2890LDA current_play_index_in_slot ; MAKE SURE PLAY INDEX IS BETWEEN 0 -7 AND #$07 ; STA current_play_index_in_slot ; CLC ; ADC MENU_X ; + PLAY SLOT OFFSET STA current_play_id ; = PLAY IDTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank15_faces_playbooks.asm#L2812-L2876DEFENSIVE_PLAY_INDEX_TABLE: ; DEFENSE REACTION INDEX TO SET OF PLAYER POINTERS .DB $5B,$5A,$5A,$58,$58,$59,$59,$59 ; REACTION TO T- FAKE SWEEP … .DB $2A,$2A,$29,$29,$2B,$2B,$2B,$22 ; REACTIONS TO RED-GUN SLANTChecked by claude, 2026-10-22 — read the play loader for P1 on offense (P2's mirror follows at L3134-L3182), the play-id arithmetic, and the reaction table; counted the table's entries with a script

Row r's group column is r ÷ 8 (integer division). On that diagonal the 64 entries use 11 values ($22, $53, $57, $5B, $5F, $63, $67, $8F, $99, $BB, $DA), and none of the 448 entries off it uses any of them. The same 16-byte-name-plus-8 layout gives each offensive play its own version by the defense's slot (L3076-L3084). The atlas hasn't traced how the default playbooks (TEAM_PLAYBOOKS, one nibble per slot) become play ids, so the slot-equals-group reading rests on the playbook-change screen.

Cited by: Play calling, Tecmo Super Bowl

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. tecmo-super-bowl/guess-boost

About: Tecmo Super Bowl Play calling

Value
{
 "set_rs_step": 15,
 "max_speed_add": 48,
 "hp_add": 48
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank5_6_off_def_play_data.asm#L4811-L4819DEFENSE_PLAYER_REACTION_128: PlayerCommandData.setPositionBallPlacement $D8, $08 PlayerCommandData.waitForSnap3PointStance DEFENSE_PLAYER_REACTION_JUMP_059: PlayerCommandData.setRS $0F PlayerCommandData.boostRS $30 PlayerCommandData.boostHP $30 PlayerCommandData.moveBallPlacement $D8, $08 PlayerCommandData.jumpTo DEFENSE_PLAYER_REACTION_191Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank5_6_off_def_play_data.asm#L5200-L5204DEFENSE_PLAYER_REACTION_177: PlayerCommandData.setPositionBallPlacement $D8, $08 PlayerCommandData.waitForSnap3PointStance PlayerCommandData.stand $1E PlayerCommandData.jumpTo DEFENSE_PLAYER_REACTION_JUMP_059Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank5_6_off_def_play_data.asm#L5281-L5284DEFENSE_PLAYER_REACTION_191: PlayerCommandData.setToGrapple %11111111, %11100000 PlayerCommandData.runRush PlayerCommandData.loopTo DEFENSE_PLAYER_REACTION_191Tecmo Super Bowl (NES), commented disassembly (bruddog) · macros/play_data_macros.asm#L258-L276.MACRO PlayerCommandData.setRS value .DB $E0 … .MACRO PlayerCommandData.boostRS boost .DB $E3Tecmo Super Bowl (NES), commented disassembly (bruddog) · macros/play_data_macros.asm#L350-L352.MACRO PlayerCommandData.boostHP boost .DB $F7Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L383-L409.WORD SET_RS_COMMAND_START-1 ; EO SET RS … .WORD INCR_DECR_MS_COMMAND_START-1 ; E3 BOOST MS … .WORD CHANGE_HITTING_POWER_COMMAND_START-1 ; F7 BOOST HPTecmo Super Bowl (NES), commented disassembly (bruddog) · macros/play_data_macros.asm#L329-L330.MACRO PlayerCommandData.stand time .DB $F3Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L4321-L4329stand_frames = PLAYER_COMMAND_ARG1 … STAND_COMMAND_START: ; F3 STAND (TIME) … LDA stand_frames ; LOAD # OF FRAMES TO WAITTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L3131-L3135SET_RS_COMMAND_START: ; E0 SET RS LOAD_CUR_PLAYER_RP_RS_INDEXES AND #$F0 ; MASK OUT RS SKILL INDEX NIBBLE ORA new_rs_value ; = OLD RP INDEX + NEW RS INDEXTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L3212-L3216INCR_DECR_MS_COMMAND_START: ; E3 CHANGE MS (AMOUNT) LOAD_CUR_PLAYER_MAX_SPEED CLC ; ADC change_max_speed_value ; + AMOUNT TO BOOST MAX SPEED STA (CURRENT_PLAYER_ADDR),Y ; SAVE PLAYER MAX SPEEDTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L4421-L4428CHANGE_HITTING_POWER_COMMAND_START: ; F7 BOOST HP LDA hp_change_value ; = AMOUNT TO BOOST HP + CURRENT HP LDY #HP_INDEX ; CLC ; ADC (CURRENT_PLAYER_ADDR),Y ;Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank19_20_on_field_gameplay_loop.asm#L3233-L3237LOAD_DEFENSIVE_CODE_ADDRESSES: ; LOAD DEFENSIVE PLAYER POINTERS STARTING ADDRESS LDA #SIZE_OF_ALL_PLAY_POINTERS ; LOAD 11 PLAYERS * 2 BYTES PER PLAYER = 22 PLAY POINTER BYTES/ PLAY JSR MULTIPLY_A_TIMES_X ; ; PLAY POINTER OFFSET + DEFENSIVE PLAY POINTER STARTING ADDRESS ADD_16BIT_CONST_TO_ZP[val_addr] $A000, play_ptrs_addrTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank4_def_spec_play_pointers_data.asm#L2252-L2259DEFENSIVE_EXECUTION_188: .WORD DEFENSE_PLAYER_REACTION_128 .WORD DEFENSE_PLAYER_REACTION_129 .WORD DEFENSE_PLAYER_REACTION_130 .WORD DEFENSE_PLAYER_REACTION_131 .WORD DEFENSE_PLAYER_REACTION_132 .WORD DEFENSE_PLAYER_REACTION_133 .WORD DEFENSE_PLAYER_REACTION_134Checked by claude, 2026-10-22 — read reactions 128, 177, and 191, the three command macros, the command table entries and their handlers, and execution 188 (play $BB, 1-based in bank 4) at the pinned commit; matched executions to reactions with a script

The scripts found only in guess-only plays are reactions 128 to 138, 160 to 163, 177 to 182, 208, 255 to 257, 294 to 297, 368 to 371, and 452 (computed over bank 4's 255 executions). Not all of them boost: 294 to 297 and 368 to 371 cover receivers. 48 more max speed is three times the MS table's whole range of 16; 48 more HP is 12 rating steps. setRS also resets the current speed from the RS table (L3198-L3203), so the boosted defender starts at 29. The other guess-only scripts vary and aren't claimed here: reaction 129 adds 32 HP instead of 48, and 178, which jumps into it, does too; some, such as 180, end in the passRush loop of reaction 194 rather than 191. Bank 4's labels count from 1, so play index $BB (187) is DEFENSIVE_EXECUTION_188. The stand $1E wait is 30 frames; the data's own annotation reads "for 1.5s".

Cited by: Play calling, Tecmo Super Bowl

When a pass reaches its target, Tecmo Super Bowl adds the passer's pass control (PC) value, 61 to 91 at 2 per step, to the receiver's reception (REC) value, also 61 to 91. With no defender near the ball, a random byte forced into 128–255, times that sum and divided by 256, gives a roll from half the sum to one less than it; 79 or more is a catch, and less is incomplete. Each of up to three nearby defenders in turn subtracts his interception (INT) value, 51 to 81, from the sum (floored at 0) for a roll made the same way: under 51 is an interception, under 80 is incomplete, and 80 or more passes the ball to the next defender's check. A pass that clears every check is a catch. tecmo-super-bowl/pass-outcome

About: Tecmo Super Bowl Pass completion

Value
{
 "pc": [
  61,
  91
 ],
 "rec": [
  61,
  91
 ],
 "int": [
  51,
  81
 ],
 "uncovered_catch_at": 79,
 "interception_below": 51,
 "covered_catch_at": 80
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L184-L187COVERED_INTERCEPTION_THRESHOLD = $33 UNCOVERED_RECEPTION_THRESHOLD = $4F COVERED_RECEPTION_THRESHOLD = $50 TARGET_NOT_CLOSE_INT_THRESHOLD = $0ETecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5675-L5703ADD_PASS_CONTROL_SKILL_AND_REC_SKILL: ; GET PC TABLE VALUE, REC TABLE VALUE, PC VAL in $DC, PC+REC VAL in $DD() … JSR GET_PASS_CONTROL_SKILL_VALUE ; GET PLAYER PASSING CONTROL INDEX() TAY ; SET PASSING ABILITY TABLE INDEX LDA PASSING_VALUES_TABLE,Y ; LOAD PASS CONTROL ABILITY VALUE FROM PASSING ABILITY TABLE STA PASS_CONTROL_VALUE ; … LDY #RECEPTION_INDEX ; SET SKILL INDEX = RECEPTTION … LDA RECEPTION_VALUES_TABLE,Y ; LOAD RECEIVING ABILITY VALUE FROM PASSING ABILITY TABLE CLC ; ADC PASS_CONTROL_VALUE ; + PASS CONTROL VALUE …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5972-L5974GET_PASS_CONTROL_SKILL_VALUE: ; GET PLAYER PASSING CONTROL SKILL VALUE() LDY #PASS_CONTROL_INDEX ; LOAD PASS CONTROL SKILL INDEX JSR GET_PLAYER_SKILL_OR_FACE ; GET SKILL RATING(A=PLAYER, Y=SKILL TO GET, X=TEAM)Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L11465-L11472PASSING_VALUES_TABLE: ; PASSING_VALUES .DB $3D,$3F,$41,$43,$45,$47,$49,$4B,$4D,$4F,$51,$53,$55,$57,$59,$5B RECEPTION_VALUES_TABLE: ; RECEPTION_VALUES .DB $3D,$3F,$41,$43,$45,$47,$49,$4B,$4D,$4F,$51,$53,$55,$57,$59,$5B INTERCEPTION_VALUES_TABLE: ; INTERCEPTION_VALUES .DB $33,$35,$37,$39,$3B,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4D,$4F,$51Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5481-L5492PASS_RESULT_CALCS_NO_DEFENDER_NEAR: … LDA RANDOM_3 ; MAKE RAND # 3D RANGE = 0X80 TO 0XFF ORA #$80 ; LDX PC_PLUS_RECEPTION ; LOAD PC+REC JSR MULTIPLY_A_TIMES_X ; MULTIPLY (A * X) (X-1 to X/2 Stored in $45) LDA qb_to_wr_check_value ; RANGE = PC+REC-1 to (PC+REC-1)/2 CMP #UNCOVERED_RECEPTION_THRESHOLD ; VALUE > RECEPTION THRESHOLD BCS RECEPTION_NORMAL ; YES->RECEPTIONTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5502-L5547PASS_RESULT_CALCS_DEFENDER_NEAR: … LDX PC_PLUS_RECEPTION ; LOAD X WITH PC+REC TABLE VALS LDA PLAYERS_CAN_COLLIDE_BALL_PASS ; LOAD 1st PRIORITY DEFENDER JSR PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) BCC @check_2nd_def_wr_near ; 1ST DEFENDER CANT DEFEND->2ND DEFENDER WITH WR CHECK … CMP #COVERED_INTERCEPTION_THRESHOLD ; VALUE < INTERCEPTION THRESHOLD BCC INTERCEPTION_NORMAL ; YES-> BALL INTERCEPTED … CMP #COVERED_RECEPTION_THRESHOLD ; VALUE > RECEPTION THRESHOLD BCC BALL_TIPPED_OR_INCOMPLETE ; NO->BALL INCOMPLETE …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5713-L5754PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME: ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) … LDY #INTERCEPTION_INDEX ; SET SKILL INDEX = INTERCEPTTION … LDA pc_rec_value ; LOAD PC+REC OR JUST PC SEC ; SBC INTERCEPTION_VALUES_TABLE,Y ; - INT VALUE VALUE FROM INT ABILITY TABLE BCS @get_final_calculation_value ; LDA #$00 ; MAKES ALWAYS AN INT … JSR HEAVIER_RANDOMIZE ; MORE RANDOM RANDOM # SAVE INTO A REGISTER() ORA #$80 ; MAKE RAND # RANGE (80-FF) …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank31_fixed_bank.asm#L4054-L4077a_register = LOCAL_8 … MULTIPLY_A_TIMES_X: ; 8 BIT MULTIPLY (A times X) RESULT IN $44,45Checked by claude, 2026-10-22 — read the pass-outcome constants, ADD_PASS_CONTROL_SKILL_AND_REC_SKILL, GET_PASS_CONTROL_SKILL_VALUE, the value tables, both result paths, PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME, and the 8-bit multiply at the pinned commit

The multiply shifts the product's high byte into LOCAL_8 (pc_rec_int_result, qb_to_wr_check_value), so the roll is floor(r × X ÷ 256) with r from 128 to 255. Worked example (computed): PC and REC both 50 on the display scale (step 7, 75 each) against INT 50 (65) give X = 85 and rolls from 42 to 84. A computer team facing a human one adds its season boosts to PC, REC, and INT steps, clamped at 15 (L5688-L5697, L5726-L5738). The comment on MAKES ALWAYS AN INT holds only for a roll of 0, which a sum floored at 0 gives.

Cited by: Pass completion, Tecmo Super Bowl

When the target isn't close enough to the ball, nearby defenders can still intercept: each in turn subtracts his INT value from the variable the code names PASS_CONTROL_VALUE and rolls as for a covered pass, intercepting under 14; otherwise the pass is incomplete. This path doesn't call ADD_PASS_CONTROL_SKILL_AND_REC_SKILL, the routine that stores the passer's value in that variable (the close-target and the jump-or-dive paths call it), so it uses whatever player-command argument was last stored there. The disassembly marks it "***MAJOR BUG!!". tecmo-super-bowl/pass-bug

About: Tecmo Super Bowl Pass completion

Value
{
 "interception_below": 14
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5675-L5682ADD_PASS_CONTROL_SKILL_AND_REC_SKILL: ; GET PC TABLE VALUE, REC TABLE VALUE, PC VAL in $DC, PC+REC VAL in $DD() … STA PASS_CONTROL_VALUE ;Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5451-L5470PASS_CONTROL_VALUE = PLAYER_COMMAND_ARG1 ; *** could maybe use local … JSR CHECK_PLAYER_CLOSE_ENOUGH_TO_BALL ; IS PLAYER CLOSE ENOUGH TO BALL() BCC PASS_CALCULATION_TARGET_NOT_CLOSE_TO_BALL ; NO->CHECK IF DEFENDERS CAN INTERCEPT TARGET NOT CLOSE ENOUGH() … TARGET_JUMP_DIVE_PASS_CALC_START: ; PASS TARGET JUMP/DIVE CALCULATIONS() IF PASS RESULT ALREADY RET AND SEC & ClV … CHECK_ANY_DEFENDER_CAN_AFFECT_PASS: ; CHECK IF ANY DEFENDER CAN IMPACT PASS JSR ADD_PASS_CONTROL_SKILL_AND_REC_SKILL ; GET PC TABLE VALUE, REC TABLE VALUE, PC VAL in $DC, PC+REC VAL in $DD()Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L5552-L5588; ***MAJOR BUG!! $DC NOT LOADED WITH PASS CONTROL VALUE ; WILL BE WHATEVER COMMAND ARGUMENT BYTE WAS IN THERE LAST PASS_CALCULATION_TARGET_NOT_CLOSE_TO_BALL: ; CHECK IF DEFENDERS CAN INTERCEPT TARGET NOT CLOSE ENOUGH() … LDX PASS_CONTROL_VALUE ; LOAD X WITH PC VALUE *** BUG LDA PLAYERS_CAN_COLLIDE_BALL_PASS ; LOAD 1ST PRIORITY DEFENDER STATUS + ID JSR PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) … CMP #TARGET_NOT_CLOSE_INT_THRESHOLD ; VALUE < NO WR INTERCEPTION THRESHOLD BCC INTERCEPTION_NORMAL ; YES->INTERCEPTION … JMP BALL_TIPPED_OR_INCOMPLETE ; NO-> BALL TIPPED OR INCOMPLETETecmo Super Bowl (NES), commented disassembly (bruddog) · Bank21_22_play_commands_on_field_logic.asm#L187-L187TARGET_NOT_CLOSE_INT_THRESHOLD = $0EChecked by claude, 2026-10-22 — read NORMAL_PASS_RESULT_CALCULATION, TARGET_JUMP_DIVE_PASS_CALC_START, the not-close path and its comment, and the store to PASS_CONTROL_VALUE in ADD_PASS_CONTROL_SKILL_AND_REC_SKILL (L5682), the only one in bank 21/22 by name, at the pinned commit

PLAYER_COMMAND_ARG1 is the argument byte of the last play-script command (for example the new RS step of setRS, L3129), so the value varies with whatever scripts ran before the throw. The atlas hasn't measured how often the path fires.

Cited by: Pass completion, Tecmo Super Bowl

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. tecmo-super-bowl/com-defense-call

About: Tecmo Super Bowl Play calling

Value
{
 "run_slots": [
  0,
  3
 ],
 "pass_slots": [
  4,
  7
 ],
 "short_yardage_run_chance": "205/256"
}
CodeTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank12_13_sim_update_stats.asm#L4342-L4372DO_COM_DEFENSIVE_PLAY_CALL: ; CHECK FOR COM DEFENSIVE PLAY CALL … LDA DOWN ; IS DOWN = 3RD DOWN CMP #THIRD_DOWN ; BEQ @check_yards_less_three_third_or_fourth_down ; YES->CHECK FOR YDS TO GO <3 ON 3RD ANF 4TH DOWN CMP #FOURTH_DOWN ; IS DOWN = 4TH DOWN … AND #$07 ; MAKE RAND # 0 THRU 7 = EQUAL CHANCE OF ANY PLAY … LDA yards_to_go ; IS YARDS TO FIRST >= 3 CMP #$19 ; LDA yards_to_go + 1 ; …Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank12_13_sim_update_stats.asm#L4123-L4153HEAVY_RUN_80PCT_COM_PLAY_CALL: ; HEAVILY RANDOMIZED PLAY CALL 80% RUN, 20% PASS … CMP #$CD ; RAND # < 0XCD = 80% CHANCE RUN PLAY, 20% PASS BCC @call_random_com_run_play ; YES->CALL RANDOM RUN PLAY … LDA temp_rand_value + 1 ; MAKE PLAY CALL = RANDOM PASS PLAY CALL(4-7) … LDA temp_rand_value + 1 ; MAKE PLAY CALL = RANDOM RUN PLAY CALL (0-3)Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank12_13_sim_update_stats.asm#L4285-L4296CHECK_IF_COM_TAKES_TIMEOUT_ON_DEFENSE: ; COM ON DEFENSE CHECK IF TIMEOUTS NEEDED … BPL DO_COM_DEFENSIVE_PLAY_CALL ; NO->CHECK FOR COM DEFENSIVE PLAY CALLTecmo Super Bowl (NES), commented disassembly (bruddog) · Bank12_13_sim_update_stats.asm#L3468-L3468yards_to_go = LOCAL_5Tecmo Super Bowl (NES), commented disassembly (bruddog) · Bank20_playcall.asm#L1864-L1946yards_for_first = LOCAL_5 … ADC #$50 ; ADD 10 yards … CMP #<FRONT_RIGHT_ENDZONE … SBC LOS_XTecmo Super Bowl (NES), commented disassembly (bruddog) · constants_variables/field_locations.asm#L22-L30FRONT_LEFT_ENDZONE = $0670 … FRONT_RIGHT_ENDZONE = $0990Checked by claude, 2026-10-22 — read DO_COM_DEFENSIVE_PLAY_CALL, the heavy-run routine, the timeout check that falls into it, the yards-to-go alias, its computation on the play-call screen, and the goal-line constants at the pinned commit

$50 is 10 yards (Bank20 L1925), so a yard is 8 units, and the goal lines $0670 and $0990 lie 800 units (100 yards) apart. The distance is clamped at the goal line (L1930-L1938), so its high byte is 0 to 3. After the 16-bit compare with $19, A holds that high byte (less a borrow), and CMP #$39 always branches to the random call. The disassembly's comments don't mark this as a bug; the reading is the atlas's. The computer offense makes the same split with the IF_YARDS_TO_GO_LESS_THAN_EQUAL_TO macro and does reach DO_HEAVY_PASS_80PCT_COM_PLAY_CALL (L3680-L3683).

Cited by: Play calling, Tecmo Super Bowl