View Page Source

Back to Page
Revision 8 (current)
Edited by adelikat on 1/2/2022 6:51 PM
This game maps out many RAM values of the game Mike Tyson's Punchout%%%

%%TOC%%

!! Intro 

NES games have 2k RAM, thus 2048 addresses.  Those addresses are divided up into 8 blocks (pages) of 256 RAM values.  Typically these pages have a similar function.  Each block is divided into 16 row of 16 values.  Each row is usually for like functions as well.

[https://files.tasvideos.org/gameresources/nes/mtpo/MTPO.xls|Excel spread of RAM Map]

!! Page Zero (0000-00FF)

* Row 0 (0000-000F)
** 0000 - Initializes fight (1 = fight is started, 0 if not (between rounds, etc)
** 0001 - Opponent ID (0-99 value)
** 0002 - Opp Type ID (0 = Glass Joe, 1 = King Hippo, 2 = Von Kaiser, 3 = Bald Bull, etc)
** 0003 - another opp ID - affecting behavior - if title bout/special moves/sprites/special KO's etc.
** 0004 - Fight Init. - FF is in fight, 01 is between rounds or a cut scene
** 0005 - Opponent Up/Down, 0 = Opponent is not knocked down, 1 = Knocked down
** 0006 - Current Round (changing does affect Opponent, seems to only be for opening round sequence)
** 0007 - Not Used (?)
** 0008 - Fight ID (Don1=48,KH=35,Soda=28,Von&Tyson=32,PH2&Glass=0
** 0009 - Fighter ID (Von=49,PH=48,Don2=35,Glass=50)
** 000A - # of Mac's Losses
** 000B - Always 0
** 000C - Always 0
** 000D - Fight init.
** 000E - Fight init.
** 000F - Not Used (?)

* Row 1
**0010 - 95 or B5 (unknown)
**0011 - Mac X position (not actual, just appearance on screen)
**0012 - Must be 0, relates to the drawing of the screen
**0013 - Screen redraw offset
**0014 - Set # fans, mario, menus
**0015 - Mac X position (redundant to 0011)
**0016 - Init. Mac Draw on screen (1 = draw mac, 0 = no mac)
**0017 - Init. Opp. Draw (similar to 0016)
**0018 - RNG - updates once per frame
**0019 - Button ID - which button(s) is currently pressed
**001A - unknown flag (always 0 or 1)
**001B - Init. screen draw for menus, mario, etc. when fight begins
**001C - Init. fight start sequence, 0 = in fight, 1 = not
**001D - Same as 001C
**001E - 0-255 Counter (unknown uses)
**001F - Timer (seems to time situations when user input is not used)

* Row 2
** 0020 - Affects on screen objects
** 0022 - Relates to mac's on screen position

* Row 3
** 0030 - Flag - Init. Opp fight - sets the fighting pattern set for opponent at beginning of fight
** 0031 - Flag - Similar to 0030 but different number for each fighter, freezing to 14 causes opponent to be passive
** 0032 - Flag - Similar to 0031 but different number
** 0033 - Flag - Similar to 0030,0031,0032
** 0038 - Opp fight pattern, initializes opponent fighting patterns
** __0039__ - Timer for opponent fighting patterns, next action will happen at 0 
***(VERY useful for optimizing a TAS)
** 003A - ID for Opp. actions, ID for what action Opp will do next (when 0039 is 0).  Values not yet mapped.
** 003B - Global variable for set of enemy actions (115 for glass joe beginning, 150 for when he backs up

* Row 4
** 004C - Flag for Kaisers weakness to star uppercuts (he always gets knocked down).  Forcing this to 0 removes his weakness.

* Row C (00C0 - 00CF)
** 00CB - Flag for Soda's insta-Knockdown from star.  1 when he can be knocked down by star uppercut (flagged when mac hits him in a gut before an uppercut)

* Row D (00D0 - 00DF)
**00D0 - Button ID for controller 1 (redundant to 06A0)
**00D1 - Button ID for controller 2 (redundant to 06A1)
**00D2 - Polls arrow keys
**00D3 - if arrows active - 129 when pressed for 2 frames, 1 when it causes punch
**00D4 - polls A 80 (hex) when pressed
**00D5 - if A active	129 when pressed for 2 frames, 1 when it causes punch
**00D6 - polls B 40hex when pressed
**00D7 - if B active	129 when pressed for 2 frames, 1 when it causes punch
**00D8 - polls Start	10hex when pressed
**00D9 - if Start active	129 when pressed for 2 frames, 1 when it causes punch
**00DA - polls select	20hex when pressed
**00DB - if select active	129 when pressed for 2 frames, 1 when it causes punch
**00DC - polls Controller 2 arrows	
**00DD - if C2 A active	
**00DE - polls C2 A o rB	
**00DF - if C2 A or B active	
----
!! Page One (0100-01FF)
----
!! Page Two (0200-02FF)

Sprite data

----
!! Page Three (0300-03FF)

* Row 0 (0300-030F) The Clock
** 0300 - Clock init.	Flag 0 when clock is inactive (bet. Fights), 1 when active (in fight)
** 0301 - Clock stop flag, 1 triggers the clock to stop, 0 re-initializes
***Note: the "Clock Stopping" glitch causes this to fail to re-initialize to 0
** 0302 - Clock Minutes
** 0303 - ?	
** 0304 - Clock Tenths
** 0305 - Clock Seconds
** 0306 - partial sec	not sure exactly how they function
** 0307 - partial sec	"" ""
** 0308 - 4 or 5 - 4 when fight starts, moves to 5 at beg. Of round 2, rnd 3 has no affect
** 0309 - Not Used?
** 030A - Not Used?
** 030B - Not Used?
** 030C - Next Minute
** 030D - Next Tenth
** 030E - Next Second
** 030F - Not Used?

* Row 2 (0320-032F)
** 0323 - Hearts (10's place)
** 0324 - Hearts (1's place)

* Row 4 (0340-034F)
** 0342 - Star Punches

* Row 9 (0390-039F)
** 0391-0393 - Mac's Health (same value in each address)
** 0398-039A - Opponent's Health (same value in each address)

----
!! Page Four (0400-04FF)
----
!! Page Five (0500-05FF)
----
!! Page Six (0600-06FF)
----
!! Page Seven (0700-07FF)