Teenage Mutant Ninja Turtles (USA)
Teenage Mutant Ninja Turtles (USA) is on a MMC1 board with 131,072 bytes of program. A crawl of 400 steps from power-on kept 40 paths that found new code. Played back over 23,980 frames, they executed 14,264 bytes of it, 11 percent.
What the rules named
- The poll: 2
- The counting spin: 1
- The game inside the interrupt: 1
- The jump engine: 1
- The bank switch: 23
- The picture writer: 1
- The palette writers: 1
- The sprite writers: 7
- The scroll writer: 1
- The split: 1
- The sound driver: 1
- Where two things are compared: 2
The 293 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.
| at | entered by | times | what it is, and the evidence |
|---|---|---|---|
| $C0C3 (bank 7) | a call | 162,202 | The sprite writers: frames it ran in 10,174, writes to the sprite page 101,040 |
| $C702 (bank 7) | a call | 41,796 | The jump engine: tables 11, jumps through them 41,796 |
| $CEA7 (bank 7) | a call | 41,026 | The bank switch: writes 205,084, in the blank 112,989, while drawing 92,095 |
| $C50D (bank 7) | a call | 26,312 | The poll: port $4016, reads a frame 16, strobes a frame 3 The poll: port $4017, reads a frame 16, strobes a frame 3 |
| $CEA5 (bank 7) | a call | 25,605 | The bank switch: writes 127,978, in the blank 200, while drawing 127,778 |
| $C3A3 (bank 7) | each frame (NMI) | 13,200 | The game inside the interrupt: frames it ran in 13,281, frames in all 13,480, the spin is at $C395 |
| $C460 (bank 7) | a call | 13,200 | The scroll writer: frames it ran in 13,200, writes in the blank 25,848 |
| $CED5 (bank 7) | a call | 13,200 | The bank switch: writes 65,950, in the blank 49,876, while drawing 16,074 |
| $C26C (bank 7) | a call | 13,196 | The palette writers: frames it ran in 13,196, writes 4,736 The picture writer: frames it ran in 13,196, writes 116,494, in the blank 116,494, while drawing 0 |
| $C001 (bank 7) | a call | 13,185 | The sprite writers: frames it ran in 13,236, writes to the sprite page 565,317 |
| $C190 (bank 7) | a call | 12,854 | The sprite writers: frames it ran in 11,935, writes to the sprite page 414,325 |
| $8BDA (bank 0) | a call | 11,245 | The sound driver: frames it ran in 9,057, writes 21,910 |
| $C1C6 (bank 7) | a call | 10,136 | The sprite writers: frames it ran in 10,134, writes to the sprite page 45,472 |
| $8001 (bank 0) | a call | 5,406 | The split: frames it ran in 5,410, scroll writes while drawing 3,540, status reads while drawing 1,744,366 |
| $CC18 (bank 7) | a table | 5,406 | The bank switch: writes 3,545, in the blank 0, while drawing 3,545 |
| $D042 (bank 7) | a call | 4,697 | The bank switch: writes 23,484, in the blank 20, while drawing 23,464 |
| $9AD3 (bank 6) | a call | 4,644 | Where two things are compared: instructions 6, pairs of bytes 7, bytes in all 9, times compared 6,154, X positions at $0480,$0485,$0486,$0487,$0488, Y positions at $0051,$0460,$0468,$04B5 |
| $D04D (bank 7) | a call | 2,334 | The bank switch: writes 11,669, in the blank 0, while drawing 11,669 |
| $C1FA (bank 7) | a call | 1,585 | The sprite writers: frames it ran in 1,585, writes to the sprite page 50,687 |
| $AA25 (bank 4) | a table | 1,544 | The bank switch: writes 6,950, in the blank 0, while drawing 6,950 |
| $CE56 (bank 7) | a call | 1,499 | The bank switch: writes 7,463, in the blank 200, while drawing 7,263 |
| $D104 (bank 7) | a call | 711 | The bank switch: writes 3,554, in the blank 0, while drawing 3,554 |
| $B8C9 (bank 3) | a call | 260 | The sprite writers: frames it ran in 260, writes to the sprite page 1,040 |
| $CEC0 (bank 7) | a call | 180 | The bank switch: writes 900, in the blank 0, while drawing 900 |
| $CE8A (bank 7) | a call | 172 | The bank switch: writes 860, in the blank 200, while drawing 660 |
| $CEF0 (bank 7) | a call | 134 | The bank switch: writes 670, in the blank 0, while drawing 670 |
| $CE6F (bank 7) | a call | 132 | The bank switch: writes 660, in the blank 200, while drawing 460 |
| $DB71 (bank 7) | a call | 120 | The bank switch: writes 600, in the blank 0, while drawing 600 |
| $8381 (bank 5) | a call | 78 | Where two things are compared: instructions 2, pairs of bytes 2, bytes in all 3, times compared 306, Y positions at $0051,$0460,$04B5 |
| $A634 (bank 4) | a call | 60 | The bank switch: writes 20, in the blank 0, while drawing 20 |
| $CBBF (bank 7) | a table | 46 | The bank switch: writes 225, in the blank 0, while drawing 225 |
| $D22C (bank 7) | a call | 40 | The bank switch: writes 200, in the blank 0, while drawing 200 |
| $FFD8 (bank 7) | power-on | 40 | The bank switch: writes 480, in the blank 480, while drawing 0 The sprite writers: frames it ran in 13,316, writes to the sprite page 10,240 |
| $D0D1 (bank 7) | a call | 33 | The bank switch: writes 165, in the blank 0, while drawing 165 |
| $D0B0 (bank 7) | a call | 16 | The bank switch: writes 80, in the blank 0, while drawing 80 |
| $D0C6 (bank 7) | a call | 16 | The bank switch: writes 80, in the blank 0, while drawing 80 |
| $CE8C (bank 7) | a call | 7 | The bank switch: writes 35, in the blank 0, while drawing 35 |
| $9F5C (bank 4) | a call | 3 | The bank switch: writes 15, in the blank 0, while drawing 15 |
| $CA94 (bank 7) | a call | 84,923 | |
| $8F96 (bank 0) | a call | 61,854 | |
| $8671 (bank 0) | a call | 61,650 | |
| $CA92 (bank 7) | a call | 56,710 | |
| $8010 (bank 6) | a call | 37,344 | |
| $8CE8 (bank 0) | a call | 37,332 | |
| $9617 (bank 6) | a call | 25,296 | |
| $DE24 (bank 7) | a call | 23,224 | |
| $DD8B (bank 7) | a call | 23,104 | |
| $DDC3 (bank 7) | a call | 23,104 | |
| $DE02 (bank 7) | a call | 23,104 | |
| $DE1A (bank 7) | a call | 23,104 | |
| $DE3A (bank 7) | a call | 23,104 | |
| $ACBE (bank 4) | a call | 15,516 | |
| $C48E (bank 7) | a call | 13,493 | |
| $C4B3 (bank 7) | a call | 13,493 | |
| $8612 (bank 0) | a call | 13,196 | |
| $8644 (bank 0) | a call | 13,196 | |
| $C532 (bank 7) | a call | 13,186 | |
| $F481 (bank 7) | a call | 13,185 | |
| $C413 (bank 7) | a call | 13,156 | |
| $C4C6 (bank 7) | a call | 13,156 | |
| $C4D6 (bank 7) | a call | 13,156 | |
| $C551 (bank 7) | a call | 13,156 | |
| $C4F2 (bank 7) | a call | 13,074 | |
| $F072 (bank 7) | a call | 12,594 | |
| $DEA5 (bank 7) | a call | 11,612 | |
| $844E (bank 5) | a call | 9,197 | |
| $F089 (bank 7) | a call | 8,009 | |
| $CB07 (bank 7) | a table | 7,358 | |
| $87B0 (bank 0) | a call | 7,055 | |
| $C71B (bank 7) | a call | 6,842 | |
| $DEFC (bank 7) | a call | 6,814 | |
| $CDB9 (bank 7) | a call | 5,738 | |
| $C564 (bank 7) | a table | 5,732 | |
| $808C (bank 6) | a call | 5,549 | |
| $AC05 (bank 4) | a call | 5,424 | |
| $9B11 (bank 6) | a call | 5,405 | |
| $CA58 (bank 7) | a call | 4,284 | |
| $C60F (bank 7) | a table | 4,280 | |
| $EF21 (bank 7) | a call | 3,939 | |
| $87FA (bank 0) | a table | 3,554 | |
| $8032 (bank 5) | a call | 3,234 | |
| $8049 (bank 5) | a call | 3,234 | |
| $8077 (bank 5) | a call | 3,234 | |
| $EF03 (bank 7) | a call | 3,234 | |
| $F161 (bank 7) | a call | 3,234 | |
| $EF9D (bank 7) | a call | 3,118 | |
| $DEE0 (bank 7) | a call | 3,094 | |
| $EFA3 (bank 7) | a call | 3,080 | |
| $83D6 (bank 5) | a call | 3,074 | |
| $9851 (bank 5) | a table | 3,074 | |
| $8466 (bank 5) | a call | 3,072 | |
| $DF23 (bank 7) | a call | 2,990 | |
| $D9F2 (bank 7) | a table | 2,941 | |
| $D9E3 (bank 7) | a table | 2,927 | |
| $DFDB (bank 7) | a call | 2,888 | |
| $D9D8 (bank 7) | a table | 2,880 | |
| $D9D1 (bank 7) | a table | 2,864 | |
| $CFF3 (bank 7) | a call | 2,363 | |
| $D000 (bank 7) | a call | 2,363 | |
| $D02A (bank 7) | a call | 2,363 | |
| $DEBB (bank 7) | a call | 2,363 | |
| $E3F6 (bank 7) | a call | 2,363 | |
| $F18D (bank 7) | a call | 2,363 | |
| $8055 (bank 0) | a call | 2,334 | |
| $CF10 (bank 7) | a call | 2,334 | |
| $CF18 (bank 7) | a call | 2,334 | |
| $CF42 (bank 7) | a call | 2,334 | |
| $CF4A (bank 7) | a call | 2,334 | |
| $CFC5 (bank 7) | a call | 2,334 | |
| $CFCD (bank 7) | a call | 2,334 | |
| $E145 (bank 7) | a call | 2,334 | |
| $996F (bank 4) | a call | 2,284 | |
| $8795 (bank 0) | a table | 2,281 | |
| $9989 (bank 4) | a call | 2,272 | |
| $8081 (bank 6) | a call | 2,160 | |
| $8C71 (bank 0) | a call | 2,014 | |
| $8F86 (bank 0) | a call | 1,900 | |
| $EF93 (bank 7) | a call | 1,633 | |
| $CBA7 (bank 7) | a call | 1,604 | |
| $8672 (bank 6) | a call | 1,591 | |
| $864A (bank 6) | a call | 1,578 | |
| $A8B5 (bank 6) | a call | 1,567 | |
| $AB30 (bank 6) | a call | 1,567 | |
| $DA35 (bank 7) | a call | 1,554 | |
| $E218 (bank 7) | a call | 1,545 | |
| $A8C7 (bank 6) | a call | 1,445 | |
| $DF53 (bank 7) | a call | 1,444 | |
| $DF8D (bank 7) | a call | 1,444 | |
| $E019 (bank 7) | a call | 1,444 | |
| $D4C8 (bank 7) | a table | 1,426 | |
| $DD08 (bank 7) | a call | 1,426 | |
| $C6A8 (bank 7) | a call | 1,373 | |
| $C5E1 (bank 7) | a table | 1,344 | |
| $CA9F (bank 7) | a call | 1,278 | |
| $8CBD (bank 0) | a call | 1,153 | |
| $80CC (bank 6) | a call | 1,080 | |
| $CAA4 (bank 7) | a call | 1,030 | |
| $86F3 (bank 0) | a call | 996 | |
| $8B27 (bank 0) | a call | 903 | |
| $EF48 (bank 7) | a call | 859 | |
| $9C1D (bank 6) | a call | 789 | |
| $9C2A (bank 6) | a table | 789 | |
| $9C69 (bank 4) | a call | 789 | |
| $E152 (bank 7) | a call | 789 | |
| $8D70 (bank 0) | a table | 745 | |
| $A24D (bank 4) | a table | 743 | |
| $871E (bank 0) | a call | 722 | |
| $9BE4 (bank 4) | a call | 705 | |
| $EF0D (bank 7) | a call | 705 | |
| $842B (bank 0) | a call | 591 | |
| $B91E (bank 3) | a call | 520 | |
| $EFC7 (bank 7) | a call | 520 | |
| $8F37 (bank 0) | a table | 467 | |
| $8F45 (bank 0) | a call | 455 | |
| $8C75 (bank 0) | a call | 441 | |
| $8CFB (bank 0) | a table | 441 | |
| $8D22 (bank 0) | a table | 420 | |
| $87A9 (bank 0) | a table | 405 | |
| $841D (bank 0) | a call | 404 | |
| $8450 (bank 0) | a call | 404 | |
| $846E (bank 0) | a call | 404 | |
| $81AC (bank 0) | a call | 381 | |
| $AC77 (bank 3) | a call | 330 | |
| $9016 (bank 0) | a call | 264 | |
| $AA5C (bank 3) | a table | 260 | |
| $ADD1 (bank 3) | a call | 260 | |
| $C982 (bank 7) | a call | 250 | |
| $8E66 (bank 0) | a table | 228 | |
| $84FC (bank 6) | a call | 222 | |
| $C792 (bank 7) | a call | 218 | |
| $F1D4 (bank 7) | a call | 212 | |
| $F1EF (bank 7) | a call | 212 | |
| $817A (bank 0) | a table | 206 | |
| $82E8 (bank 0) | a call | 206 | |
| $8409 (bank 0) | a call | 206 | |
| $8413 (bank 0) | a call | 206 | |
| $8084 (bank 0) | a table | 202 | |
| $80CC (bank 0) | a table | 194 | |
| $811F (bank 0) | a table | 187 | |
| $9057 (bank 0) | a call | 182 | |
| $F062 (bank 7) | a call | 179 | |
| $C962 (bank 7) | a call | 171 | |
| $8FA3 (bank 0) | a call | 148 | |
| $A6AF (bank 4) | a call | 148 | |
| $A8BE (bank 6) | a call | 122 | |
| $DC17 (bank 7) | a call | 120 | |
| $DC58 (bank 7) | a call | 120 | |
| $DE46 (bank 7) | a call | 120 | |
| $F72E (bank 7) | a call | 118 | |
| $C6D2 (bank 7) | a call | 112 | |
| $845E (bank 6) | a call | 111 | |
| $8469 (bank 6) | a call | 111 | |
| $88F8 (bank 5) | a call | 108 | |
| $CAAC (bank 7) | a call | 96 | |
| $F06A (bank 7) | a call | 93 | |
| $C6B9 (bank 7) | a call | 79 | |
| $F77E (bank 7) | a call | 79 | |
| $8907 (bank 5) | a table | 78 | |
| $8570 (bank 6) | a call | 74 | |
| $8DA0 (bank 0) | a table | 72 | |
| $C59C (bank 7) | a table | 68 | |
| $EFBC (bank 7) | a call | 65 | |
| $CAAA (bank 7) | a call | 64 | |
| $8DB8 (bank 0) | a table | 62 | |
| $D992 (bank 7) | a call | 60 | |
| $F718 (bank 7) | a call | 58 | |
| $F740 (bank 7) | a call | 58 | |
| $8950 (bank 5) | a call | 57 | |
| $8146 (bank 6) | a call | 55 | |
| $EED3 (bank 7) | a call | 55 | |
| $8634 (bank 6) | a call | 52 | |
| $8642 (bank 6) | a call | 52 | |
| $CB5C (bank 7) | a table | 51 | |
| $D34B (bank 7) | a call | 51 | |
| $D536 (bank 7) | a call | 51 | |
| $8593 (bank 5) | a call | 49 | |
| $978E (bank 5) | a table | 49 | |
| $EF89 (bank 7) | a call | 47 | |
| $AAFA (bank 6) | a call | 45 | |
| $85F3 (bank 0) | a call | 43 | |
| $8F55 (bank 0) | a table | 43 | |
| $C498 (bank 7) | a call | 40 | |
| $C4A3 (bank 7) | a call | 40 | |
| $C571 (bank 7) | a table | 40 | |
| $FFDD (bank 7) | an interrupt (IRQ) | 40 | |
| $C93C (bank 7) | a call | 39 | |
| $AAD9 (bank 6) | a call | 38 | |
| $84AD (bank 6) | a call | 37 | |
| $89AD (bank 5) | a call | 37 | |
| $C6C7 (bank 7) | a call | 37 | |
| $9662 (bank 4) | a call | 33 | |
| $9870 (bank 5) | a table | 33 | |
| $C65C (bank 7) | a table | 33 | |
| $C669 (bank 7) | a table | 33 | |
| $C6C2 (bank 7) | a call | 33 | |
| $C6D6 (bank 7) | a call | 33 | |
| $CB3E (bank 7) | a table | 33 | |
| $CB54 (bank 7) | a table | 33 | |
| $D2D0 (bank 7) | a table | 33 | |
| $EF3D (bank 7) | a call | 33 | |
| $EFF4 (bank 7) | a call | 33 | |
| $AB0D (bank 6) | a call | 32 | |
| $E838 (bank 7) | a call | 32 | |
| $A618 (bank 4) | a call | 30 | |
| $AB03 (bank 3) | a call | 28 | |
| $AB5B (bank 3) | a call | 28 | |
| $AB75 (bank 3) | a call | 28 | |
| $8DE5 (bank 0) | a table | 21 | |
| $AA4A (bank 3) | a table | 21 | |
| $B695 (bank 3) | a call | 21 | |
| $9F35 (bank 4) | a call | 19 | |
| $95C9 (bank 6) | a call | 18 | |
| $9FB0 (bank 4) | a table | 18 | |
| $A5F0 (bank 4) | a call | 18 | |
| $A764 (bank 4) | a call | 18 | |
| $AA5B (bank 4) | a table | 18 | |
| $A69F (bank 4) | a call | 16 | |
| $EF3F (bank 7) | a call | 16 | |
| $896B (bank 5) | a call | 14 | |
| $D548 (bank 7) | a call | 14 | |
| $D551 (bank 7) | a call | 14 | |
| $D574 (bank 7) | a call | 14 | |
| $F75E (bank 7) | a call | 14 | |
| $CF20 (bank 7) | a call | 13 | |
| $9D0C (bank 4) | a table | 12 | |
| $A23C (bank 4) | a table | 12 | |
| $A3B4 (bank 4) | a call | 11 | |
| $A3DC (bank 4) | a call | 11 | |
| $A0EA (bank 4) | a call | 10 | |
| $8721 (bank 0) | a call | 9 | |
| $9BAD (bank 4) | a call | 8 | |
| $A106 (bank 4) | a call | 8 | |
| $A612 (bank 4) | a call | 8 | |
| $A936 (bank 3) | a table | 7 | |
| $A99A (bank 3) | a table | 7 | |
| $A9AB (bank 3) | a table | 7 | |
| $A9B0 (bank 3) | a table | 7 | |
| $A9B3 (bank 3) | a table | 7 | |
| $AA1C (bank 3) | a table | 7 | |
| $AA2A (bank 3) | a table | 7 | |
| $AAC2 (bank 3) | a call | 7 | |
| $ABC6 (bank 3) | a call | 7 | |
| $ADF4 (bank 3) | a table | 7 | |
| $C975 (bank 7) | a call | 7 | |
| $8DB4 (bank 0) | a table | 5 | |
| $DBE4 (bank 7) | a call | 4 | |
| $EF8C (bank 7) | a call | 4 | |
| $9F22 (bank 4) | a call | 3 | |
| $E127 (bank 7) | a call | 3 | |
| $A404 (bank 4) | a table | 2 | |
| $E68A (bank 7) | a table | 2 | |
| $AFB3 (bank 3) | a table | 1 | |
| $AFBA (bank 3) | a table | 1 |
Where it waits
Loops a rule named that sit inside a routine and are not themselves a place the code is entered.
| at | what it is, and the evidence |
|---|---|
| $C395 (bank 7) | The counting spin: counts in the byte at $0045, turns 10,812,522, turns a frame 802, reads of it from outside the loop 33 |
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.
| at | entries | taken | chosen by the byte at |
|---|---|---|---|
| $807C (bank 0) | 4 | 4 | $001E |
| $A924 (bank 3) | 9 | 9 | $00D0 |
| $ADEC (bank 3) | 1 | 1 | $008E |
| $AF46 (bank 3) | 2 | 2 | |
| $9CB3 (bank 4) | 13 | 6 | $0510 |
| $AA1F (bank 4) | 2 | 2 | $0510 |
| $9C22 (bank 6) | 2 | 1 | $005E |
| $C558 (bank 7) | 5 | 4 | $001B |
| $C569 (bank 7) | 4 | 4 | $001C |
| $CB26 (bank 7) | 7 | 7 | $0034, $0617 |
| $D9C9 (bank 7) | 4 | 4 | $004F, $0051, $00A4 |
The memory its routines share
696 bytes of memory were written by one routine and read by another, and 73 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
| from | bytes reached | instructions | positions it holds |
|---|---|---|---|
| $0460 | 16 | 18 | 2 down |
| $0480 | 16 | 17 | 5 across |
| $04B0 | 16 | 6 | 1 down |
| $004F | 4 | 1 | 1 down |
| $0300 | 256 | 9 | |
| $0400 | 256 | 4 | |
| $0500 | 256 | 2 | |
| $0700 | 256 | 2 | |
| $0600 | 256 | 1 | |
| $0200 | 253 | 6 | |
| $0201 | 253 | 3 | |
| $0202 | 253 | 3 |
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, and which pick the way through a jump table, which is what a state or a kind does. What the rest hold is not named yet.
| slots | arrays | routines | positions across | positions down | added into them | choosing a jump | travelling with them |
|---|---|---|---|---|---|---|---|
| 16 | 25 | 23 | $0480 | $0460, $04B0 | $0470, $0490, $04C0, $04E0 | $0510 | $0400, $0410, $0420, $0430, $0440, $0450, $0470, $0490, $04C0, $04E0, $04F0, $0500, $0510, $0520, $0530, $0540, $0550, $0560, $0570, $0580, $0630, $0640 |
The 24 busiest shared bytes
| byte | reads and writes | routines writing | routines reading |
|---|---|---|---|
| $0045 | 52,118,513 | 2 | 2 |
| $001E | 21,697,912 | 2 | 6 |
| $0008 | 2,315,623 | 6 | 6 |
| $0000 | 1,540,020 | 6 | 6 |
| $0001 | 1,306,149 | 6 | 6 |
| $0009 | 758,987 | 6 | 6 |
| $0003 | 685,619 | 6 | 6 |
| $0002 | 662,552 | 6 | 6 |
| $000C | 642,677 | 3 | 4 |
| $0005 | 616,597 | 6 | 6 |
| $0004 | 482,438 | 6 | 6 |
| $0016 | 365,555 | 5 | 6 |
| $0013 | 298,860 | 6 | 6 |
| $0022 | 286,793 | 6 | 6 |
| $0070 | 151,184 | 6 | 6 |
| $000A | 145,459 | 6 | 6 |
| $001A | 140,762 | 6 | 6 |
| $00E1 | 126,702 | 4 | 6 |
| $00E0 | 126,669 | 4 | 6 |
| $00FF | 125,222 | 6 | 6 |
| $0011 | 119,497 | 6 | 6 |
| $0010 | 106,989 | 6 | 6 |
| $00F7 | 78,524 | 2 | 3 |
| $000B | 76,521 | 6 | 6 |
This page shows none of the game's bytes. The listing these figures were read from stays with the cartridge.