Mike Tyson's Punch-Out!! (Japan, USA) (En)

Mike Tyson's Punch-Out!! (Japan, USA) (En) is on a MMC2 board with 131,072 bytes of program. A crawl of 400 steps from power-on kept 51 paths that found new code. Played back over 58,111 frames, they executed 16,633 bytes of it, 13 percent.

What the rules named

The 181 routines the runs entered

Every place the game's code was entered, by a call, an interrupt or a jump through a table. The ones a rule named come first, with what the rule saw.

atentered bytimeswhat it is, and the evidence
$AFA4 (bank 13)a call137,386
The poll: port $4016, reads a frame 31, strobes a frame 0
The poll: port $4017, reads a frame 31, strobes a frame 0
$A008 (bank 13)each frame (NMI)47,458
The bank switch: writes 86, in the blank 86, while drawing 0
$AA3C (bank 13)a call37,998
The bank switch: writes 37,993, in the blank 37,446, while drawing 547
$AA40 (bank 13)a call37,579
The bank switch: writes 37,574, in the blank 37,022, while drawing 552
$A9DF (bank 13)a call37,491
The bank switch: writes 37,459, in the blank 37,459, while drawing 0
The scroll writer: frames it ran in 37,491, writes in the blank 74,977
$AA6A (bank 13)a call37,026
The bank switch: writes 36,975, in the blank 36,035, while drawing 940
$A7A6 (bank 13)a call36,849
The sprite writers: frames it ran in 35,353, writes to the sprite page 4
$F40B (bank 13)a call22,658
The sound driver: frames it ran in 22,335, writes 45,316
$AA48 (bank 13)a call1,712
The bank switch: writes 1,708, in the blank 0, while drawing 1,708
$BDB5 (bank 13)a call1,638
The sprite writers: frames it ran in 1,638, writes to the sprite page 56,486
$AF0B (bank 13)a call1,213
The palette writers: frames it ran in 1,213, writes 38,807
The picture writer: frames it ran in 1,213, writes 38,807, in the blank 38,807, while drawing 0
$BE1A (bank 13)a call1,137
The sprite writers: frames it ran in 1,137, writes to the sprite page 7,057
$AED4 (bank 13)a call675
The jump engine: tables 4, jumps through them 675
$CC8B (bank 13)a call580
The sprite writers: frames it ran in 343, writes to the sprite page 12,792
$D176 (bank 13)a call580
The sprite writers: frames it ran in 299, writes to the sprite page 9,284
$D305 (bank 13)a call572
The sprite writers: frames it ran in 299, writes to the sprite page 4,576
$AA44 (bank 13)a call570
The bank switch: writes 570, in the blank 18, while drawing 552
$C978 (bank 13)a call558
The sprite writers: frames it ran in 321, writes to the sprite page 25,884
$AA87 (bank 13)a call552
The bank switch: writes 552, in the blank 0, while drawing 552
$9134 (bank 7)a call363
The jump engine: tables 1, jumps through them 363
$BEFF (bank 13)a call144
The sprite writers: frames it ran in 72, writes to the sprite page 972
$AF38 (bank 13)a call138
The sprite writers: frames it ran in 232, writes to the sprite page 35,323
$AA5C (bank 13)a call121
The bank switch: writes 121, in the blank 0, while drawing 121
$BF3C (bank 13)a call102
The bank switch: writes 102, in the blank 0, while drawing 102
$BF55 (bank 13)a call102
The bank switch: writes 408, in the blank 36, while drawing 372
$AA64 (bank 13)a call82
The bank switch: writes 82, in the blank 0, while drawing 82
$AA54 (bank 13)a call69
The bank switch: writes 69, in the blank 60, while drawing 9
$860F (bank 11)a call65
The jump engine: tables 2, jumps through them 65
$A000 (bank 13)an interrupt (IRQ)51
The sprite writers: frames it ran in 10,834, writes to the sprite page 21,760
$AA50 (bank 13)a call51
The bank switch: writes 51, in the blank 0, while drawing 51
$B666 (bank 13)a call49
The bank switch: writes 49, in the blank 0, while drawing 49
The sprite writers: frames it ran in 98, writes to the sprite page 196
$B6A1 (bank 13)a call49
The bank switch: writes 49, in the blank 0, while drawing 49
$D134 (bank 13)a call44
The sprite writers: frames it ran in 22, writes to the sprite page 352
$AF3A (bank 13)a call37
The sprite writers: frames it ran in 37, writes to the sprite page 3,552
$BBAA (bank 13)a call36
The bank switch: writes 36, in the blank 0, while drawing 36
$BCBE (bank 13)a call36
The bank switch: writes 180, in the blank 0, while drawing 180
$BF36 (bank 13)a call36
The bank switch: writes 36, in the blank 0, while drawing 36
$D34F (bank 13)a call26
The sprite writers: frames it ran in 22, writes to the sprite page 208
$C976 (bank 13)a call22
The sprite writers: frames it ran in 22, writes to the sprite page 2,314
$AA9F (bank 13)a call18
The bank switch: writes 18, in the blank 18, while drawing 0
$AF43 (bank 13)a call9
The sprite writers: frames it ran in 9, writes to the sprite page 108
$A800 (bank 13)a call2
The bank switch: writes 2, in the blank 0, while drawing 2
$B001 (bank 13)a call85,765
$8000 (bank 8)a call37,579
$8025 (bank 8)a call37,579
$80CA (bank 8)a call37,579
$84B1 (bank 8)a call37,579
$88E2 (bank 8)a call37,579
$8012 (bank 7)a call37,446
$AF73 (bank 13)a call37,446
$A774 (bank 13)a call37,401
$F412 (bank 13)a call22,583
$F472 (bank 13)a call22,502
$F463 (bank 13)a call22,415
$B021 (bank 13)a call17,705
$AF8D (bank 13)a call17,197
$AFBD (bank 13)a call17,153
$AF02 (bank 13)a call13,077
$BC1F (bank 13)a call2,941
$F429 (bank 13)a call2,070
$BF9E (bank 13)a call1,975
$F400 (bank 13)a call1,961
$F422 (bank 13)a call1,564
$8006 (bank 7)a call1,425
$AF2E (bank 13)a call1,415
$C041 (bank 13)a call993
$C113 (bank 13)a call989
$F41E (bank 13)a call936
$BF99 (bank 13)a call694
$A09A (bank 13)a call596
$8000 (bank 7)a call552
$8003 (bank 7)a call552
$8003 (bank 11)a call552
$8006 (bank 11)a call552
$8009 (bank 7)a call552
$8009 (bank 11)a call552
$800C (bank 7)a call552
$800F (bank 7)a call552
$8015 (bank 7)a call552
$A7C4 (bank 13)a call552
$B034 (bank 13)a call552
$B049 (bank 13)a call552
$B069 (bank 13)a call552
$B10A (bank 13)a call552
$B196 (bank 13)a call552
$B457 (bank 13)a call552
$B530 (bank 13)a call552
$C291 (bank 13)a call552
$C3D9 (bank 13)a call552
$C440 (bank 13)a call552
$C4E7 (bank 13)a call552
$C890 (bank 13)a call552
$B549 (bank 13)a table543
$C850 (bank 13)a call486
$AF04 (bank 13)a call408
$90FF (bank 6)a call394
$9158 (bank 7)a call374
$C24A (bank 13)a call212
$9151 (bank 7)a call192
$AE9B (bank 13)a call182
$C079 (bank 13)a call173
$C09D (bank 13)a call173
$8B54 (bank 7)a call167
$C0BB (bank 13)a call147
$BEB3 (bank 13)a call144
$C0E0 (bank 13)a call138
$BF21 (bank 13)a call129
$AA1D (bank 13)a call125
$C105 (bank 13)a call108
$AA6E (bank 13)a call104
$AA0A (bank 13)a call102
$8B19 (bank 7)a table97
$BF7E (bank 13)a call96
$8B50 (bank 7)a table95
$BD9B (bank 13)a call93
$BF0D (bank 13)a call93
$BC5F (bank 13)a call92
$BEE1 (bank 13)a call85
$AEA5 (bank 13)a call83
$F4EF (bank 13)a call80
$8AF0 (bank 7)a table73
$8B39 (bank 7)a table72
$BEC9 (bank 13)a call72
$C85C (bank 13)a call72
$AEF8 (bank 13)a call63
$8906 (bank 8)a call53
$801E (bank 7)a call51
$9000 (bank 6)a call51
$9030 (bank 6)a call51
$A75B (bank 13)a call51
$800E (bank 9)a call49
$A9D1 (bank 13)a call45
$B6CB (bank 13)a call44
$BFAE (bank 13)a call44
$BFB2 (bank 13)a call44
$F518 (bank 13)a call37
$AA06 (bank 13)a call36
$AAE5 (bank 13)a call36
$AB4E (bank 13)a call36
$AE89 (bank 13)a call36
$BAE3 (bank 13)a call36
$BE96 (bank 13)a call36
$BEA1 (bank 13)a call36
$BEED (bank 13)a call36
$BFAA (bank 13)a call36
$BFF2 (bank 13)a call36
$C720 (bank 13)a table36
$C784 (bank 13)a table36
$910B (bank 7)a call26
$8B1E (bank 7)a table22
$C58D (bank 13)a table22
$8000 (bank 11)a call18
$8363 (bank 11)a table18
$C118 (bank 13)a call18
$83AE (bank 11)a table17
$83A7 (bank 11)a table13
$C5F9 (bank 13)a table13
$802D (bank 7)a call9
$83F4 (bank 11)a table9
$85D1 (bank 11)a call9
$AB58 (bank 13)a call9
$AE5F (bank 13)a call9
$AF5B (bank 13)a call9
$B5A9 (bank 13)a table9
$BED9 (bank 13)a call9
$8DF4 (bank 7)a call8
$C670 (bank 13)a table8
$C70C (bank 13)a table8
$A4C6 (bank 13)a call7
$8027 (bank 7)a call5
$8E3D (bank 7)a call5
$8493 (bank 11)a table4
$84BE (bank 11)a table4
$8ADD (bank 7)a table4
$BFF6 (bank 13)a call4
$8021 (bank 7)a call3
$8024 (bank 7)a call3
$802A (bank 7)a call3
$AEF1 (bank 13)a call2
$801B (bank 7)a call1
$8E15 (bank 7)a call1

Where it waits

Loops a rule named that sit inside a routine and are not themselves a place the code is entered.

atwhat it is, and the evidence
$A8A9 (bank 13)
The wait for the frame: waits on the byte at $00D9, times entered 36, turns 1,101, calls on each turn 2, writes of it under the frame interrupt 15,815, frames in all 47,611
$A90B (bank 13)
The wait for the frame: waits on the byte at $0000, times entered 9, turns 525, calls on each turn 1, writes of it under the frame interrupt 9, frames in all 47,611
$ABF1 (bank 13)
The wait for the frame: waits on the byte at $0392, times entered 9, turns 855, calls on each turn 2, writes of it under the frame interrupt 18, frames in all 47,611
$AF06 (bank 13)
The wait for the frame: waits on the byte at $001F, times entered 13,653, turns 164,891,623, writes of it under the frame interrupt 74,942, frames in all 47,611
$BF83 (bank 13)
The wait for the frame: waits on the byte at $04C8, times entered 96, turns 2,710, calls on each turn 1, writes of it under the frame interrupt 379, frames in all 47,611

The jump engine's tables

Each table sits right after a call to the engine. An entry is counted as far as the runs saw one taken; the true table may be longer. The last column is the byte of memory whose value picked the entry, where we could follow it: the game's mode, or what one of its objects is doing.

atentriestakenchosen by the byte at
$8AC2 (bank 7)16
$8338 (bank 11)153
$83B2 (bank 11)123
$B53F (bank 13)42$0000
$C562 (bank 13)164
$C724 (bank 13)31

The memory its routines share

330 bytes of memory were written by one routine and read by another, and 49 places were reached through an index, which is what a table or a set of object slots in memory looks like.

Reaches through an index: those that hold positions, then the longest

frombytes reachedinstructionspositions it holds
$02002568
$020D24134
$020C24121
$020E24119
$020F24112
$020B24111
$02082416
$00002402
$02011253
$05001091
$05A0961
$0202694

The 24 busiest shared bytes

bytereads and writesroutines writingroutines reading
$00E13,732,18666
$00E02,434,60366
$00D0233,15335
$001E190,95036
$0010159,97956
$00F2112,87532
$00F4109,40753
$00F5108,30724
$070093,42324
$070192,71523
$072584,28616
$00F075,40333
$00F375,34032
$00F175,30322
$00D261,48623
$06C158,44612
$000455,43523
$06A451,65123
$06A651,63323
$002041,00743
$041039,53866
$001238,25633
$00D938,21834
$001437,85142

This page shows none of the game's bytes. The listing these figures were read from stays with the cartridge.

All the games