Mechanic · simulation · sports
Player ratings
Numbers a sports game gives each player for speed, power, and skill, which the game turns into on-field speeds and the odds of its rolls.
On this page
Player ratings are the per-player numbers a sports game keeps for traits such as speed and strength. Tecmo Super Bowl keeps each rating in 16 steps, shown as 6 to 1001 and moves it by the player’s condition. Its running speed, rushing power, and max speed set how fast a player starts, how often he speeds up, and his top speed2.
- Steps into tablesTecmo Super Bowl (1991). 16 steps per rating, shown as 6 to 100, moved by condition; separate speed tables for offense and defense.1,2
Games
| Game | Year | How | Note |
|---|---|---|---|
| Tecmo Super Bowl | 1991 | Steps into tables | 16 steps per rating, shown as 6 to 100, moved by condition; separate speed tables for offense and defense |
Every claim about this mechanic, by game (2)
References
- ^ abTecmo 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.Codebruddog/Tecmo_Super_Bowl_NES_Disassembly
How we know
5039@get_player_skill: ; GET PLAYER SKILL(Y=STARTER ID, A = SKILL TO GET) ⋮ 5042 LSR ; SHIFT RIGHT SINCE TWO SKILLS PER BYTE ⋮ 5045 BCS @save_skill_value ; SKILL IN SECOND NIBBLE? YES-> SKILL IS IN SECOND NIBBLE OF BYTE ⋮ 5049 AND #$0F ; MASK OUT UPPER NIBBLE
Bank31_fixed_bank.asm lines 5039–5050 at f3bae0e · upstream ↗ 5063@add_condition_to_skill: ; UPDATE PLAYER SKILL VALUE BASED ON CONDITION ⋮ 5066 CLC ; FINAL SKILL INDEX= SKILL VALUE INDEX + PLAYER CONDITION 5067 ADC player_addr ; 5068 SEC ; SET FINAL SKILL INDEX = 0, IF FINAL SKILL INDEX <0 5069 SBC #$01 ; ⋮ 5073 CMP #MAX_SKILL + 1 ; SET FINAL SKILL INDEX = 0X0F, IF FINAL SKILL INDEX >0X0F
Bank31_fixed_bank.asm lines 5063–5075 at f3bae0e · upstream ↗ 128BAD_CONDITION = $00 129AVERAGE_CONDITION = $01 130GOOD_CONDITION = $02 131EXCELLENT_CONDITION = $03
constants_variables/constants.asm lines 128–131 at f3bae0e · upstream ↗ 2726SKILL_NUMBER_VALUE_TABLE: ; SKILL VALUES 2727 .WORD $0006, $0013, $0019, $0025, $0031, $0038, $0044, $0050 2728 .WORD $0056, $0063, $0069, $0075, $0081, $0088, $0094, $0100
Bank25_leaders_player_data_pro_bowl_abbrev.asm lines 2726–2728 at f3bae0e · upstream ↗ 2245@draw_skill_number: 2246 LDA skill_value ; LOAD SKILL INDEX 2247 ASL ; SHIFT SINCE EACH ENTRY IS TWO DIGITS 2248 TAY ; LOAD FIRST DIGIT FROM SKILL VALUES 2249 LDA SKILL_NUMBER_VALUE_TABLE+1,Y ;
Bank25_leaders_player_data_pro_bowl_abbrev.asm lines 2245–2249 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.
- ^ abOn 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_BOOSTto its max speed and to its RS and RP steps, capping the steps at 15.Codebruddog/Tecmo_Super_Bowl_NES_DisassemblyrevisedHow we know
1211SET_OFFENSIVE_PLAYER_SKILLS: ; SET OFFENSIVE PLAYER SKILLS ($40 = PLAYER POINTER) ⋮ 1215 LDY #MAX_SPEED_INDEX ; SET SKILL INDEX = MAX SPEED INDEX 1216 JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) 1217 LDA OFF_MAX_SPEED_VALS,Y ; LOAD SPEED VALUE FROM OFFENSIVE MAX SPEED TABLE ⋮ 1220SET_DEFENSIVE_PLAYER_SKILLS: ; SET DEFENSIVE PLAYER SKILLS NORMAL($40 = PLAYER POINTER) 1221 LDY #MAX_SPEED_INDEX ; SET SKILL INDEX = MAX SPEED INDEX 1222 JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) 1223 LDA DEF_MAX_SPEED_VALS,Y ; LOAD SPEED VALUE FROM DEFENSIVE MAX SPEED TABLE ⋮ 1225SET_PLAYER_RUNNING_SPEED: ; SET PLAYER SPEED 1226 LDY #MAX_SPEED ; SET CURRENT PLAYER MAX SPEED = MAX SPEED VALUE ⋮ 1229 JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) ⋮ 1233 JSR GET_PLAYER_SKILL ; GET PLAYER SKILL ( Y= SKILL INDEX) ⋮
Bank27_misc.asm lines 1211–1238 at f3bae0e · upstream ↗ 1146@p1_on_defense: ; P1 ON DEFENSE ⋮ 1149 LDA TEAM_CONTROL_TYPES ; IS P1 PLAYER TYPE = MAN 1150 AND #$F0 ; 1151 BEQ @set_p1_defensive_skills ; YES->SET NORMAL DEFENSE SKILLS ⋮ 1153 LDA TEAM_CONTROL_TYPES ; IS P2 PLAYER TYPE = COA,COM, SKP 1154 AND #$0F ; 1155 BNE @set_p1_defensive_skills ; YES->SET NORMAL DEFENSE SKILLS ⋮ 1158 JSR SET_DEFENSIVE_SKILLS_WITH_COM_BOOST ; SET BOOSTED COM DEFENSIVE RS,RP,MS AND NORMAL HP($40 = PLAYER POINTER)
Bank27_misc.asm lines 1146–1158 at f3bae0e · upstream ↗ 1241SET_DEFENSIVE_SKILLS_WITH_COM_BOOST: ; SET BOOSTED COM DEFENSIVE RS,RP,MS AND NORMAL HP($40 = PLAYER POINTER) ⋮ 1244 LDA DEF_MAX_SPEED_VALS,Y ; LOAD SPEED VALUE FROM DEFENSIVE MAX SPEED TABLE 1245 CLC ; 1246 ADC CPU_DEF_MS_BOOST ; + DEFENSIVE COM MAXIMUM SPEED BOOST ⋮ 1251 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) ⋮ 1256 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)
Bank27_misc.asm lines 1241–1261 at f3bae0e · upstream ↗ 1308ADD_COM_DEF_MS_BOOST: ; ADD COM DEFENSIVE SPEED BOOST INDEX, SET TO MAX VALUE IF TO LARGE(A= MAX SPEED INDEX) 1309 CLC ; = MAX SPEED INDEX 1310 ADC CPU_DEF_MS_BOOST ; + COM DEFENSIVE SPEED BOOST INDEX 1311 CMP #MAX_SKILL + 1 ; IS INDEX < MAX INDEX? ⋮ 1314 LDA #MAX_SKILL ; SET MAXIMUM SPEED SKILL INDEX = MAX INDEX
Bank27_misc.asm lines 1308–1314 at f3bae0e · upstream ↗ 5427OFF_MAX_SPEED_VALS: ; OFFENSIVE_MAX_SPEED_VALUES 5428 .DB $15, $16, $17, $18, $19, $1A, $1B, $1C 5429 .DB $1D, $1E, $1F, $20, $21, $22, $23, $24 ⋮ 5431DEF_MAX_SPEED_VALS: ; DEFENSIVE_MAX_SPEED_VALUES 5432 .DB $25, $26, $27, $28, $29, $2A, $2B, $2C 5433 .DB $2D, $2E, $2F, $30, $31, $32, $33, $34
Bank31_fixed_bank.asm lines 5427–5433 at f3bae0e · upstream ↗ 423RESET_CURRENT_SPEED_RP_TO_INITIAL_VALUES: ; INITIALIZE PLAYER RUSHING POWER AND CURRENT SPEED TO DEFAULT VALUES ⋮ 428 LDA RUSHING_POWER_VALUES_TABLE,Y ; SET PLAYER RUSHING POWER COUNTER FROM RUSHING POWER TABLE ADDR + SKILL INDEX OFFSET ⋮ 433 LDA RUNNING_SPEED_VALUES_TABLE,Y ; SET PLAYER RUSHING CURRENT SPEED = STARTING SPEED TABLE ADDR + SKILL INDEX OFFSET
Bank21_22_play_commands_on_field_logic.asm lines 423–434 at f3bae0e · upstream ↗ 440UPDATE_RP_CNT_AND_CUR_SPEED_THEN_COLL_CHECK: ; CHECK FOR PLAYER MOVING AND UPDATE SPEED. IF MOVING RP= RP - 1 441 RETURN_PLAYER_ACTIONS_IN_1_FRAME ⋮ 452 BNE COLL_CHECK_START ; RUSHING POWER COUNTER > 0 YES->COLLISION CHECK START. ⋮ 459 LDA RUSHING_POWER_VALUES_TABLE,X ; SET PLAYER RUSHING POWER COUNTER = FROM RUSHING POWER TABLE ADDR + SKILL INDEX OFFSET ⋮ 467 CMP (CURRENT_PLAYER_ADDR),Y ; PLAYER CURRENT SPEED >= MAX SPEED? 468 BCS COLL_CHECK_START ; YES->COLLISION CHECK START ⋮ 471 CLC ; NO->PLAYER CURRENT SPEED++ 472 ADC #$01 ;
Bank21_22_play_commands_on_field_logic.asm lines 440–475 at f3bae0e · upstream ↗ 11366RUSHING_POWER_VALUES_TABLE: ;RUSHING_POWER_VALUES 11367 .DB $0D,$0C,$0B,$0A,$09,$08,$07,$06,$05,$04,$03,$03,$02,$02,$01,$01 ⋮ 11369RUNNING_SPEED_VALUES_TABLE: ;RUNNING_SPEED_VALUES 11370 .DB $0E,$0F,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B,$1C,$1D
Bank21_22_play_commands_on_field_logic.asm lines 11366–11370 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