Double Dribble (USA) (Rev 1)

Double Dribble (USA) (Rev 1) is on a UxROM board with 131,072 bytes of program. A crawl of 6,400 steps from power-on kept 134 paths that found new code. Played back over 321,174 frames, they executed 31,512 bytes of it, 24 percent.

What the rules named

The 279 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
$80E8 (bank 2)b2_sprites_80E8a call1,038,809
The sprite writers: frames it ran in 142,739, writes to the sprite page 17,009,828
$C41C (bank 7)b7_engine_C41Ca call645,612
The jump engine: tables 7, jumps through them 645,612
$C159 (bank 7)b7_bank_C159a call633,668
The bank switch: writes 633,648, in the blank 148,776, while drawing 484,872
$AA20 (bank 0)b0_compare_AA20a call328,456
Where two things are compared: instructions 1, pairs of bytes 29, bytes in all 12, times compared 61,329, X positions at $0043,$0370,$0372,$0373,$0374,$0375,$0376,$0378,$0379,$037A,$037B,$0390
$C314 (bank 7)b7_poll_C314a call297,210
The poll: port $4016, reads a frame 16, strobes a frame 3
The poll: port $4017, reads a frame 16, strobes a frame 3
$80ED (bank 1)b1_sound_80EDa call194,712
The sound driver: frames it ran in 82,859, writes 127,291
$C15E (bank 7)b7_bank_C15Ea call155,322
The bank switch: writes 155,321, in the blank 148,743, while drawing 6,578
$C036 (bank 7)b7_nmieach frame (NMI)149,044
The game inside the interrupt: frames it ran in 149,855, frames in all 152,754, the spin is at $C02B
$C100 (bank 7)b7_sprites_C100a call149,044
The sprite writers: frames it ran in 149,047, writes to the sprite page 596,160
$D350 (bank 7)b7_scroll_D350a call149,044
The scroll writer: frames it ran in 149,044, writes in the blank 291,988
$D371 (bank 7)b7_split_D371a call149,044
The split: frames it ran in 149,851, scroll writes while drawing 143,570, status reads while drawing 25,687,960
$CB63 (bank 7)b7_drain_CB63a call148,605
The palette writers: frames it ran in 148,605, writes 24,383
The picture writer: frames it ran in 148,605, writes 359,463, in the blank 359,463, while drawing 0
$824B (bank 2)b2_compare_824Ba call148,555
Where two things are compared: instructions 1, pairs of bytes 67, bytes in all 13, times compared 3,187,717, Y positions at $03C0,$03C2,$03C3,$03C4,$03C5,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB,$03CE
$8209 (bank 2)b2_compare_8209a call148,518
Where two things are compared: instructions 1, pairs of bytes 68, bytes in all 14, times compared 1,854,638, Y positions at $0372,$03C0,$03C2,$03C3,$03C4,$03C5,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB
$8154 (bank 2)b2_sprites_8154a call148,471
The sprite writers: frames it ran in 148,471, writes to the sprite page 4,853,339
$C3C5 (bank 7)b7_compare_C3C5a call111,455
Where two things are compared: instructions 2, pairs of bytes 26, bytes in all 11, times compared 116,106, X positions at $0370,$0372,$0373,$0374,$0375,$0376,$0377,$0378,$0379,$037A,$037B
$9D2D (bank 0)b0_random_9D2Da call90,207
Where two things are compared: instructions 2, pairs of bytes 74, bytes in all 23, times compared 29,383, X positions at $0370,$0372,$0373,$0374,$0375,$0376,$0377,$0378,$0379,$037A,$037B, Y positions at $03C0,$03C2,$03C3,$03C4,$03C5,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB,$05D2
The random byte: frames it ran in 61,338, bytes $000E,$0010,$0011,$0012,$0013, rotates 6, exclusive-ors 2
$D978 (bank 7)b7_compare_D978a call84,479
Where two things are compared: instructions 1, pairs of bytes 2, bytes in all 4, times compared 2,281, Y positions at $03C2,$03C4,$03C7,$05D2
$9B42 (bank 0)b0_compare_9B42a call77,134
Where two things are compared: instructions 2, pairs of bytes 44, bytes in all 26, times compared 93,164, X positions at $0372,$0373,$0374,$0375,$0376,$0378,$0379,$037A,$037B, Y positions at $03C0,$03C2,$03C3,$03C4,$03C5,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB,$0412
$A85A (bank 0)b0_compare_A85Aa call32,914
Where two things are compared: instructions 2, pairs of bytes 28, bytes in all 12, times compared 49,641, X positions at $0043,$0372,$0373,$0374,$0375,$0376,$0378,$0379,$037A,$037B, Y positions at $03C8,$0419
$B11F (bank 0)b0_compare_B11Fa call24,487
Where two things are compared: instructions 1, pairs of bytes 2, bytes in all 3, times compared 11,744, X positions at $0043,$0370,$0390
$AC64 (bank 0)b0_compare_AC64a call18,783
Where two things are compared: instructions 1, pairs of bytes 1, bytes in all 2, times compared 2,592, Y positions at $0372,$03C2
$801A (bank 2)b2_sprites_801Aa call16,164
The sprite writers: frames it ran in 5,388, writes to the sprite page 1,008,856
$8A57 (bank 0)b0_compare_8A57a call13,549
Where two things are compared: instructions 1, pairs of bytes 2, bytes in all 3, times compared 4, Y positions at $03C4,$03C5,$03C6
$9F48 (bank 0)b0_dispatch_9F48a table10,267
Where two things are compared: instructions 5, pairs of bytes 165, bytes in all 40, times compared 198,796, X positions at $0043,$0327,$0328,$0329,$032A,$032B,$0370,$0372,$0373,$0374,$0375,$0376, Y positions at $0330,$03C0,$03C2,$03C3,$03C4,$03C5,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB
$B435 (bank 0)b0_compare_B435a call7,356
Where two things are compared: instructions 1, pairs of bytes 7, bytes in all 7, times compared 553, Y positions at $0410,$0412,$0414,$0416,$0417,$0418,$0419
$D99A (bank 7)b7_compare_D99Aa call6,814
Where two things are compared: instructions 2, pairs of bytes 14, bytes in all 13, times compared 14,948, X positions at $0375,$0379,$037A, Y positions at $0372,$03C2,$03C3,$03C4,$03C5,$03C7,$03C8,$03C9,$03CA,$03CB
$ACB6 (bank 0)b0_compare_ACB6a call6,793
Where two things are compared: instructions 1, pairs of bytes 3, bytes in all 5, times compared 4,890, Y positions at $03C2,$03C9,$03E0,$0410,$041E
$A129 (bank 0)b0_compare_A129a call5,134
Where two things are compared: instructions 4, pairs of bytes 29, bytes in all 16, times compared 1,226, X positions at $0324,$0325,$0326,$0372,$0373,$0374,$0375,$0376, Y positions at $03C2,$03C3,$03C4,$03C6,$0412,$0413,$0414,$0416
$A37D (bank 0)b0_compare_A37Da call3,338
Where two things are compared: instructions 1, pairs of bytes 13, bytes in all 12, times compared 408, X positions at $0374,$0376,$0378,$0379,$037B, Y positions at $03C4,$03C6,$03C7,$03C8,$03C9,$03CA,$03CB
$C165 (bank 7)b7_bank_C165a call1,903
The bank switch: writes 1,903, in the blank 189, while drawing 1,714
$C10C (bank 7)b7_sprites_C10Ca call239
The sprite writers: frames it ran in 373, writes to the sprite page 61,184
$81A2 (bank 0)b0_dispatch_81A2a table194
Where two things are compared: instructions 1, pairs of bytes 9, bytes in all 9, times compared 212, X positions at $0378,$0379,$037A,$037B, Y positions at $03C7,$03C8,$03C9,$03CA,$03CB
$C43A (bank 7)a call605,205
$9CF6 (bank 0)a call378,093
$A896 (bank 0)a call303,969
$9CA0 (bank 0)a call200,720
$847D (bank 1)a call193,727
$A84C (bank 0)a call177,373
$9EBD (bank 0)a call152,953
$89B2 (bank 0)a call152,815
$91A6 (bank 0)a call152,815
$8491 (bank 0)a call150,972
$C0F3 (bank 7)a call150,747
$8029 (bank 1)a call148,910
$807A (bank 1)a call148,910
$C2E6 (bank 7)a call148,605
$C339 (bank 7)a call148,605
$C355 (bank 7)a call148,605
$81C9 (bank 2)a call148,604
$C187 (bank 7)a call148,471
$C77F (bank 7)a call148,471
$8493 (bank 1)a call144,143
$AB53 (bank 0)a call127,859
$AB72 (bank 0)a call127,859
$9FA3 (bank 0)a call122,446
$CDA4 (bank 7)a table109,704
$9BB0 (bank 0)a call89,001
$9094 (bank 0)a table73,820
$CE90 (bank 7)a call66,545
$9102 (bank 0)a call64,655
$9139 (bank 0)a call62,464
$AAEE (bank 0)a call61,577
$AAC4 (bank 0)a call61,510
$D33F (bank 7)a call61,409
$CEB6 (bank 7)a call61,324
$9A87 (bank 0)a call61,239
$9EA5 (bank 0)a call61,239
$B51D (bank 0)a call61,173
$CDC7 (bank 7)a table61,173
$852F (bank 0)a call61,154
$93AE (bank 0)a call61,154
$949F (bank 0)a call61,154
$94A5 (bank 0)a call61,154
$955E (bank 0)a call61,154
$9583 (bank 0)a call61,154
$95E0 (bank 0)a call61,154
$993A (bank 0)a call61,154
$9E70 (bank 0)a call61,154
$AAA8 (bank 0)a call61,154
$AADB (bank 0)a call61,154
$AC7F (bank 0)a call61,154
$914E (bank 0)a call61,070
$8A16 (bank 0)a table51,106
$AA98 (bank 0)a call42,185
$9C0B (bank 0)a call41,506
$AA4A (bank 0)a call40,507
$9097 (bank 0)a call39,983
$B035 (bank 0)a call37,189
$83B2 (bank 1)a call33,363
$9ABD (bank 0)a call31,451
$9E90 (bank 0)a call30,591
$9977 (bank 0)a call30,563
$B400 (bank 0)a call30,251
$C35A (bank 7)a call29,723
$D6FD (bank 7)a table28,570
$8BC5 (bank 0)a table27,384
$CE05 (bank 7)a table26,111
$ACD6 (bank 0)a table25,144
$AC2A (bank 0)a call24,720
$B3E9 (bank 0)a call24,487
$C1BF (bank 7)a table24,174
$C783 (bank 7)a call23,674
$C785 (bank 7)a call21,750
$AA07 (bank 0)a call21,015
$9B84 (bank 0)a call20,969
$B503 (bank 0)a call20,663
$9C06 (bank 0)a call20,431
$9F70 (bank 0)a call19,277
$9F26 (bank 0)a table18,870
$8BF8 (bank 0)a call18,415
$8C02 (bank 0)a call18,415
$9BF6 (bank 0)a call17,461
$AB96 (bank 0)a call17,428
$ABAB (bank 0)a call17,428
$ABCD (bank 0)a call16,728
$904D (bank 0)a table16,107
$C724 (bank 7)a call15,103
$86C3 (bank 0)a table14,866
$83C5 (bank 0)a table14,747
$8A98 (bank 0)a table13,549
$C27D (bank 7)a call12,091
$CDFD (bank 7)a table11,176
$AF46 (bank 0)a table11,113
$D31F (bank 7)a table10,700
$90B3 (bank 0)a call10,313
$A3E2 (bank 0)a table10,267
$CD9B (bank 7)a call10,171
$8436 (bank 1)a call10,101
$B473 (bank 0)a call9,923
$AE25 (bank 0)a table9,809
$B377 (bank 0)a call9,809
$8371 (bank 0)a table9,066
$C220 (bank 7)a table8,898
$9395 (bank 0)a call7,765
$D990 (bank 7)a call7,638
$8C36 (bank 0)a call6,900
$AC58 (bank 0)a call6,069
$8E71 (bank 0)a table5,663
$C1EB (bank 7)a table5,416
$829E (bank 0)a table5,407
$83E9 (bank 1)a table5,375
$D40F (bank 7)a call5,372
$D5F9 (bank 7)a call5,372
$862A (bank 0)a table5,004
$A73C (bank 1)a call4,680
$8128 (bank 1)a call4,535
$C694 (bank 7)a call3,748
$D759 (bank 7)a table3,483
$A5D0 (bank 0)a table3,408
$8B5A (bank 0)a table3,403
$A1CC (bank 0)a table3,338
$A7BF (bank 1)a call3,337
$810D (bank 1)a call3,323
$C16A (bank 7)a call2,920
$C17B (bank 7)a call2,920
$CC99 (bank 7)a call2,920
$C141 (bank 7)a call2,710
$83C0 (bank 1)a table2,698
$B501 (bank 0)a call2,642
$ACAB (bank 0)a table2,485
$AD41 (bank 0)a table2,467
$B138 (bank 0)a call2,467
$AE0C (bank 0)a table2,243
$8DF7 (bank 0)a table2,063
$8D57 (bank 0)a table1,919
$9490 (bank 0)a call1,872
$8488 (bank 1)a call1,844
$C549 (bank 7)a call1,818
$A780 (bank 0)a table1,796
$8340 (bank 1)a table1,766
$8EBF (bank 0)a table1,742
$9B0E (bank 0)a call1,555
$AD0E (bank 0)a call1,489
$8DD2 (bank 0)a table1,397
$A557 (bank 0)a table1,186
$A014 (bank 0)a table1,130
$A0B2 (bank 0)a table1,056
$89A4 (bank 0)a table1,015
$8DAB (bank 0)a table999
$91FB (bank 0)a call999
$A6C3 (bank 0)a call951
$AC5C (bank 0)a call939
$AEDE (bank 0)a table910
$CBE0 (bank 7)a call768
$842F (bank 0)a call628
$C0E0 (bank 7)a call439
$990A (bank 0)a call420
$9E2D (bank 0)a call409
$9F4E (bank 0)a table407
$A504 (bank 0)a table407
$8B12 (bank 0)a table404
$C450 (bank 7)a call378
$8C6B (bank 0)a table354
$8397 (bank 1)a table349
$843A (bank 1)a call349
$99CA (bank 0)a call344
$87C0 (bank 0)a table343
$9AFB (bank 0)a call307
$B412 (bank 0)a call292
$8EE2 (bank 0)a table290
$D507 (bank 7)a call256
$CD6F (bank 7)a call252
$8D9C (bank 0)a table244
$C6A5 (bank 7)a call240
$C6AD (bank 7)a call240
$894C (bank 0)a table224
$9AFD (bank 0)a call222
$98B5 (bank 0)a call210
$C4B7 (bank 7)a call210
$AFDD (bank 0)a table188
$C1AD (bank 7)a table174
$C4FA (bank 7)a call174
$99D9 (bank 0)a call172
$D311 (bank 7)a call170
$8FE0 (bank 0)a table168
$C38A (bank 7)a call160
$9A31 (bank 0)a call157
$8887 (bank 0)a table149
$8A3A (bank 0)a table148
$D6CD (bank 7)a call140
$C001 (bank 7)power-on134
$C0B9 (bank 7)a call134
$C128 (bank 7)a call134
$C135 (bank 7)a call134
$88DE (bank 0)a table126
$C251 (bank 7)a table105
$C392 (bank 7)a call105
$C3BC (bank 7)a call105
$CE0D (bank 7)a table105
$8266 (bank 0)a table103
$8CF3 (bank 0)a call103
$CE25 (bank 7)a table99
$B189 (bank 0)a call93
$A7EA (bank 0)a call88
$84C1 (bank 1)a call87
$A631 (bank 1)a table86
$9381 (bank 0)a call85
$945A (bank 0)a call85
$C110 (bank 7)a call85
$C547 (bank 7)a call85
$CEB8 (bank 7)a table85
$CEEA (bank 7)a table85
$CF1C (bank 7)a table85
$CF47 (bank 7)a table85
$D2C3 (bank 7)a call85
$B017 (bank 0)a table83
$8D1F (bank 0)a table75
$B0AB (bank 0)a call74
$C477 (bank 7)a call70
$8E88 (bank 0)a table65
$A638 (bank 0)a table61
$9A71 (bank 0)a call60
$A21F (bank 0)a call58
$A482 (bank 0)a call58
$8468 (bank 0)a call44
$D3D6 (bank 7)a call44
$A539 (bank 1)a call42
$CCC1 (bank 7)a call38
$9A45 (bank 0)a call30
$8131 (bank 1)a call28
$8195 (bank 0)a table22
$A4EB (bank 1)a table21
$C04E (bank 7)a call21
$9018 (bank 0)a call19
$D8F1 (bank 7)a call18
$8AF4 (bank 0)a table17
$D6BD (bank 7)a call14
$A347 (bank 0)a call11
$9651 (bank 0)a call10
$A0DA (bank 0)a call8
$D8FA (bank 7)a call8
$85EF (bank 0)a table7
$872F (bank 0)a table6
$AEDA (bank 0)a call4
$AF72 (bank 0)a table4
$A72E (bank 1)a call3
$A609 (bank 1)a call2
$A54C (bank 1)a table1

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
$C02B (bank 7)b7_spin_C02B
The counting spin: counts in the byte at $0063, turns 122,423,586, turns a frame 801, reads of it from outside the loop 8,603

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
$89C0 (bank 0)after a call1838$0349, $0348, $034A, $034B
$9F00 (bank 0)after a call194$0342, $0344, $0343, $0345
$A01C (bank 0)after a call6323$0342, $0343, $0344, $0345
$AC91 (bank 0)after a call1311$0340
$84A1 (bank 1)through a pointer44
$A4D5 (bank 1)after a call43$0480
$C199 (bank 7)after a call66$0018
$CDA9 (bank 7)after a call910$002A

The memory its routines share

649 bytes of memory were written by one routine and read by another, and 82 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$07001XY→↓
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
$000024041 across
$039092151 across
$03C0162612 down
$0370162311 across, 1 down
$032016208 across
$033016161 down
$0410151912 down
$05D012381 down
$03E01281 down
$02002537
$02012134
$02022132

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$0300$0310$0320X$0330Y$0340→$0350$0360↓$0370XY$0380$0390X+60$03A0+60$03B0$03C0Y$03D0$03E0Y$03F0$0400$0410Y$0430↓$0440$0460$0480→$0490$04A0$04B0↓$04C0$04D0↓$04E0↓$04F0↓$0500↓$0510↓$0580$05B0$05C0$05D0Y$05E0$0690$06F0
Table 1: 38 arrays of up to 92 slots that 91 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 92 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
923891$0320, $0370, $0390$0330, $0370, $03C0, $03E0, $0410, $05D0$0340, $0480$0360, $0430, $04B0, $04D0, $04E0, $04F0, $0500, $0510$0300, $0310, $0340, $0350, $0360, $0380, $03A0, $03B0, $03D0, $03F0, $0400, $0430, $0440, $0460, $0480, $0490, $04A0, $04B0, $04C0, $04D0, $04E0, $04F0, $0500, $0510, $0580, $05B0, $05C0, $05E0, $0690, $06F0

The 24 busiest shared bytes

bytereads and writesroutines writingroutines reading
$0063508,338,35136
$001A123,629,67926
$000025,373,67266
$000122,034,11766
$000219,501,13066
$000319,239,61966
$000919,042,36566
$000818,479,47266
$000518,103,11666
$001116,448,33266
$001016,300,60866
$000411,693,19466
$00135,741,60166
$004B5,233,95166
$000A3,680,07466
$00122,452,22366
$000D2,205,58066
$000B2,167,61966
$03201,881,95266
$03211,707,39666
$03271,704,09866
$03241,688,58866
$03231,678,59366
$03221,677,87966

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

All the games