NEStinymachines

Ninja Gaiden (USA)

Ninja Gaiden (USA) は MMC1 の基板に載り、プログラムは 131,072 バイト。電源投入から 8,000 歩のクロールが、新しいコードを見つけた道筋を 142 本残した。それらを 304,842 フレームにわたって再生すると、プログラムのうち 12,425 バイト、9 パーセントが実行された。

規則が名付けたもの

走行が入った 177 個のルーチン

ゲームのコードに入った場所のすべて。呼び出し、割り込み、テーブル経由のジャンプのどれかで入る。規則が名付けたものを先に、規則が見たものと一緒に並べる。それらのリスティングでの名前は、何であるかを言う: poll (読み取り)、engine (エンジン)、drain (書き出し)。

場所リスティングでの名前入り方回数何であるか、その証拠
$80F4 (バンク 3)b3_sound_80F4呼び出し261,747
サウンドドライバ: 走ったフレーム 65,968、書き込み 745,908
$C028 (バンク 7)b7_bank_C028呼び出し196,540
バンク切り替え: 書き込み 982,017、ブランク中 0、描画中 982,017
$E819 (バンク 7)b7_poll_E819呼び出し182,984
パッドの読み取り: ポート $4016、一フレームの読み 15、一フレームのストローブ 3
$80A8 (バンク 5)b5_engine_80A8呼び出し97,924
ジャンプエンジン: テーブル 3、そこを通った跳躍 97,924
$C02A (バンク 7)b7_bank_C02A呼び出し97,872
バンク切り替え: 書き込み 489,200、ブランク中 0、描画中 489,200
$F91A (バンク 7)b7_nmi毎フレーム(NMI)91,492
バンク切り替え: 書き込み 2,053,599、ブランク中 1,710,668、描画中 342,931
パレットの書き手: 走ったフレーム 91,762、書き込み 518,962
スクロールの書き手: 走ったフレーム 91,762、ブランク中の書き込み 182,961
画面メモリへの書き手: 走ったフレーム 91,762、書き込み 766,930、ブランク中 766,930、描画中 0
$823B (バンク 4)b4_wait_823B呼び出し47,404
フレーム待ち: 待つ相手のバイト $001F、入った回数 47,402、周回 78,034,703、フレーム割り込みの下での書き込み 91,358、全フレーム 92,742
$8181 (バンク 4)b4_sprites_8181呼び出し47,382
スプライトの書き手: 走ったフレーム 47,382、スプライトのページへの書き込み 2,772,141
$F104 (バンク 7)b7_wait_F104呼び出し42,884
フレーム待ち: 待つ相手のバイト $001F、入った回数 42,971、周回 123,471,937、フレーム割り込みの下での書き込み 91,358、全フレーム 92,742
$F5A2 (バンク 7)b7_split_F5A2呼び出し42,291
バンク切り替え: 書き込み 422,419、ブランク中 0、描画中 422,419
画面の分割: 走ったフレーム 42,289、描画中のスクロール書き込み 84,544、描画中のステータス読み 30,007,392
$F77C (バンク 7)b7_sprites_F77C呼び出し28,346
スプライトの書き手: 走ったフレーム 15,396、スプライトのページへの書き込み 441,661
$837A (バンク 3)b3_handlers_837A呼び出し27,258
メモリに置かれたハンドラ: 跳躍 27,258、着地した場所 15、アドレスの写し元 $0627
$8013 (バンク 5)b5_sprites_8013呼び出し26,117
スプライトの書き手: 走ったフレーム 22,355、スプライトのページへの書き込み 846,976
$F768 (バンク 7)b7_sprites_F768呼び出し25,850
スプライトの書き手: 走ったフレーム 25,850、スプライトのページへの書き込み 1,627,170
$F0A7 (バンク 7)b7_sprites_F0A7呼び出し25,730
スプライトの書き手: 走ったフレーム 25,730、スプライトのページへの書き込み 418,394
$D8D5 (バンク 7)b7_bank_D8D5呼び出し25,337
バンク切り替え: 書き込み 126,639、ブランク中 0、描画中 126,639
$EB7B (バンク 7)b7_handlers_EB7B呼び出し25,337
メモリに置かれたハンドラ: 跳躍 18,804、着地した場所 5、アドレスの写し元 $0000,$006F,$0438
$F1AC (バンク 7)b7_bank_F1AC呼び出し25,337
バンク切り替え: 書き込み 940、ブランク中 0、描画中 940
$F7E4 (バンク 7)b7_handlers_F7E4呼び出し24,985
メモリに置かれたハンドラ: 跳躍 24,985、着地した場所 6、アドレスの写し元 $005F,$0086,$00A3
$E243 (バンク 7)b7_handlers_E243呼び出し20,143
メモリに置かれたハンドラ: 跳躍 20,143、着地した場所 11、アドレスの写し元 $0051,$0061
$E144 (バンク 7)b7_compare_E144呼び出し12,873
二つのものを比べる所: 命令 2、バイトの組 14、バイトの総数 16、比べた回数 15,934、横の位置のバイト $0086,$0454,$0457,$0462,$0463,$0464,$0465,$0466,$0467、縦の位置のバイト $008A,$0474,$0477,$0482,$0485,$0486,$0487
$DAA2 (バンク 7)b7_compare_DAA2呼び出し7,763
二つのものを比べる所: 命令 2、バイトの組 1、バイトの総数 2、比べた回数 7、横の位置のバイト $0086,$04D9
$C014 (バンク 7)b7_bank_C014呼び出し6,767
バンク切り替え: 書き込み 33,824、ブランク中 0、描画中 33,824
$F47E (バンク 7)b7_bank_F47E呼び出し2,377
バンク切り替え: 書き込み 23,770、ブランク中 0、描画中 23,770
$F5EA (バンク 7)b7_bank_F5EA呼び出し1,225
バンク切り替え: 書き込み 6,125、ブランク中 0、描画中 6,125
$8301 (バンク 4)b4_wait_8301呼び出し1,084
フレーム待ち: 待つ相手のバイト $001F、入った回数 1,084、周回 3,018,154、フレーム割り込みの下での書き込み 91,358、全フレーム 92,742
$818E (バンク 6)b6_engine_818E呼び出し969
ジャンプエンジン: テーブル 1、そこを通った跳躍 969
$81E9 (バンク 4)b4_bank_81E9呼び出し795
バンク切り替え: 書き込み 3,975、ブランク中 0、描画中 3,975
$86D2 (バンク 4)b4_sprites_86D2呼び出し557
スプライトの書き手: 走ったフレーム 557、スプライトのページへの書き込み 557
$817D (バンク 4)b4_sprites_817D呼び出し523
スプライトの書き手: 走ったフレーム 523、スプライトのページへの書き込み 32,949
$8328 (バンク 4)b4_sprites_8328呼び出し401
スプライトの書き手: 走ったフレーム 401、スプライトのページへの書き込み 1,604
$880F (バンク 4)b4_random_880F呼び出し246
乱数のバイト: 走ったフレーム 246、バイト $001D、回転 2、排他的論理和 1
$FFDA (バンク 7)b7_reset電源投入142
バンク切り替え: 書き込み 994、ブランク中 994、描画中 0
スプライトの書き手: 走ったフレーム 426、スプライトのページへの書き込み 36,352
$DE2B (バンク 7)b7_compare_DE2B呼び出し129
二つのものを比べる所: 命令 1、バイトの組 6、バイトの総数 7、比べた回数 129、横の位置のバイト $0086,$0462,$0463,$0464,$0465,$0466,$0467
$DE5A (バンク 7)b7_compare_DE5A呼び出し129
二つのものを比べる所: 命令 1、バイトの組 6、バイトの総数 7、比べた回数 129、横の位置のバイト $0086,$0462,$0463,$0464,$0465,$0466,$0467
$E902 (バンク 7)b7_bank_E902呼び出し120
バンク切り替え: 書き込み 1,150、ブランク中 0、描画中 1,150
$EAC1 (バンク 7)b7_split_EAC1呼び出し120
バンク切り替え: 書き込み 1,200、ブランク中 0、描画中 1,200
画面の分割: 走ったフレーム 480、描画中のスクロール書き込み 240、描画中のステータス読み 88,080
スプライトの書き手: 走ったフレーム 480、スプライトのページへの書き込み 480
$F8F0 (バンク 7)b7_split_F8F0呼び出し120
バンク切り替え: 書き込み 1,200、ブランク中 0、描画中 1,200
画面の分割: 走ったフレーム 240、描画中のスクロール書き込み 240、描画中のステータス読み 82,440
$DE40 (バンク 7)b7_compare_DE40呼び出し21
二つのものを比べる所: 命令 1、バイトの組 2、バイトの総数 3、比べた回数 21、横の位置のバイト $0086,$0465,$0466
$DECF (バンク 7)b7_compare_DECF呼び出し21
二つのものを比べる所: 命令 3、バイトの組 5、バイトの総数 7、比べた回数 25、横の位置のバイト $0086,$0465,$0466,$0467、縦の位置のバイト $008A,$0486,$0487
$8161 (バンク 3)呼び出し282,760
$E792 (バンク 7)呼び出し184,855
$BF98 (バンク 4)呼び出し97,872
$BFB3 (バンク 5)呼び出し96,903
$8000 (バンク 3)呼び出し91,483
$82B9 (バンク 3)呼び出し55,371
$8003 (バンク 5)テーブル47,382
$8006 (バンク 5)テーブル47,382
$83A9 (バンク 4)呼び出し47,382
$83B5 (バンク 4)呼び出し47,382
$DFD3 (バンク 7)呼び出し32,672
$82E0 (バンク 4)呼び出し28,267
$81D7 (バンク 6)呼び出し28,219
$81C8 (バンク 6)呼び出し27,250
$8193 (バンク 5)呼び出し26,117
$80D6 (バンク 5)呼び出し25,986
$D85D (バンク 7)呼び出し25,730
$DC88 (バンク 7)呼び出し25,730
$EB64 (バンク 7)呼び出し25,730
$F10D (バンク 7)呼び出し25,730
$D710 (バンク 7)呼び出し25,337
$D9E4 (バンク 7)呼び出し25,337
$E625 (バンク 7)呼び出し25,337
$E677 (バンク 7)呼び出し25,337
$EFF1 (バンク 7)呼び出し25,337
$DD32 (バンク 7)呼び出し24,985
$E560 (バンク 7)呼び出し24,985
$81A4 (バンク 6)呼び出し23,210
$81B5 (バンク 6)呼び出し23,210
$81E5 (バンク 6)呼び出し23,210
$DD6C (バンク 7)呼び出し20,173
$DFE9 (バンク 7)呼び出し20,143
$E024 (バンク 7)呼び出し20,143
$E054 (バンク 7)呼び出し19,545
$E07B (バンク 7)呼び出し18,353
$F53E (バンク 7)呼び出し14,826
$F568 (バンク 7)呼び出し14,826
$C3E1 (バンク 7)テーブル14,580
$DF87 (バンク 7)呼び出し14,580
$867F (バンク 4)呼び出し14,256
$EC7B (バンク 7)テーブル9,980
$ED0D (バンク 7)テーブル7,431
$87A0 (バンク 4)呼び出し7,276
$84F2 (バンク 3)テーブル6,188
$84D7 (バンク 3)テーブル5,282
$8535 (バンク 3)テーブル4,910
$8225 (バンク 3)テーブル4,730
$820A (バンク 3)テーブル4,700
$EEE7 (バンク 7)呼び出し4,634
$81F0 (バンク 3)テーブル4,530
$F85D (バンク 7)テーブル4,217
$F86F (バンク 7)テーブル4,188
$F850 (バンク 7)テーブル4,171
$F86A (バンク 7)テーブル4,148
$F83E (バンク 7)テーブル4,140
$F831 (バンク 7)テーブル4,121
$8471 (バンク 3)テーブル3,713
$822F (バンク 4)呼び出し2,632
$F62D (バンク 7)呼び出し2,421
$83E6 (バンク 3)テーブル2,374
$823A (バンク 3)テーブル2,301
$8205 (バンク 3)テーブル2,265
$83CB (バンク 3)テーブル2,192
$8009 (バンク 5)テーブル2,131
$F2DD (バンク 7)呼び出し2,119
$81AA (バンク 4)呼び出し1,888
$D5B2 (バンク 7)テーブル1,790
$815D (バンク 5)呼び出し1,688
$C431 (バンク 7)テーブル1,515
$C487 (バンク 7)テーブル1,286
$EDB1 (バンク 7)テーブル1,269
$8340 (バンク 4)呼び出し1,191
$8398 (バンク 4)呼び出し1,191
$8243 (バンク 3)呼び出し1,128
$E5B3 (バンク 7)呼び出し1,024
$8000 (バンク 6)テーブル969
$8157 (バンク 6)呼び出し969
$8166 (バンク 6)呼び出し969
$BFB3 (バンク 6)呼び出し969
$83A3 (バンク 5)呼び出し965
$8192 (バンク 4)呼び出し944
$81CF (バンク 4)呼び出し944
$81DE (バンク 4)呼び出し944
$E2C3 (バンク 7)呼び出し923
$F745 (バンク 7)呼び出し920
$80DD (バンク 5)呼び出し844
$8210 (バンク 5)テーブル823
$8448 (バンク 3)テーブル817
$81FD (バンク 4)呼び出し815
$8396 (バンク 5)呼び出し809
$84C3 (バンク 3)テーブル631
$85EB (バンク 4)呼び出し564
$80BE (バンク 4)呼び出し401
$860A (バンク 4)呼び出し347
$8407 (バンク 3)テーブル346
$C6B3 (バンク 7)テーブル308
$C466 (バンク 7)テーブル297
$E132 (バンク 7)呼び出し293
$868D (バンク 4)呼び出し289
$C4BE (バンク 7)テーブル270
$8500 (バンク 3)テーブル176
$850D (バンク 3)テーブル165
$8327 (バンク 5)テーブル156
$E254 (バンク 7)呼び出し151
$8000 (バンク 4)呼び出し142
$E526 (バンク 7)呼び出し142
$8431 (バンク 3)テーブル133
$83FA (バンク 3)テーブル125
$E7DC (バンク 7)呼び出し120
$E7E7 (バンク 7)呼び出し120
$F0F3 (バンク 7)呼び出し120
$E233 (バンク 7)呼び出し116
$D97C (バンク 7)呼び出し115
$E30A (バンク 7)呼び出し115
$F653 (バンク 7)呼び出し115
$F6B5 (バンク 7)呼び出し115
$851C (バンク 3)テーブル109
$E2AF (バンク 7)呼び出し106
$8516 (バンク 3)テーブル97
$E285 (バンク 7)呼び出し85
$C3BD (バンク 7)テーブル81
$EE55 (バンク 7)テーブル62
$EE99 (バンク 7)テーブル62
$8296 (バンク 5)テーブル22
$CB37 (バンク 7)呼び出し21
$E28F (バンク 7)呼び出し17
$C41B (バンク 7)テーブル12
$800C (バンク 5)テーブル8
$8270 (バンク 5)テーブル8
$82B0 (バンク 5)テーブル6
$830D (バンク 5)テーブル6
$D98E (バンク 7)呼び出し5
$D989 (バンク 7)呼び出し4
$E1BD (バンク 7)呼び出し3
$86C1 (バンク 4)呼び出し2
$C402 (バンク 7)テーブル2
$C67F (バンク 7)テーブル2

ジャンプに使うテーブル

ゲームがその中から一つを選ぶ、アドレスのテーブル。ジャンプエンジンへの呼び出しの直後にあるものもあれば、カートリッジのどこかにあるものもある。後者は、ゲームが通って跳んだアドレスがどこから読み込まれたかで見つける。アドレスを積んでそこへ戻ることで跳ぶゲームもあれば、テーブルを二つに分けて、アドレスの下位バイトをある場所に、上位バイトを別の場所に置くゲームもある。どちらも同じやり方で見つける。項目は、走行が選ぶのを見た所までを数える。本当のテーブルはもっと長いかもしれない。最後の列は、その値が項目を選んだメモリのバイトで、追えた場合だけ書いてある: ゲームのモードか、物体の一つが今していることだ。

場所届き方項目選ばれた数選んだバイト
$81E0 (バンク 3)ポインタ経由85$00F8
$838B (バンク 3)ポインタ経由3215$066C, $067C
$820C (バンク 5)呼び出しの直後22$0319
$8221 (バンク 5)呼び出しの直後84
$BFB6 (バンク 5)呼び出しの直後54
$BFB6 (バンク 6)呼び出しの直後11
$F087 (バンク 7)ポインタ経由95$0028, $0094, $043F, $006F
$F8E4 (バンク 7)ポインタ経由66$003E, $0086, $00A3, $005F

ルーチンが共有するメモリ

あるルーチンが書き、別のルーチンが読んだメモリは 599 バイト。添字を通して届いた場所は 83 か所で、メモリの中のテーブルや、物体の枠の並びはそう見える。

004080C0$0000$0100$0200$0300$0400$0500$0600$070011→1→111X11X1+1Y1Y111122X2
コンソールのメモリ 2,048 バイト。一行が 256 バイト。 番号の付いた帯は、下に描いた物体の表の列の一つで、番号は下の並び順と同じ。長さは表と同じで、塗り方も下の図と同じだ。表の列どうしが重なる所では、ものが一つずつ、それぞれの性質をすべて持って順に並んでいるので、表は一つの輪郭として描き、性質が始まる所ごとに印を付けてある。 濃い四角は、規則が比較を見た位置。 行の下の印は、最も忙しい共有バイト 24 個のうちの一つ。 二行目は、プロセッサがスタックを置くページだ。 添字で届いた範囲のうち、どの表にも属さないものは描いていない: メモリを消すループは、ほとんどすべてのバイトに届くからだ。 列が近すぎて一つずつ名前を書けない所では、ラベルを 1 個省いた。下の図にはすべての名前がある。

添字で届いた範囲: 位置を含むもの、次いで最も長いもの

起点届いたバイト命令含まれる位置
$0460817横 6
$0450813横 2
$0480813縦 4
$047086縦 2
$04D946横 1
$03002562
$02002534
$02032533
$02012532
$02022532
$06271131
$06281131

位置と一緒に動くもの

少なくとも二つのルーチンが、位置の配列と一緒に、同じ範囲をたどった配列。画面上のものの表は、メモリの中ではこう見える: 性質ごとに配列が一つ、ものごとに枠が一つ。どの配列が位置を持つかは言える。ほかの配列のうち、どれが位置に足し込まれるか (速度がすること) と、どれがジャンプのテーブルの行き先を選ぶか (状態や種類がすること)、どれが減らされる一方か (タイマーがすること) も言える。残りが何を持つかは、まだ名付けていない。

01234567$0400$0410→$0438→$0440$0448$0450X$0458$0460X$0468+$0470Y$0480Y$0488$0490$0498$04B0
表 1: 24 個のルーチンが一緒にたどる、最大 8 枠の配列 15 本。列はそれぞれのアドレスにある配列、行は枠で、画面上のもの一つが、すべての列を横切る一行になる。 X と Y は位置で、濃い四角は規則が比較を見た枠。+ は位置に足し込まれる配列で、速度がすることだ。→ はジャンプを選んだ配列で、状態や種類がすることだ。↓ は減らされる一方の配列で、タイマーがすることだ。輪郭だけの列は一緒に動くが、まだ名付けていない。
0123$04D1$04D5$04D9X$04E1
表 2: 3 個のルーチンが一緒にたどる、最大 4 枠の配列 4 本。列はそれぞれのアドレスにある配列、行は枠で、画面上のもの一つが、すべての列を横切る一行になる。 X と Y は位置で、濃い四角は規則が比較を見た枠。+ は位置に足し込まれる配列で、速度がすることだ。→ はジャンプを選んだ配列で、状態や種類がすることだ。↓ は減らされる一方の配列で、タイマーがすることだ。輪郭だけの列は一緒に動くが、まだ名付けていない。
枠配列ルーチン横の位置縦の位置位置に足し込まれる配列ジャンプを選ぶ配列減らされる一方の配列一緒に動く配列
81524$0450, $0460$0470, $0480$0468$0410, $0438$0400, $0410, $0438, $0440, $0448, $0458, $0468, $0488, $0490, $0498, $04B0
443$04D9$04D1, $04D5, $04E1

最も忙しい共有バイト 24 個

バイト読み書き書くルーチン読むルーチン
$00F04,924,73336
$00284,816,64046
$00F34,420,21126
$00F24,111,34025
$00003,631,05266
$00F13,494,07936
$00012,904,63166
$00021,509,70866
$0031688,89544
$0030688,89144
$00F4479,80366
$0073469,21766
$00F5453,19166
$0034448,10343
$033F434,80356
$0003415,52745
$0380408,55345
$004E393,40324
$005C386,13533
$001C284,59466
$008C282,22945
$0004268,96766
$0033264,29644
$0032264,27644

このページはゲームのバイトを一つも見せない。これらの数を読み取ったリスティングは、カートリッジと一緒に留まる。

すべてのゲーム