Mechanic · simulation · american football
Pass completion
The roll that decides whether a thrown pass is caught, dropped, or intercepted, from the passer's, receiver's, and defenders' ratings.
On this page
Pass completion decides what happens when a pass arrives. Tecmo Super Bowl adds the passer’s pass control value to the receiver’s reception value, and each nearby defender subtracts his interception value before a random roll scaled by the result1. When the target isn’t near the ball, the check reads a leftover value instead of the passer’s2.
- Ratings rollTecmo Super Bowl (1991). PC plus REC less each defender's INT scales a random roll against fixed catch and interception lines.1,2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Tecmo Super Bowl | 1991 | Ratings roll | PC plus REC less each defender's INT scales a random roll against fixed catch and interception lines |
Every claim about this mechanic, by game (2)
References
- ^ abWhen 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.Codebruddog/Tecmo_Super_Bowl_NES_Disassembly
How we know
184COVERED_INTERCEPTION_THRESHOLD = $33 185UNCOVERED_RECEPTION_THRESHOLD = $4F 186COVERED_RECEPTION_THRESHOLD = $50 187TARGET_NOT_CLOSE_INT_THRESHOLD = $0E
Bank21_22_play_commands_on_field_logic.asm lines 184–187 at f3bae0e · upstream ↗ 5675ADD_PASS_CONTROL_SKILL_AND_REC_SKILL: ; GET PC TABLE VALUE, REC TABLE VALUE, PC VAL in $DC, PC+REC VAL in $DD() ⋮ 5679 JSR GET_PASS_CONTROL_SKILL_VALUE ; GET PLAYER PASSING CONTROL INDEX() 5680 TAY ; SET PASSING ABILITY TABLE INDEX 5681 LDA PASSING_VALUES_TABLE,Y ; LOAD PASS CONTROL ABILITY VALUE FROM PASSING ABILITY TABLE 5682 STA PASS_CONTROL_VALUE ; ⋮ 5685 LDY #RECEPTION_INDEX ; SET SKILL INDEX = RECEPTTION ⋮ 5687 TAY ; ⋮ 5692 CLC ; ⋮ 5694 TAY ; ⋮ 5700 LDA RECEPTION_VALUES_TABLE,Y ; LOAD RECEIVING ABILITY VALUE FROM PASSING ABILITY TABLE 5701 CLC ; 5702 ADC PASS_CONTROL_VALUE ; + PASS CONTROL VALUE ⋮
Bank21_22_play_commands_on_field_logic.asm lines 5675–5703 at f3bae0e · upstream ↗ 5972GET_PASS_CONTROL_SKILL_VALUE: ; GET PLAYER PASSING CONTROL SKILL VALUE() 5973 LDY #PASS_CONTROL_INDEX ; LOAD PASS CONTROL SKILL INDEX 5974 JSR GET_PLAYER_SKILL_OR_FACE ; GET SKILL RATING(A=PLAYER, Y=SKILL TO GET, X=TEAM)
Bank21_22_play_commands_on_field_logic.asm lines 5972–5974 at f3bae0e · upstream ↗ 11465PASSING_VALUES_TABLE: ; PASSING_VALUES 11466 .DB $3D,$3F,$41,$43,$45,$47,$49,$4B,$4D,$4F,$51,$53,$55,$57,$59,$5B ⋮ 11468RECEPTION_VALUES_TABLE: ; RECEPTION_VALUES 11469 .DB $3D,$3F,$41,$43,$45,$47,$49,$4B,$4D,$4F,$51,$53,$55,$57,$59,$5B ⋮ 11471INTERCEPTION_VALUES_TABLE: ; INTERCEPTION_VALUES 11472 .DB $33,$35,$37,$39,$3B,$3D,$3F,$41,$43,$45,$47,$49,$4B,$4D,$4F,$51
Bank21_22_play_commands_on_field_logic.asm lines 11465–11472 at f3bae0e · upstream ↗ 5481PASS_RESULT_CALCS_NO_DEFENDER_NEAR: ⋮ 5486 LDA RANDOM_3 ; MAKE RAND # 3D RANGE = 0X80 TO 0XFF 5487 ORA #$80 ; 5488 LDX PC_PLUS_RECEPTION ; LOAD PC+REC 5489 JSR MULTIPLY_A_TIMES_X ; MULTIPLY (A * X) (X-1 to X/2 Stored in $45) 5490 LDA qb_to_wr_check_value ; RANGE = PC+REC-1 to (PC+REC-1)/2 5491 CMP #UNCOVERED_RECEPTION_THRESHOLD ; VALUE > RECEPTION THRESHOLD 5492 BCS RECEPTION_NORMAL ; YES->RECEPTION
Bank21_22_play_commands_on_field_logic.asm lines 5481–5492 at f3bae0e · upstream ↗ 5502PASS_RESULT_CALCS_DEFENDER_NEAR: ⋮ 5505 LDX PC_PLUS_RECEPTION ; LOAD X WITH PC+REC TABLE VALS 5506 LDA PLAYERS_CAN_COLLIDE_BALL_PASS ; LOAD 1st PRIORITY DEFENDER 5507 JSR PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) 5508 BCC @check_2nd_def_wr_near ; 1ST DEFENDER CANT DEFEND->2ND DEFENDER WITH WR CHECK ⋮ 5512 CMP #COVERED_INTERCEPTION_THRESHOLD ; VALUE < INTERCEPTION THRESHOLD 5513 BCC INTERCEPTION_NORMAL ; YES-> BALL INTERCEPTED ⋮ 5516 CMP #COVERED_RECEPTION_THRESHOLD ; VALUE > RECEPTION THRESHOLD 5517 BCC BALL_TIPPED_OR_INCOMPLETE ; NO->BALL INCOMPLETE ⋮ 5520 LDX PC_PLUS_RECEPTION ; LOAD X WITH PC+REC TABLE VALS ⋮ 5522 JSR PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC ⋮ 5527 CMP #COVERED_INTERCEPTION_THRESHOLD ; VALUE < INTERCEPTION THRESHOLD ⋮
Bank21_22_play_commands_on_field_logic.asm lines 5502–5547 at f3bae0e · upstream ↗ 5713PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME: ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) ⋮ 5722 LDY #INTERCEPTION_INDEX ; SET SKILL INDEX = INTERCEPTTION ⋮ 5742 LDA pc_rec_value ; LOAD PC+REC OR JUST PC 5743 SEC ; 5744 SBC INTERCEPTION_VALUES_TABLE,Y ; - INT VALUE VALUE FROM INT ABILITY TABLE 5745 BCS @get_final_calculation_value ; 5746 LDA #$00 ; MAKES ALWAYS AN INT ⋮ 5751 JSR HEAVIER_RANDOMIZE ; MORE RANDOM RANDOM # SAVE INTO A REGISTER() 5752 ORA #$80 ; MAKE RAND # RANGE (80-FF) 5753 JSR MULTIPLY_A_TIMES_X ; MULTIPLY (A * X) 5754 LDA pc_rec_int_result ; RANGE= X-1 to X/2 X = (PC+REC-INT)
Bank21_22_play_commands_on_field_logic.asm lines 5713–5754 at f3bae0e · upstream ↗ 4054a_register = LOCAL_8 ⋮ 4058MULTIPLY_A_TIMES_X: ; 8 BIT MULTIPLY (A times X) RESULT IN $44,45
Bank31_fixed_bank.asm lines 4054–4077 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.
- ^ abWhen 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_VALUEand rolls as for a covered pass, intercepting under 14; otherwise the pass is incomplete. This path doesn't callADD_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!!".Codebruddog/Tecmo_Super_Bowl_NES_DisassemblyrevisedHow we know
5675ADD_PASS_CONTROL_SKILL_AND_REC_SKILL: ; GET PC TABLE VALUE, REC TABLE VALUE, PC VAL in $DC, PC+REC VAL in $DD() ⋮ 5682 STA PASS_CONTROL_VALUE ;
Bank21_22_play_commands_on_field_logic.asm lines 5675–5682 at f3bae0e · upstream ↗ 5451PASS_CONTROL_VALUE = PLAYER_COMMAND_ARG1 ; *** could maybe use local ⋮ 5458 JSR CHECK_PLAYER_CLOSE_ENOUGH_TO_BALL ; IS PLAYER CLOSE ENOUGH TO BALL() 5459 BCC PASS_CALCULATION_TARGET_NOT_CLOSE_TO_BALL ; NO->CHECK IF DEFENDERS CAN INTERCEPT TARGET NOT CLOSE ENOUGH() ⋮ 5466TARGET_JUMP_DIVE_PASS_CALC_START: ; PASS TARGET JUMP/DIVE CALCULATIONS() IF PASS RESULT ALREADY RET AND SEC & ClV ⋮ 5469CHECK_ANY_DEFENDER_CAN_AFFECT_PASS: ; CHECK IF ANY DEFENDER CAN IMPACT PASS 5470 JSR ADD_PASS_CONTROL_SKILL_AND_REC_SKILL ; GET PC TABLE VALUE, REC TABLE VALUE, PC VAL in $DC, PC+REC VAL in $DD()
Bank21_22_play_commands_on_field_logic.asm lines 5451–5470 at f3bae0e · upstream ↗ 5552 ; ***MAJOR BUG!! $DC NOT LOADED WITH PASS CONTROL VALUE 5553 ; WILL BE WHATEVER COMMAND ARGUMENT BYTE WAS IN THERE LAST 5554PASS_CALCULATION_TARGET_NOT_CLOSE_TO_BALL: ; CHECK IF DEFENDERS CAN INTERCEPT TARGET NOT CLOSE ENOUGH() ⋮ 5563 LDX PASS_CONTROL_VALUE ; LOAD X WITH PC VALUE *** BUG 5564 LDA PLAYERS_CAN_COLLIDE_BALL_PASS ; LOAD 1ST PRIORITY DEFENDER STATUS + ID 5565 JSR PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) ⋮ 5568 CMP #TARGET_NOT_CLOSE_INT_THRESHOLD ; VALUE < NO WR INTERCEPTION THRESHOLD 5569 BCC INTERCEPTION_NORMAL ; YES->INTERCEPTION ⋮ 5572 LDX PASS_CONTROL_VALUE ; LOAD X WITH PC VALUE *** BUG ⋮ 5574 JSR PC_REC_INT_ADJUST_BY_RAND_FOR_PASS_OUTCOME ; PC,REC,INT CALCULATION ROUTINE (A=DEFENDER VALUE, X=PC OR PC+REC) ⋮ 5577 CMP #TARGET_NOT_CLOSE_INT_THRESHOLD ; VALUE < NO WR INTERCEPTION THRESHOLD 5578 BCC INTERCEPTION_NORMAL ; YES->INTERCEPTION ⋮
Bank21_22_play_commands_on_field_logic.asm lines 5552–5588 at f3bae0e · upstream ↗ 187TARGET_NOT_CLOSE_INT_THRESHOLD = $0EBank21_22_play_commands_on_field_logic.asm line 187 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