Blaster Master (USA)

Blaster Master (USA) is on a MMC1 board with 131,072 bytes of program. A crawl of 8,000 steps from power-on kept 183 paths that found new code. Played back over 369,723 frames, they executed 13,581 bytes of it, 10 percent.

What the rules named

The 280 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, and their names in the listing say what they are: a poll, an engine, a drain.

atits name in the listingentered bytimeswhat it is, and the evidence
$E63C (bank 7)b7_bank_E63Ca call1,465,820
The bank switch: writes 7,329,095, in the blank 28,017, while drawing 7,301,078
$835C (bank 5)b5_sound_835Ca call581,958
The sound driver: frames it ran in 145,889, writes 225,687
$EC73 (bank 7)b7_sprites_EC73a call325,799
The sprite writers: frames it ran in 89,580, writes to the sprite page 6,779,728
$E914 (bank 7)b7_poll_E914a call310,426
The poll: port $4016, reads a frame 15, strobes a frame 3
The poll: port $4017, reads a frame 15, strobes a frame 3
$EF2B (bank 7)b7_compare_EF2Ba call249,098
Where two things are compared: instructions 2, pairs of bytes 6, bytes in all 8, times compared 2,865, X positions at $001C,$0472,$0480,$048E,$049C, Y positions at $001E,$0474,$049E
$EB98 (bank 7)b7_drain_EB98a call157,957
The palette writers: frames it ran in 158,149, writes 4,919,582
The picture writer: frames it ran in 158,149, writes 4,919,582, in the blank 4,919,582, while drawing 0
$E650 (bank 7)b7_bank_E650a call155,393
The bank switch: writes 776,964, in the blank 776,964, while drawing 0
$E664 (bank 7)b7_bank_E664a call155,393
The bank switch: writes 776,965, in the blank 776,965, while drawing 0
$E6BF (bank 7)b7_scroll_E6BFa call155,393
The scroll writer: frames it ran in 155,393, writes in the blank 310,786
$EC61 (bank 7)b7_sprites_EC61a call155,393
The sprite writers: frames it ran in 156,300, writes to the sprite page 9,940,736
$C7D8 (bank 7)b7_sprites_C7D8a call47,888
The sprite writers: frames it ran in 48,099, writes to the sprite page 1,532,414
$F668 (bank 7)b7_sprites_F668a call40,043
The sprite writers: frames it ran in 40,043, writes to the sprite page 1,498,072
$F88C (bank 7)b7_sprites_F88Ca call540
The sprite writers: frames it ran in 540, writes to the sprite page 15,112
$E678 (bank 7)b7_bank_E678a call183
The bank switch: writes 915, in the blank 915, while drawing 0
$E68C (bank 7)b7_bank_E68Ca call183
The bank switch: writes 183, in the blank 183, while drawing 0
$FFF4 (bank 7)b7_resetpower-on183
The bank switch: writes 366, in the blank 366, while drawing 0
The sprite writers: frames it ran in 49,898, writes to the sprite page 46,848
$BDF6 (bank 5)a call1,318,361
$808C (bank 5)a call1,262,208
$E61B (bank 7)a call878,627
$82CE (bank 5)a call581,958
$F0BC (bank 7)a call534,826
$EA3A (bank 7)a call514,086
$E9A2 (bank 7)a call417,792
$EB51 (bank 7)a call290,997
$F029 (bank 7)a call278,175
$EFD7 (bank 7)a call249,098
$C928 (bank 7)a call243,570
$C8DF (bank 7)a call243,445
$C9A4 (bank 7)a call243,236
$DC47 (bank 7)a call220,040
$DCDD (bank 7)a call207,134
$E996 (bank 7)a call205,762
$ECB4 (bank 7)a call192,090
$F1CA (bank 7)a call160,430
$EB7E (bank 7)each frame (NMI)157,957
$BE23 (bank 5)a call157,776
$DEEB (bank 7)a call157,776
$E697 (bank 7)a call155,393
$E936 (bank 7)a call155,393
$E287 (bank 7)a call155,212
$E2C1 (bank 7)a call155,212
$E8A9 (bank 7)a call155,212
$E895 (bank 7)a call154,145
$8127 (bank 6)a table149,264
$F011 (bank 7)a call144,359
$D2AB (bank 7)a call102,999
$D9F5 (bank 7)a call101,063
$D1A4 (bank 7)a call94,860
$CD0A (bank 7)a call94,530
$CDD0 (bank 7)a call74,103
$EB14 (bank 7)a call73,633
$D40B (bank 7)a call72,381
$D3A3 (bank 7)a call72,259
$D3F8 (bank 7)a call72,247
$D394 (bank 7)a call71,988
$D2FE (bank 7)a call66,249
$D2DE (bank 7)a call63,062
$D9D3 (bank 7)a call56,538
$EA3C (bank 7)a call53,698
$D798 (bank 7)a call51,700
$C642 (bank 7)a call47,888
$C8AE (bank 7)a call47,888
$C971 (bank 7)a call47,888
$CA4B (bank 7)a call47,888
$D883 (bank 7)a call47,888
$D18D (bank 7)a call47,430
$CC6D (bank 7)a call47,265
$D1AD (bank 7)a call47,265
$CBDF (bank 7)a call47,100
$D3DE (bank 7)a call45,564
$D37A (bank 7)a call45,442
$D7A0 (bank 7)a call44,721
$DC51 (bank 7)a call43,780
$D2B1 (bank 7)a call42,598
$D256 (bank 7)a call40,088
$894E (bank 6)a call38,549
$96A2 (bank 6)a call37,528
$8E32 (bank 6)a call37,108
$92DE (bank 6)a table37,108
$96C2 (bank 6)a call37,108
$CF07 (bank 7)a call37,108
$9641 (bank 6)a call37,038
$96D5 (bank 6)a call37,038
$96EB (bank 6)a call37,038
$D21D (bank 7)a call37,003
$D9AF (bank 7)a call32,136
$A2FA (bank 6)a call31,517
$A30A (bank 6)a call31,390
$D697 (bank 7)a call31,390
$D6CD (bank 7)a call31,390
$E04E (bank 7)a call31,002
$CCE8 (bank 7)a call30,389
$CCFF (bank 7)a call28,300
$888C (bank 6)a call28,229
$D37D (bank 7)a call26,817
$D3E1 (bank 7)a call26,817
$DCB2 (bank 7)a call22,464
$F19B (bank 7)a call20,212
$EB71 (bank 7)a call19,408
$CCF9 (bank 7)a call18,965
$CCEF (bank 7)a call16,876
$E083 (bank 7)a call16,650
$DF68 (bank 7)a call16,049
$A871 (bank 6)a table15,617
$E02F (bank 7)a call15,617
$A7F1 (bank 6)a table14,155
$E74D (bank 7)a call12,845
$E974 (bank 7)a call11,541
$DCD4 (bank 7)a call11,232
$F1BC (bank 7)a call11,180
$E775 (bank 7)a call11,134
$D327 (bank 7)a call10,167
$D349 (bank 7)a call10,167
$DF84 (bank 7)a call10,167
$DFA0 (bank 7)a call10,167
$E0A5 (bank 7)a call10,167
$E986 (bank 7)a call9,702
$85E2 (bank 6)a call8,413
$950D (bank 6)a call8,359
$815F (bank 6)a table8,350
$880B (bank 6)a call8,334
$D975 (bank 7)a call6,433
$D98C (bank 7)a call6,433
$D71F (bank 7)a call5,598
$8624 (bank 6)a call5,588
$9C6B (bank 6)a table5,231
$DA15 (bank 7)a call5,029
$D95E (bank 7)a call4,942
$DC2D (bank 7)a call4,866
$DB98 (bank 7)a call4,779
$D2DB (bank 7)a call4,035
$E4FD (bank 7)a call3,588
$978B (bank 6)a table3,530
$E4AB (bank 7)a call3,352
$8124 (bank 6)a table3,067
$E704 (bank 7)a call2,982
$F19F (bank 7)a call2,363
$E182 (bank 7)a call2,212
$E196 (bank 7)a call2,212
$BFE8 (bank 5)a call2,132
$DECC (bank 7)a call2,009
$E6FA (bank 7)a call1,972
$F771 (bank 7)a call1,928
$ED12 (bank 7)a call1,620
$92DB (bank 6)a table1,511
$D908 (bank 7)a call1,491
$E308 (bank 7)a call1,485
$DAC4 (bank 7)a call1,404
$F1A3 (bank 7)a call1,404
$E0ED (bank 7)a call1,230
$E6F0 (bank 7)a call1,145
$E1D5 (bank 7)a call979
$8853 (bank 6)a table970
$F192 (bank 7)a call826
$E0C7 (bank 7)a call759
$EA03 (bank 7)a call737
$CE0F (bank 7)a call735
$E93F (bank 7)a call735
$BE17 (bank 5)a call551
$BFE5 (bank 5)a call551
$DEC2 (bank 7)a call551
$DF05 (bank 7)a call551
$DF0A (bank 7)a call551
$CE27 (bank 7)a call514
$B2EF (bank 6)a table505
$D2B9 (bank 7)a call500
$E1BD (bank 7)a call474
$E1D2 (bank 7)a call474
$EDF5 (bank 7)a call452
$B192 (bank 6)a table435
$B1DE (bank 6)a call432
$8562 (bank 6)a table427
$B2AB (bank 6)a table414
$E949 (bank 7)a call408
$E953 (bank 7)a call408
$E0FA (bank 7)a call378
$9EE3 (bank 6)a table366
$A53D (bank 6)a table339
$A670 (bank 6)a call339
$CE3C (bank 7)a call339
$E107 (bank 7)a call339
$E120 (bank 7)a call333
$D790 (bank 7)a call321
$9BAD (bank 6)a table314
$9BF0 (bank 6)a table291
$D7CF (bank 7)a call271
$AC66 (bank 6)a table262
$D7C0 (bank 7)a call251
$8C67 (bank 6)a table240
$E4A6 (bank 7)a call240
$D7B6 (bank 7)a call233
$D136 (bank 7)a call212
$E87C (bank 7)a call192
$CE2E (bank 7)a call187
$E9A6 (bank 7)a call187
$F45D (bank 7)a call187
$F547 (bank 7)a call187
$F58F (bank 7)a call187
$F9CA (bank 7)a call187
$CDBA (bank 7)a call175
$E9CF (bank 7)a call171
$F5D9 (bank 7)a call171
$F67C (bank 7)a call171
$D7E3 (bank 7)a call168
$C659 (bank 7)a call165
$C6EF (bank 7)a call165
$CC35 (bank 7)a call165
$DCFC (bank 7)a call165
$E823 (bank 7)a call165
$CE82 (bank 7)a call164
$C772 (bank 7)a call163
$C9D6 (bank 7)a call163
$E692 (bank 7)a call163
$F7D1 (bank 7)a call163
$9707 (bank 6)a call161
$9770 (bank 6)a table161
$CBA9 (bank 7)a call161
$E243 (bank 7)a call161
$C5B2 (bank 7)a call160
$CA14 (bank 7)a call160
$A2E9 (bank 6)a call127
$867A (bank 6)a table122
$A7CE (bank 6)a table114
$E862 (bank 7)a call96
$EAE9 (bank 7)a call96
$88E9 (bank 6)a call70
$815C (bank 6)a table63
$A7EE (bank 6)a table45
$D238 (bank 7)a call40
$D1EF (bank 7)a call38
$A86E (bank 6)a table36
$882D (bank 6)a table35
$A634 (bank 6)a call33
$E6E9 (bank 7)a call32
$E9B8 (bank 7)a call32
$F833 (bank 7)a call32
$F90B (bank 7)a call32
$F927 (bank 7)a call32
$F9A5 (bank 7)a call32
$9B81 (bank 6)a call27
$9B98 (bank 6)a table27
$A53A (bank 6)a table27
$855F (bank 6)a table25
$8C64 (bank 6)a table24
$9BDB (bank 6)a table24
$D804 (bank 7)a call22
$D283 (bank 7)a call20
$8677 (bank 6)a table18
$8850 (bank 6)a table18
$9788 (bank 6)a table18
$9BAA (bank 6)a table18
$A7CB (bank 6)a table18
$E4BB (bank 7)a call18
$E4E0 (bank 7)a call18
$DF0F (bank 7)a call17
$DF27 (bank 7)a call17
$E3D1 (bank 7)a call17
$E07B (bank 7)a call16
$E355 (bank 7)a call14
$9C1F (bank 6)a table12
$E4EE (bank 7)a call12
$9BED (bank 6)a table9
$9C68 (bank 6)a table9
$D82C (bank 7)a call7
$E309 (bank 7)a call7
$E005 (bank 7)a call6
$A29E (bank 6)a call5
$AC3F (bank 6)a table5
$9EC2 (bank 6)a table4
$C5FA (bank 7)a call4
$DF46 (bank 7)a call4
$E38A (bank 7)a call4
$A511 (bank 6)a table3
$B171 (bank 6)a table3
$9B90 (bank 6)a call2
$B29E (bank 6)a table2
$D246 (bank 7)a call2
$E797 (bank 7)a call2
$E3F0 (bank 7)a call1
$F71C (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.

atits name in the listingwhat it is, and the evidence
$E93A (bank 7)b7_wait_E93A
The wait for the frame: waits on the byte at $0012, times entered 155,342, turns 469,638,754, writes of it under the frame interrupt 1,912,657, frames in all 159,303
$F647 (bank 7)b7_wait_F647
The wait for the frame: waits on the byte at $00E0, times entered 161, turns 24,632, calls on each turn 1, writes of it under the frame interrupt 652, frames in all 159,303
$F872 (bank 7)b7_wait_F872
The wait for the frame: waits on the byte at $00F3, times entered 12, turns 536, calls on each turn 2, writes of it under the frame interrupt 155,212, frames in all 159,303

The tables it jumps through

A table of addresses the game picks one from. Some sit right after a call to a jump engine; others are anywhere in the cartridge, and we find them by where the address the game jumped through was loaded from. Some games jump by pushing an address and returning to it, and some keep a table as two, the low bytes of its addresses in one place and the high bytes in another; both are found the same way. 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.

atreachedentriestakenchosen by the byte at
$8002 (bank 6)through a pointer9715$0470, $049A, $047E, $048C

The memory its routines share

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

004080C0$0000$0100$0200$0300$0400$0500$0600$07001+↓XY2XY
The console's 2,048 bytes of memory, one row for each 256. A numbered span is a column of one of the object tables drawn below, counted in the same order, as long as the table and filled as it is there. Where a table's columns overlap, its things lie one after another, each with all its properties, so the table is one outline with a mark where each property starts. A dark square is a position a rule saw compared. A tick under a row is one of the 24 busiest shared bytes. The second row is the page the processor keeps its stack in. Reaches through an index that belong to no table are not drawn: the loops that clear memory reach nearly every byte.

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

frombytes reachedinstructionspositions it holds
$040122534 across, 2 down
$000112311 across, 1 down
$030025617
$040025617
$050025616
$070025615
$060025610
$00002568
$02002564
$04022254
$04032254
$04062254

What travels with a position

Arrays that at least two routines step through together with an array of positions, across the same range. That is what a table of the things on the screen looks like in memory: one array for each property, one slot for each thing. We can say which arrays hold positions, which of the others get added into them, which is what a speed does, which pick the way through a jump table, which is what a state or a kind does, and which are only ever counted down, which is what a timer does. What the rest hold is not named yet.

0481216202428$0000+↓+224$0001XY+91
Table 1: 2 arrays of up to 123 slots that 2 routines step through together. Each column is an array at its address and each row a slot, so one thing on the screen is one row across all of them. The first 32 of 123 slots are drawn. A number under a column is how many more bytes that array was reached across than the table is long. X and Y are positions, and the darker squares are the slots a rule saw compared. + is added into a position, which is what a speed does. → chose a jump, which is what a state or a kind does. ↓ is only ever counted down, which is what a timer does. A plain outline travels with them and is not named yet.
0481216202428$0400+224$0401XY+193$0402+193$0403+193$0404+193$0405+193$0406+193$0407+193$0408+193$0409+193$040A+193$040B+193$040C+193$040D+193
Table 2: 14 arrays of up to 225 slots that 3 routines step through together. Each column is an array at its address and each row a slot, so one thing on the screen is one row across all of them. The first 32 of 225 slots are drawn. A number under a column is how many more bytes that array was reached across than the table is long. X and Y are positions, and the darker squares are the slots a rule saw compared. + is added into a position, which is what a speed does. → chose a jump, which is what a state or a kind does. ↓ is only ever counted down, which is what a timer does. A plain outline travels with them and is not named yet.
slotsarraysroutinespositions acrosspositions downadded into themchoosing a jumpcounted downtravelling with them
12322$0001$0001$0000$0000$0000
225143$0401$0401$0400, $0402, $0403, $0404, $0405, $0406, $0407, $0408, $0409, $040A, $040B, $040C, $040D

The 24 busiest shared bytes

bytereads and writesroutines writingroutines reading
$0012433,471,93666
$007A17,191,36066
$007B14,534,07666
$003F9,389,75766
$00F79,284,37636
$003E8,977,38666
$00448,550,39366
$00F88,225,99722
$00006,857,97966
$00585,625,42843
$00573,606,06936
$00453,481,84966
$00563,132,09745
$00DB2,458,88566
$00011,840,00166
$00491,787,74966
$001D1,644,41136
$00FF1,617,44166
$00F51,563,39424
$004A1,494,66266
$00481,363,00566
$00461,355,40166
$00E91,320,67623
$004B1,267,64366

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

All the games