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

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

GameYearHowNote
Tecmo Super Bowl1991Ratings rollPC 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

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

    In the claim ledger

  2. ^ 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_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!!".Codebruddog/Tecmo_Super_Bowl_NES_Disassemblyrevised
    How 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		                = $0E
    
    Bank21_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.

    In the claim ledger

Sources

Code