here is a 32-team NES TSB rom I've recently edited, and would like to share: "Champs - Flops" each NFL franchises best team, from 2002 to 2022.
At least one team from each year (from 2002 to 2022 season) is represented; but no more than two teams for any given year. Yes, compromises have been made to make the game balanced and follow this format/outline. The teams have been "scaled" so that Super Bowl winners usually have better players or more "balanced" teams than Super Bowl losers, etc.
There are no real major hacks, and it plays just like original. PC is completion and PA is target. Quickness does nothing (however, it has been rated for "incompletions", but I did not implement that hack, Interception does everything). RT and SS speed is KR and PR speed.
I tried to make team tiers similar to original NES TSB, so you will find "pro bowl" players with 44MS, for example, as well as other players on a Champion team with somewhat "inflated" attributes. If there was a judgement call on ratings (and there were dozens) then the Champion got the better ratings, usually. Yes, there are a few teams that are Over-Powered (2004 Patriots, 2013 Seahawks, for example), like the original.
but essentially, the player attributes are distributed and scaled to match original TSB, within reason. for example, the original game had four 44/56/75 RCB, and accordingly there are four here (except there is no 75MS RB or 56MS QB here...), etc.
in my opinion, the only big difference from original TSB is that base Hitting Power for RCB/LCB is 13 HP, with all-pro RCB/LCB getting automatic 31HP.
Great news... I discovered how to change player names and abilities in the September version of Tecmo Super Bowl 1 on Sega Genesis..
Now I can edit the hack and still use the cartridge battery to save the season's progress.
and I can also use TSBM2000, as a basis for creating player data... but to apply it to the final rom with save, I first need to save it in the rom without save, which accepts being edited by TSBM2000, and then just copy and paste the data to the version with save and adjust the offsets to start the skills.
at offset 00004060 we will have the value of the beginning of the organization of the player name offsets (this TSBM2000 will do for us automatically) it will take to offset 00005862 - which is the organization of numbers + player names.
at offset 00004064, we will have the beginning of the players' skills, and this value that is in this offset must be adjusted according to the end of the players' names (because in the edition, the number of characters of the players' letters will inevitably be greater than the original, but This doesn't cause a problem because we have plenty of space in the ROM for that)...
important warning, when tsbm2000 exports the data it does not place a division between the end of the names and the beginning of the skills. and this creates a problem in the version of the rom with save... and to solve this it was necessary to map where the difference was, Luckily it was just at the end of the names... the last name will always be that of the last DB of sf49ers, then you need to put an FF in the code and then paste the skills that come from TSBM2000.
It seems complicated, but it's actually quite simple... First, map the numbers and names of the players and then the skills... and take it from the rom that allows it to be edited in TSBM2000 and then put it in the version that has the save.
at offset 00005862, starts the mapping and the number and name off the players... (you can copy and paste form the rom edited o TSBM2000), after the end od names, insert the cod FF, then paste the codes os TSBM2000 for the players abilitys.
from the FF up (Yellow, is the number and name of the players), from the FF down (Blue, are the players' skills)
Well, I was successful in making these edits, now I'm going to work on making all the changes I had shown in previous posts now in the saved version, and when I'm finished sharing the results again here.
hugs and happy new year holidays to everyone.
This is jus to demonstrates that the edit works (i will change the Oilers to Ravens on the final version os the hack)
I am trying to catalog all the roster errors in the original Tecmo Super Bowl and so far, this is the list of changes I have identified:
Summary of changes to-date:
Change BUF QB QB Bills to Jim Kelly
Change IND LB Fredd Young's face from 31 (light) to A2 (dark)
Change N.E. WR Greg McMurty to Greg McMurtry, change number from 19 to 86
Change CLE QB QB Browns to Bernie Kosar
Change HOU WR Haywood Jeffries to Haywood Jeffires
Change WAS OG Raleigh Mckenzie's face from 2B (light) to 80 (dark)
Change NYG WR Stacey Robinson to Stacy Robinson
Change PHI QB QB Eagles to R. Cunningham
Change PHX P Rich Camarillo's face from 1B (light) to AA (dark)
Change N.O. QB Steve Walsh number from 3 to 4
Change N.O. WR Brent Perriman to Brett Perriman
Change BUF QB QB Bills to Jim Kelly
Change IND LB Fredd Young's face from 31 (light) to A2 (dark)
Change N.E. WR Greg McMurty to Greg McMurtry, change number from 19 to 86
Change CLE QB QB Browns to Bernie Kosar
Change HOU WR Haywood Jeffries to Haywood Jeffires
Change WAS OG Raleigh Mckenzie's face from 2B (light) to 80 (dark)
Change NYG WR Stacey Robinson to Stacy Robinson
Change PHI QB QB Eagles to R. Cunningham
Change PHX P Rich Camarillo's face from 1B (light) to AA (dark)
bruddog - I went all over this and already fixed it. the logic path leads to loop22. in loop22, after the scores are Compared (A5A0 C59F), there is a BCC (branch if carry clear) to Loop27 if offense winning. then following that another BCC (9003) that won't get used because if the offense is losing or tied, the C flag won't be Clear. finally, it takes you to Loop40 where the offense is bound to run a play.
basically, there should have been a "Greater Than (winning) or Equal To (tied)" check. the original programming only has the "greater than" part.
Luckily, you can just overwrite that worthless BCC 9003 to an actual BEQ (branch if equal) F035 and jump to Loop27 - the same actions would be taken as if COM were winning (if ball is >= 50 yd line, will punt).
I've been testing this for the past 3 days and run multiple tests and scenarios. it works.
The player scripts for fumble and and interception returns are the same.
I forget if the defense (team that was on offense before the turnover) also share the same scripts.
The main reason why returning things suck so much unhacked is because you are facing the equivalent of 11 LT’s on the field since every offensive player has 69 rp.
There aren’t any special hard coded speeds for fumble/interception returns. Its all boosting or resetting the current players speeds to their default rating values.
ROM I'm working on...both MAN and COM are way too fast returning fumbles (whether the offense or defense recovers)...I assume that it shares a location with some other speed.
Probably also need location of the defenders (team that doesn't have the ball - for both offense and defense) speed after the other team gets the fumble recovery. (because maybe the solution is to Boost this to better match fumble returners speed instead)
yes you did miss something, what you are describing is not the problem that was solved. the name of the thread sheds light as to what was solved...TIE
this modification specifically addresses "COM to punt when: 4th quarter, less than 2 minutes left, it's 4th down, the game is tied, and ball is located >= 50 yd line"
Figured I'd update this info to cover the 32 team rom, too.
TEAM DATA screen:
x1E943 - x1E960 - TEXT POSITION and pointers (this however is set by Divisions) adjusts position of an entire division on screen.
x1F8B5 - x1F95F - TEXT FORMAT (***affects all menus!) Every 3 bytes correspond to a team. First offset is for the format, next is the team shown, and the final offset is for the "space" between texts. This data structure is in a variable length and is FE terminated. So, inputting FE will close the DIVISION, thus removing any text from that point. **THIS IS BUF-ATL ORDER; first all AFC, then NFC. *This will also affect the TEXT on the TEAM CONTROL/ PRESEASON screens! This area also covers the 32 team rom.
x22C36 - x22C53 - TEAM SELECTED ROSTER shown when "accessed", ordered by "ROWS": 00 05 09...in this order (EAST/ CENTRAL/ WEST) / 32 team order 00 04 08 0C...(EAST/NORTH/SOUTH/WEST) / 32 team (13=Dal. 17=Min. 1B=Car. 21=Ari.) rom locations start at x3F896 - x3F899...same hex locations as PRESEASON MENU!
x23B4B - x23B94 - CURSOR SETUP (X:Y coordinates) Every 2 bytes correspond to a team. First offset "X", and the following the "Y". (AFC: x23B4D, NFC: x23B53) Teams start at offset x23B59, ordered by "ROWS" (E/ C/ W) / 32 team (Dal. Min. Car. and Ari.) rom locations start at x3F87A - x3F881.
x23D21 - x23D58 - MINI HELMET coordinates. Every helmet uses 2 bytes (Y:X). The X seems to be multiplied by 2 to get the actual placement coordinate. **THIS IS BUF-ATL ORDER; first all AFC, then NFC. / 32 team rom locations - all NFC WEST team locations start at x3F6E7 - x3F6EE (S.F. Stl. Sea. Ari.).
PRESEASON screen:
x1E23F - x1E25C - TEXT POSITION and pointers (this however is set by Divisions) adjusts position of an entire division on screen.
x22C13 - x22C30 - TEAM SELECTED. Team that will appear on field, ordered by "ROWS": 00 05 09...(EAST/ CENTRAL/ WEST) / 32 team order 00 04 08 0C...(EAST/NORTH/SOUTH/WEST) / 32 team (13=DAL. 17=Min. 1B=Car. 21=Ari.) rom locations start at x3F896 - x3F899...same hex locations as TEAM DATA MENU!
x23CE9 - x23D20 - MINI HELMET coordinates. every helmet uses 2 bytes (Y,X). the X seems to be multiplied by 2 to get the actual placement coordinate **THIS IS BUF-ATL ORDER, first all AFC, then NFC. (***this will also affect the MINI helmets on the TEAM CONTROL screen!) / 32 team rom locations - all NFC WEST teams start at x3F6EF - x3F6F6 (S.F. Stl. Sea. Ari.).
x23E95 - x23ED0 - CURSOR SETUP (X:Y coordinates) Every 2 bytes correspond to a team. First offset "X", and the following the "Y". ordered by "ROWS" (E/ C/ W) / 32 team (Car. Ari.) rom locations start at x3F882 - x3F885.
TEAM CONTROL screen:
x1E345 - x1E362 - TEXT POSITION and pointers (this however is set by Divisions) adjusts position of an entire division on screen.
x325BF - x325D9 - TEAMS ORDER, ordered by "ROWS" (E/ C/ W) Team that will appear on field ordered by "ROWS": 00 05 09...(EAST/ CENTRAL/ WEST) / 32 team order 00 04 08 0C...(EAST/NORTH/SOUTH/WEST) / 32 team (1B=Car. 21=Ari.) rom locations start at x32C63 - x32C64.
x328F3 - x3292E - CURSOR SETUP (X:Y coordinates) Every 2 bytes correspond to a team. First offset "X", and the following the "Y". ordered by "ROWS" (E/ C/ W) / 32 team (Car. and Ari.) rom locations start at x3F886 - x3F889.
x3292F - x32966 - SKP/MAN/COM/COA TEXT coordinates. First offset "X", and the following the "Y". BUT it is set into Tile-BLOCKS. **THIS IS BUF-ATL ORDER, first all AFC, then NFC. / 32 team rom locations - all NFC WEST teams (S.F., Stl., Sea. and Ari.) start at x32C4B - x32C52.
This thread by @bruddogis the rabbit hole you are looking to fall into:
Here are some quick links for your specific questions:
TSB ROM Hex Location Index
Various ROM Hex Locations
TSB Team Pointer Info
If spreadsheets are your thing, this thread is a must read:
I also posted up a cheat sheet of various set commands you can try out with TSB Tool:
Happy to hear you have the itch again! Here are some of the editors I have been using:
1. General Team Stats editing - I use TSB Tool for the team names, abbreviations, playbooks, team and player sim codes, Pro Bowl rosters, season schedule and setting return men. I use a spreadsheet to edit the rosters, save to a .csv file, clean it up in a text file and then paste the rosters into TSB Tool.
2. Small & Large Helmet Editing & 4. General Graphics Editing - There is no editor that works with the mini and large helmets specifically that works. The best editors seem to be YY-CHR and Tile Layer Pro.
3. Schedule Editing - As of now I edit it using TSB Tool. For custom schedules like the NCAA release I used the schedule maker over at FootballGuys.com It's a bit limited though (can't make a 17 week season for a 32 team 8 division schedule, they cap it at 2 divisions for 32 teams).
These are the essentials I use when editing:
TSBTool 1.0.0.3
TSB Playbook Editor Beta03
Lunar IPS
Translhextion
TSB Play Editor
YY-CHR
Tecmo Endzone Editor
Tecmo Hack Setter
Via this thread here is the logic that, among other things, breaks down OT.
The code will check to see if it's the playoffs and jump to OT with no clock. Else it will go to a timed 5th quarter.
This hack removes the logic check and will go to untimed playoff type OT for all games including pre-season, regular season, and pro bowl.
OK. Thanks to a steady supply of the Banquet Beer (on Christmas eve) and my love for the game (and SBlueman), I took a stab at mapping the COM play-picking logic section (by hand on paper and a spreadsheet) using the info/code pasted at the very bottom of this post . I'm not sure where I got it, maybe jstout or probably cxrom. After an hour or so of chicken scratch and flow charts on multiple sheets of paper, I believe I narrowed the situation that SBlueman describes to "Loop22". Loop22 neglects the option for a "tie" scenario and assumes the COM will run a play if the score is presently tied.
Go to 0x0187F6 (this is "Loop22") because I believe that the problem and solution can be found inside this loop. First I will go over what logic brings us to Loop22 and then the way Loop22 works. Then I will offer my solution.
To arrive at Loop22, first we start at Loop1 which is located at 0x18714.
Since it is 4th Quarter, we end up at Loop3.
Then it goes to loop 5 or 10, but eventually Loop5 ends up at Loop10 anyways.
Then, since it is 4th Down, we go to Loop16.
From here, if the ball is at or beyond the 41 yard line, it heads to Loop22.
So, we arrive at Loop22 because: it is the 4th Quarter, it's 4th Down, and the ball is located at or beyond the 41 yard line.
Now looking at Loop22, which is located at 0x0187F6:
A576, LDA QUARTER
C903, CMP FOURTH_QUARTER
D011, BNE @Loop23 If NOT 4th Quarter go to Loop23
A56B, LDA QUARTER_MINUTES
C902, CMP #$02
B02F, BCS @Loop26 if Time >= 2 minutes, go to Loop26
A5A0, LDA SCORE_DEFENSE
C59F, CMP SCORE_OFFENSE
9037, BCC @Loop27 if Offense score > Defense score, go to Loop27
9003, BCC @Loop23 I'm not sure what this is here for, but the C flag won't be clear if the score is tied or def > offense! So this is wasted/useless code, I believe?
4CF1A8 JMP @Loop40 This goes through a quite involved routine that ends up selecting a play - and this is where it will go if the score is tied or offense is losing...it runs a play...good if losing, but bad if tied.
See what happens after it loads the scores? It only cares if the offense is "winning" (essentially ignores a "tie") - anyways, Loop27 would eventually Punt in this situation, following the logic/location of ball. However, the COM AI goes on to Loop40...which will always call a play.
So, in this scenario (score is tied) we really need to add Offense Score "> or =" Defense Score (with the "equal to" being the emphasis here, since the score is tied). Luckily, we have that extra/wasted 9003 BCC space for an extra branch BEQ command!
See below, I overwrote that last 9003 BCC with a new BEQ (branch if equal, ie "tied") f035, jump to Loop27 (which would eventually Punt in this situation). *Note: Loop27 is not the "Punt Subroutine" (that is Loop25). However, following Loop27's progression, COM would end up Punting in the situation described by SBlueman (if the ball is located >= 50 yd line).
In conclusion, to get the COM to punt when: 4th quarter, less than 2 minutes left, it's 4th down, the game is tied, and *ball is located >= 50 yd line (*this is within Loop27):
try overwriting 0x018808 to xf035. This will Branch if "Offense Score = Defense Score", to Loop27, which would eventually lead to a Punt in this situation (if ball is >= 50 yd line, see Loop27).
I might be wrong on this! But it makes sense to me - and I have play-tested this with some save states, and it seems to work well (game tied, 4th quarter less than 2 min, 4th down = PUNT) but without this "fix", COM would run a play. Try it!
peace
hex L_12_A6F3:
A900 " LDA" #$00
8540 " STA" $40 ; PLAY CALL
8541 " STA" $41 ; BYTE HOLDER
853E " STA" $3E ; BYTE HOLDER
853F " STA" $3F ; BYTE HOLDER
A59E " LDA" OFFENSE_DEFENSE_TOGGLE
1003 " BPL" @Loop1 ; Go if Offense
4CEFAA " JMP" @Loop74 ; Go if Defense
; Offensive Code
@Loop1:
A576 " LDA" QUARTER
C900 " CMP" FIRST_QUARTER
D003 " BNE" @Loop2 ; Go if not First Quarter
4C9FA7 " JMP" @Loop16 ; Go if First Quarter
@Loop2:
C902 " CMP" THIRD_QUARTER
D003 " BNE" @Loop3 ; Go if not Third Quarter
4C9FA7 " JMP" @Loop16 ; Go if Third Quarter
@Loop3:
A569 " LDA" CLOCK_STOPPED_OR_RUNNING
1047 " BPL" @Loop10 ; Go if Clock is Stopped
A5A1 " LDA" NUMBER_TIMEOUTS
F043 " BEQ" @Loop10 ; Go if Out of Time-Outs
A576 " LDA" QUARTER
C901 " CMP" SECOND_QUARTER
D009 " BNE" @Loop5 ; Go if not Second Quarter
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B037 " BCS" @Loop10 ; Go if >= 2 Minutes
901D " BCC" @Loop7 ; Go if < 2 Minutes
@Loop4:
60 " RTS" ; Return
@Loop5:
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B008 " BCS" @Loop6 ; Go if >= 2 Minutes
A5A0 " LDA" SCORE_DEFENSE
C59F " CMP" SCORE_OFFENSE
9028 " BCC" @Loop10 ; Go if Offense is > Points
B017 " BCS" @Loop8 ; Go if Defense is >= Points
@Loop6:
A56B " LDA" QUARTER_MINUTES
C903 " CMP" #$03
B020 " BCS" @Loop10 ; Go if >= 3 Minutes
A5A0 " LDA" SCORE_DEFENSE
C59F " CMP" SCORE_OFFENSE
901A " BCC" @Loop10 ; Go if Offense is > Points
B000 " BCS" @Loop7 ; Go if Defense is >= Points
@Loop7:
209DAB " JSR" L_12_AB9D ; Random
C9C0 " CMP" #$C0
B011 " BCS" @Loop10 ; Go if Random >= xC0 (25% Chance)
9007 " BCC" @Loop9 ; Go if Random < xC0 (75% Chance)
@Loop8:
C09DAB " JSR" L_12_AB9D ; Random
C9F0 " CMP" #$F0
B008 " BCS" @Loop10 ; Go if Random >= xF0 (6.25% Chance)
@Loop9:
A569 " LDA" CLOCK_STOPPED_OR_RUNNING
297F " AND" #$7F
8569 " STA" CLOCK_STOPPED_OR_RUNNING ; Stop Clock
C6A1 " DEC" NUMBER_TIMEOUTS ; Call Time-Out
@Loop10:
A577 " LDA" DOWN
C906 " CMP" FOURTH_DOWN
F03A " BEQ" @Loop16 ; Go if 4th Down
A544 " LDA" CURRENT_YARDLINE_LO
C941 " CMP" #$41
A545 " LDA" CURRENT_YARDLINE_HI
C901 " SBC" #$01
B050 " BCS" @Loop18 ; Go if >= 40.125 Yard-Line
4C68A9 " JMP" @Loop50 ; Go if < 40.125 Yard-Line
@Loop11:
A542 " LDA" YARDS_TO_GO_LO
C909 " CMP" #$09
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
9003 " BCC" @Loop12 ; Go if < 1.125 Yards to Go
4C56AA " JMP" @Loop65 ; Go if >= 1.125 Yards to Go
@Loop12:
4C1BAA " JMP" @Loop62 ; Go
@Loop13:
A542 " LDA" YARDS_TO_GO_LO
C919 " CMP" #$19
A543 " LDA" YARDS_TO_GO_HI
C900 " SBC" #$00
B003 " BCS" @Loop14 ; Go if >= 3.125 Yards to Go
4C1BAA " JMP" @Loop62 ; Go if < 3.125 Yards to Go
@Loop14:
A542 " LDA" YARDS_TO_GO_LO
C939 " CMP" #$39
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
B003 " BCS" @Loop15 ; Go if >= 7.125 Yards to Go
4C56AA " JMP" @Loop65 ; Go if < 7.125 Yards to Go
@Loop15:
4CE8A9 " JMP" @Loop60 ; Go
@Loop16:
A577 " LDA" DOWN
C903 " CMP" FOURTH_DOWN
D00D " BNE" @Loop17 ; Go if not 4th Down
A544 " LDA" CURRENT_YARDLINE_LO
C948 " CMP" #$48
A545 " LDA" CURRENT_YARDLINE_HI
E901 " SBC" #$01
B037 " BCS" @Loop22 ; Go if >= 41 Yard-Line
4C60A8 " JMP" @Loop30 ; Go if < 41 Yard-Line
@Loop17:
A544 " LDA" CURRENT_YARDLINE_LO
C919 " CMP" #$19
A545 " LDA" CURRENT_YARDLINE_HI
E900 " SBC" #$00
B003 " BCS" @Loop18 ; Go if >= 3.125 Yard-Line
4CA8A9 " JMP" @Loop57 ; GO if < 3.125 Yard-Line
@Loop18:
A544 " LDA" CURRENT_YARDLINE_LO
C929 " CMP" #$29
A545 " LDA" CURRENT_YARDLINE_HI
E900 " SBC" #$00
B003 " BCS" @Loop19 ; Go if >= 5.125 Yard-Line
4C1BAA " JMP" @Loop62 ; Go if < 5.125 Yard-Line
@Loop19:
A544 " LDA" CURRENT_YARDLINE_LO
C9F8 " CMP" #$F8
A545 " LDA" CURRENT_YARDLINE_HI
E902 " SBC" #$02
9003 " BCC" @Loop20 ; Go if < 95 Yard-Line
4C1BAA " JMP" @Loop62 ; Go if >= 95 Yard-Line
@Loop20:
A577 " LDA" DOWN
D003 " BNE" @Loop21 ; Go if not 1st Down
4C56AA " JMP" @Loop65 ; Go if 1st Down
@Loop21:
C901 " CMP" SECOND_DOWN
F08E " BEQ" @Loop11 ; Go if 2nd Down
D09C " BNE" @Loop13 ; Go if not 2nd Down
@Loop22:
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
D011 " BNE" @Loop23 ; Go if not Fourth Quarter
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B02F " BCS" @Loop26 ; Go if >= 2 Minutes
A5A0 " LDA" SCORE_DEFENSE
C59F " CMP" SCORE_OFFENSE
9037 " BCC" @Loop27 ; Go if Offense > Points
9003 " BCC" @Loop23 ; NEVER GO
4CF1A8 " JMP" @Loop40 ; Go if Defense >= Points
@Loop23:
A576 " LDA" QUARTER
C901 " CMP" SECOND_QUARTER
F004 " BEQ" @Loop24 ; Go if Second Quarter
C904 " CMP" OVERTIME
D028 " BNE" @Loop27 ; Go if not Overtime
@Loop24:
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B022 " BCS" @Loop27 ; Go if >= 2 Minutes
A544 " LDA" CURRENT_YARDLINE_LO
C991 " CMP" #$91
A545 " LDA" CURRENT_YARDLINE_HI
C901 " SBC" #$01
B003 " BCS" @Loop25 ; Go if >= 50.125 Yard-Line
4CF1A8 " JMP" @Loop40 ; Go if < 50.125 Yard-Line
@Loop25:
A908 " LDA" PUNT
8540 " STA" $40 ; Punt Play Call
4C2AA7 " JMP" @Loop4
@Loop26:
A5A0 " LDA" SCORE_DEFENSE
38 " SEC"
E59F " SBC" SCORE_OFFENSE
9007 " BCC" @Loop27 ; Go if Offense > Points
C90A " CMP" #$0A
9003 " BCC" @Loop27 ; Go if < 10 Point Difference
4CF1A8 " JMP" @Loop40 ; Go if >= 10 Point Difference
@Loop27:
A544 " LDA" CURRENT_YARDLINE_LO
C991 " CMP" #$91
A545 " LDA" CURRENT_YARDLINE_HI
E901 " SBC" #$01
B0E1 " BCS" @Loop25 ; Go if >= 50.125 Yard-Line
A542 " LDA" YARDS_TO_GO_LO
C929 " CMP" #$29
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
900C " BCC" @Loop28 ; Go if < 5.125 Yards to Go
A576 " LDA" QUARTER
C904 " CMP" OVERTIME
D0D1 " BNE" @Loop25 ; Go if not Overtime
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
90CB " BCC" @Loop25 ; Go if < 2 Minutes
@Loop28: Punt or
20A3AB " JSR" L_12_ABA3 ; Random
C980 " CMP" #$80
90C4 " BCC" @Loop25 ; Go if Random < x80 (50% Chance)
4CF1A8 " JMP" @Loop40 ; Go if Random >= x80 (50% Chance)
@Loop29:
A909 " LDA" FIELD_GOAL
8540 " STA" $40 ; Field Goal Play Call
4C2AA7 " JMP" @Loop4
@Loop30:
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
D04C " BNE" @Loop35 ; Go if not Fourth Quarter
A5A0 " LDA" SCORE_DEFENSE
38 " SEC"
E59F " SBC" SCORE_OFFENSE
9045 " BCC" @Loop35 ; Go if Offense > Points
C904 " CMP" #$04
9041 " BCC" @Loop35 ; Go if < 4 Point Difference
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
900F " BCC" @Loop31 ; Go if < 2 Minutes
A542 " LDA" YARDS_TO_GO_LO
C911 " CMP" #$11
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
9005 " BCC" @Loop31 ; Go if < 2.125 Yards to Go
9003 " BCC" @Loop31 ; NEVER GO
4C5BA9 " JMP" @Loop48 ; Go if >= 2.125 Yards to Go
@Loop31:
A544 " LDA" CURRENT_YARDLINE_LO
C919 " CMP" #$19
A545 " LDA" CURRENT_YARDLINE_HI
E900 " SBC" #$00
B003 " BCS" @Loop32 ; Go if >= 3.125 Yard-Line
4CA8A9 " JMP" @Loop57 ; Go if < 3.125 Yard-Line
@Loop32:
A544 " LDA" CURRENT_YARDLINE_LO
C929 " CMP" #$29
A545 " LDA" CURRENT_YARDLINE_HI
E900 " SBC" #$00
B003 " BCS" @Loop33 ; Go if >= 5.125 Yard-Line
4C1BAA " JMP" @Loop62 ; Go if < 5.125 Yard-Line
@Loop33:
A544 " LDA" CURRENT_YARDLINE_LO
C9F8 " CMP" #$F8
A545 " LDA" CURRENT_YARDLINE_HI
E902 " SBC" #$02
9003 " BCC" @Loop34 ; Go if < 95 Yard-Line
4C1BAA " JMP" @Loop62 ; Go if >= 95 Yard-Line
@Loop34:
B003 " BCS" @Loop35 ; NEVER GO
4C82A7 " JMP" @Loop13 ; Go
@Loop35:
A542 " LDA" YARDS_TO_GO_LO
C909 " CMP" #$09
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
B015 " BCS" @Loop36 ; Go if >= 1.125 Yards to Go
A5A0 " LDA" SCORE_DEFENSE
C59F " CMP" SCORE_OFFENSE
9097 " BCC" @Loop29 ; Go if Offense > Points
A544 " LDA" CURRENT_YARDLINE_LO
C9A1 " CMP" #$A1
A545 " LDA" CURRENT_YARDLINE_HI
E900 " SBC" #$00
B08D " BCS" @Loop29 ; Go if >= 20.125 Yard-Line
B003 " BCS" @Loop36 ; NEVER GO
4C5BA9 " JMP" @Loop48 ; Go if < 20.125 Yard-Line
@Loop36:
A542 " LDA" YARDS_TO_GO_LO
C910 " CMP" #$10
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
9003 " BCC" @Loop37 ; Go if < 2 Yards to Go
4C59A8 " JMP" @Loop29 ; Go if >= 2 Yards to Go
@Loop37:
A5A0 " LDA" SCORE_DEFENSE
38 " SEC"
E59F " SBC" SCORE_OFFENSE
B003 " BCS" @Loop38 ; Go if Defense >= Points
4C59A8 " JMP" @Loop29 ; Go if Offense > Points
@Loop38:
C911 " CMP" #$11
B003 " BCS" @Loop39 ; Go if >= 17 Point Difference
4C59A8 " JMP" @Loop29 ; Go if < 17 Point Difference
@Loop39:
B06A " BCS" @Loop48 ; Go
@Loop40:
A544 " LDA" CURRENT_YARDLINE_LO
C991 " CMP" #$91
A545 " LDA" CURRENT_YARDLINE_HI
E901 " SBC" #$01
B037 " BCS" @Loop46 ; Go if >= 50.125 Yard-Line
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
D01C " BNE" @Loop43 ; Go if not Fourth Quarter
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B054 " BCS" @Loop48 ; Go if >= 2 Minutes
A5A0 " LDA" SCORE_DEFENSE
38 " SEC"
E59F " SBC" SCORE_OFFENSE
B003 " BCS" @Loop41 ; Go if Defense >= Points
4C82A7 " JMP" @Loop13 ; Go if Offense > Points
@Loop41:
C904 " CMP" #$04
B003 " BCS" @Loop42 ; Go if >= 4 Point Difference
4C59A8 " JMP" @Loop29 ; Go if < 4 Point Difference
@Loop42:
9003 " BCC" @Loop43 ; NEVER GO
4C82A7 " JMP" @Loop13 ; Go
@Loop43:
A576 " LDA" QUARTER
C901 " CMP" SECOND_QUARTER
F004 " BEQ" @Loop44 ; Go if Second Quarter
C904 " CMP" OVERTIME
D034 " BNE" @Loop48 ; Go if not Overtime
@Loop44:
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B003 " BCS" @Loop45 ; Go if >= 2 Minutes
4C59A8 " JMP" @Loop29 ; Go if < 2 Minutes
@Loop45:
B029 " BCS" @Loop48 ; Go
@Loop46:
A544 " LDA" CURRENT_YARDLINE_LO
C998 " CMP" #$98
A545 " LDA" CURRENT_YARDLINE_HI
E901 " SBC" #$01
9003 " BCC" @Loop47 ; Go if < 51 Yard-Line
4C82A7 " JMP" @Loop13 ; Go if >= 51 Yard-Line
@Loop47:
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
D016 " BNE" @Loop48 ; Go if not Fourth Quarter
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
D010 " BNE" @Loop48 ; Go if not 2 Minutes
A5A0 " LDA" SCORE_DEFENSE
38 " SEC"
E59F " SBC" SCORE_OFFENSE
9009 " BCC" @Loop48 ; Go if Offense > Points
C904 " CMP" #$04
9005 " BCC" @Loop48 ; Go if < 4 Point Difference
9003 " BCC" @Loop48 ; NEVER GO
4C82A7 " JMP" @Loop13 ; Go if >= 4 Point Difference
@Loop48:
20A9AB " JSR" L_12_ABA9 ; Random
C980 " CMP" #$80
B003 " BCS" @Loop49 ; Go if Random >= x80 (50% Chance)
4C59A8 " JMP" @Loop29 ; Go if Random < x80 (50% Chance)
@Loop49:
4C82A7 " JMP" @Loop13 ; Go
@Loop50:
A56B " LDA" QUARTER_MINUTES
B023 " BNE" @Loop54 ; Go if not 0 Minutes
A56A " LDA" QUARTER_SECONDS
C930 " CMP" #$30
B01D " BCS" @Loop54 ; Go if >= 30 Seconds
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
F003 " BEQ" @Loop51 ; Go if Fourth Quarter
4C59A8 " JMP" @Loop29 ; Go if not Fourth Quarter
@Loop51:
A5A0 " LDA" SCORE_DEFENSE
38 " SEC"
E59F " SBC" SCORE_OFFENSE
B003 " BCS" @Loop52 ; Go if Defense >= Points
4C9FA7 " JMP" @Loop16 ; Go if Offense > Points
@Loop52:
C904 " CMP" #$04
B003 " BCS" @Loop53 ; Go if >= 4 Point Difference
4C59A8 " JMP" @Loop29 ; Go if < 4 Point Difference
@Loop53:
4C9FA7 " JMP" @Loop16 ; Go
@Loop54:
A576 " LDA" QUARTER
C904 " CMP" OVERTIME
F003 " BEQ" @Loop55 ; Go if Overtime
4C9FA7 " JMP" @Loop16 ; Go if not Overtime
@Loop55:
A544 " LDA" CURRENT_YARDLINE_LO
C9A1 " CMP" #$A1
A545 " LDA" CURRENT_YARDLINE_HI
E900 " SBC" #$00
9003 " BCC" @Loop56 ; Go if < 20.125 Yard-Line
4C9FA7 " JMP" @Loop16 ; Go if >= 20.125 Yard-Line
@Loop56:
4C59A8 " JMP" @Loop29 ; Go
@Loop57:
20A9AB " JSR" L_12_ABA9 ; Random_A
853F " STA" $3F
209DAB " JSR" L_12_AB9D ; Random_B
18 " CLC"
653F " ADC" $3F ; Random_A + Random_B
853F " STA" $3F
20A3AB " JSR" L_12_ABA3 ; Random_C
853E " STA" $3E
20A9AB " JSR" L_12_ABA9 ; Random_D
18 " CLC"
653E " ADC" $3E ; Random_C + Random_D
C9CD " CMP" #$CD
B016 " BCS" @Loop59 ; Go if (Random_C + Random_D) >= xCD
A53F " LDA" $3F
C980 " CMP" #$80
B007 " BCS" @Loop58 ; Go if (Random_A + Random_B) >= x80
A903 " LDA" #$03 ; Run Play x03
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop58:
A53F " LDA" $3F ; $3F = Random_A + Random_B
2903 " AND" #$03 ; Between x00-x03 (Run Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop59:
A53F " LDA" $3F ; $3F = Random_A + Random_B
290C " AND" #$0C ; Between x00-x0C
4A " LSR" ; /2 (Between x00-x06)
4A " LSR" ; /2 (Between x00-x03)
18 " CLC"
6904 " ADC" #$04 ; 4 (Pass Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop60:
20A9AB " JSR" L_12_ABA9 ; Random_A
853F " STA" $3F
209DAB " JSR" L_12_AB9D ; Random_B
18 " CLC"
653F " ADC" $3F ; Random_A + Random_B
853F " STA" $3F
20A3AB " JSR" L_12_ABA3 ; Random_C
853E " STA" $3E
20A9AB " JSR" L_12_ABA9 ; Random_D
18 " CLC"
653E " ADC" $3E ; Random_C + Random_D
C9CD " CMP" #$CD
9009 " BCC" @Loop61 ; Go if (Random_C + Random_D) < xCD
A53F " LDA" $3F ; $3F = Random_A + Random_B
2903 " AND" #$03 ; Between x00-x03 (Run Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop61: (only gets called once, by 60)
A53F " LDA" $3F ; $3F = Random_A + Random_B
290C " AND" #$0C ; Between x00-x0C
4A " LSR" ; /2 (Between x00-x06)
4A " LSR" ; /2 (Between x00-x03)
18 " CLC"
6904 " ADC" #$04 ; 4 (Pass Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop62:
20A9AB " JSR" L_12_ABA9 ; Random_A
853F " STA" $3F
209DAB " JSR" L_12_AB9D ; Random_B
18 " CLC"
653F " ADC" $3F ; Random_A + Random_B
853F " STA" $3F
20A3AB " JSR" L_12_ABA3 ; Random_C
853E " STA" $3E
20A9AB " JSR" L_12_ABA9 ; Random_D
18 " CLC"
653E " ADC" $3E ; Random_C + Random_D
C9CD " CMP" #$CD
900E " BCC" @Loop63 ; Go if (Random_C + Random_D) < xCD
A53F " LDA" $3F ; $3F = Random_A + Random_B
290C " AND" #$0C ; Between x00-x0C
4A " LSR" ; /2 (Between x00-x06)
4A " LSR" ; /2 (Between x00-x03)
18 " CLC"
6904 " ADC" #$04 ; 4 (Pass Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop63:
A53F " LDA" $3F ; $3F = Random_A + Random_B
2903 " AND" #$03 ; Between x00-x03 (Run Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
95AA9EAAB9AAD4AA "@Loop64: .WORD" @Loop67, @Loop68, @Loop70, @Loop72 ; Offensive Preference Pointers
@Loop65: makes decisions
20A3AB " JSR" L_12_ABA3 ; Random_A
8540 " STA" $40
20A9AB " JSR" L_12_ABA9 ; Random_B
18 " CLC"
6540 " ADC" $40 ; Random_A + Random_B
8540 " STA" $40
20A9AB " JSR" L_12_ABA9 ; Random_C
8541 " STA" $41
209DAB " JSR" L_12_AB9D ; Random_D
18 " CLC"
6541 " ADC" $41 ; Random_C + Random_D
8541 " STA" $41
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
900E " BCC" @Loop66 ; Go if < Fourth Quarter
A56B " LDA" QUARTER_MINUTES
C902 " CMP" #$02
B008 " BCS" @Loop66 ; Go if >= 2 Minutes
A5A0 " LDA" SCORE_DEFENSE
C59F " CMP" SCORE_OFFENSE
901C " BCC" @Loop68 ; Go if Offense > Points
B050 " BCS" @Loop72 ; Go if Defense >= Points
@Loop66:
A5A2 " LDA" OFFENSIVE_PREFERENCE
0A " ASL"
AABD " TAX"
4EAA " LDA" @Loop64,X ; Get Lo Byte of Pointer
853E " STA" $3E
4FAA " LDA" @Loop64+1,X ; Get Hi Byte of Pointer
853F " STA" $3F
6C3E " JMP" ($003E) ; Jump to Pointer
00 ; Offensive Preference x00
@Loop67:
A540 " LDA" $40 ; $40 = Random_A + Random_B
2907 " AND" #$07 ; Between x00-x07
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4 ; return
; Offensive Preference x01
@Loop68:
A540 " LDA" $40 ; $40 = Random_A + Random_B
C999 " CMP" #$99
900C " BCC" @Loop69 ; Go if $40 < x99 (59.76% Chance)
A541 " LDA" $41 ; $41 = Random_C + Random_D
2903 " AND" #$03 ; Between x00-x03
18 " CLC"
6904 " ADC" #$04 ; 4 (Pass Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop69:
A541 " LDA" $41 ; $41 = Random_C + Random_D
2903 " AND" #$03 ; Between x00-x03 (Run Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
; Offensive Preference x02
@Loop70:
A540 " LDA" $40 ; $40 = Random_A + Random_B
C999 " CMP" #$99
9009 " BCC" @Loop71 ; Go if $40 < x99 (59.76% Chance)
A541 " LDA" $41 ; $41 = Random_C + Random_D
2903 " AND" #$03 ; Between x00-x03 (Run Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop71:
A541 " LDA" $41 ; $41 = Random_C + Random_D
2903 " AND" #$03 ; Between x00-x03
18 " CLC"
6904 " ADC" #$04 = 4 (Pass Play Call)
8540 " STA" $40 = Save Play Call
4C2AA7 " JMP" @Loop4
; Offensive Preference x03
@Loop72:
A540 " LDA" $40 ; $40 = Random_A + Random_B
C9B7 " CMP" #$B3
9009 " BCC" @Loop73 ; Go if $40 < xB3 (69.92% Chance)
A541 " LDA" $41 ; $41 = Random_C + Random_D
2903 " AND" #$03 ; Between x00-x03 (Run Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop73:
A541 " LDA" $41 ; $41 = Random_C + Random_D
2903 " AND" #$03 ; Between x00-x03
18 " CLC"
6904 " ADC" #$04 ; 4 (Pass Play Call)
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
; Defensive Code
@Loop74:
A569 " LDA" CLOCK_STOPPED_OR_RUNNING
1036 " BPL" @Loop78 ; Go if Clock is Stopped
A5A1 " LDA" NUMBER_TIMEOUTS
F032 " BEQ" @Loop78 ; Go if Out of Time-Outs
A576 " LDA" QUARTER
C903 " CMP" FOURTH_QUARTER
F004 " BEQ" @Loop75 ; Go if Fourth Quarter
C904 " CMP" OVERTIME
D028 " BNE" @Loop78 ; Go if not Overtime
@Loop75:
A59F " LDA" SCORE_DEFENSE_A
C5A0 " CMP" SCORE_OFFENSE_A
B022 " BCS" @Loop78 ; Go if Defense >= Points
A56B " LDA" QUARTER_MINUTES
C903 " CMP" #$03
B01C " BCS" @Loop78 ; Go if >= 3 Minutes
C902 " CMP" #$02
9009 " BCC" @Loop76 ; Go if < 2 Minutes
209DAB " JSR" L_12_AB9D ; Random
C9C0 " CMP" #$C0
B011 " BCS" @Loop78 ; Go if Random >= xC0 (25% Chance)
9007 " BCC" @Loop77 ; Go if Random < xC0 (75% Chance)
@Loop76:
209DAB " JSR" L_12_AB9D ; Random
C9F0 " CMP" #$F0
B008 " BCS" @Loop78 ; Go if Random >= xF0 (6.25% Chance)
@Loop77:
A569 " LDA" CLOCK_STOPPED_OR_RUNNING
297F " AND" #$7F
8569 " STA" CLOCK_STOPPED_OR_RUNNING ; Stop Clock
C6A1 " DEC" NUMBER_TIMEOUTS ; Call Time-Out
@Loop78:
A900 " LDA" #$00
8540 " STA" $40
A577 " LDA" DOWN
C902 " CMP" THIRD_DOWN
F00E " BEQ" @Loop80 ; Go if 3rd Down
C903 " CMP" FOURTH_DOWN
F00A " BEQ" @Loop80 ; Go if 4th Down
@Loop79:
20A3AB " JSR" L_12_ABA3 ; Random
2907 " AND" #$07 ; Between x00 and x07
8540 " STA" $40 ; Save Play Call
4C2AA7 " JMP" @Loop4
@Loop80:
A542 " LDA" YARDS_TO_GO_LO
C919 " CMP" #$19
A543 " LDA" YARDS_TO_GO_HI
E900 " SBC" #$00
B003 " BCS" @Loop81 ; Go if >= 3.125 Yards to Go
4C1BAA " JMP" @Loop62 ; Go if < 3.125 Yards to Go
@Loop81:
C939 " CMP" #$39 ; BAD CODE (Always goes to @Loop82)
9003 " BCC" @Loop82 ; Go if < 7.125 Yards to Go
4CE8A9 " JMP" @Loop60 ; Go if >= 7.125 Yards to Go
@Loop82:
90E0 " BCC" @Loop79 ; Go
bruddog - I went all over this and already fixed it. the logic path leads to loop22. in loop22, after the scores are Compared (A5A0 C59F), there is a BCC (branch if carry clear) to Loop27 if offense winning. then following that another BCC (9003) that won't get used because if the offense is losing or tied, the C flag won't be Clear. finally, it takes you to Loop40 where the offense is bound to run a play.
basically, there should have been a "Greater Than (winning) or Equal To (tied)" check. the original programming only has the "greater than" part.
Luckily, you can just overwrite that worthless BCC 9003 to an actual BEQ (branch if equal) F035 and jump to Loop27 - the same actions would be taken as if COM were winning (if ball is >= 50 yd line, will punt).
I've been testing this for the past 3 days and run multiple tests and scenarios. it works.
bruddog - I went all over this and already fixed it. the logic path leads to loop22. in loop22, after the scores are Compared (A5A0 C59F), there is a BCC (branch if carry clear) to Loop27 if offense winning. then following that another BCC (9003) that won't get used because if the offense is losing or tied, the C flag won't be Clear. finally, it takes you to Loop40 where the offense is bound to run a play.
basically, there should have been a "Greater Than (winning) or Equal To (tied)" check. the original programming only has the "greater than" part.
Luckily, you can just overwrite that worthless BCC 9003 to an actual BEQ (branch if equal) F035 and jump to Loop27 - the same actions would be taken as if COM were winning (if ball is >= 50 yd line, will punt).
I've been testing this for the past 3 days and run multiple tests and scenarios. it works.
Better late than never!
This changes the on field goal post color and all cutscenes.
Here's how to change the posts to yellow...... Like they should be! (just me, LOL!)
Note: The pad stripes have to be cleared out and edited in Tile Layer Pro, to clear the yellow.
This is the side view cutscene XP attempt
SET(0x1A626,0x11)
SET(0x1A622,0x28)
SET(0x1A623,0x38)