NEStinymachines

Paperboy (USA)

Paperboy (USA) は CNROM の基板に載り、プログラムは 32,768 バイト。電源投入から 8,000 歩のクロールが、新しいコードを見つけた道筋を 39 本残した。それらを 101,779 フレームにわたって再生すると、プログラムのうち 9,018 バイト、28 パーセントが実行された。

規則が名付けたもの

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

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

場所リスティングでの名前入り方回数何であるか、その証拠
$86BEhandlers_86BE呼び出し156,809
メモリに置かれたハンドラ: 跳躍 132,729、着地した場所 79、アドレスの写し元 $0008,$000D,$04B6,$04CF
$80EApoll_80EA呼び出し85,719
パッドの読み取り: ポート $4016、一フレームの読み 13、一フレームのストローブ 5
パッドの読み取り: ポート $4017、一フレームの読み 8、一フレームのストローブ 5
$8006nmi毎フレーム(NMI)39,502
割り込みの中のゲーム: 走ったフレーム 39,502、全フレーム 39,619、待機の場所 $80A1
スクロールの書き手: 走ったフレーム 39,502、ブランク中の書き込み 77,486
$853Edrain_853E呼び出し38,791
パレットの書き手: 走ったフレーム 38,791、書き込み 1,585
画面メモリへの書き手: 走ったフレーム 38,791、書き込み 9,666、ブランク中 7,582、描画中 2,084
$839Ecompare_839E呼び出し38,770
二つのものを比べる所: 命令 2、バイトの組 77、バイトの総数 19、比べた回数 210,252、横の位置のバイト $0019,$001A,$001B,$001C,$001D,$001E,$001F,$0020,$0021,$0022,$0023,$0024、縦の位置のバイト $004F,$0050,$0051,$0052,$0057,$07D5
スプライトの書き手: 走ったフレーム 38,796、スプライトのページへの書き込み 4,871,921
$9C26engine_9C26呼び出し23,178
ジャンプエンジン: テーブル 3、そこを通った跳躍 11,578
$82D9compare_82D9呼び出し18,575
二つのものを比べる所: 命令 2、バイトの組 7、バイトの総数 9、比べた回数 17,237、横の位置のバイト $001D,$001E,$001F,$0020,$0025、縦の位置のバイト $0050,$0051,$0052,$0057
$98C8engine_98C8呼び出し12,712
ジャンプエンジン: テーブル 4、そこを通った跳躍 5,608
$861Acompare_861A呼び出し12,584
二つのものを比べる所: 命令 1、バイトの組 1、バイトの総数 2、比べた回数 6、横の位置のバイト $001E,$0025
$8722engine_8722呼び出し4,678
ジャンプエンジン: テーブル 9、そこを通った跳躍 4,236
$8706engine_8706呼び出し4,674
ジャンプエンジン: テーブル 36、そこを通った跳躍 2,649
$8E3Crandom_8E3C呼び出し2,395
乱数のバイト: 走ったフレーム 3,325、バイト $00C8、回転 2、排他的論理和 1
$A993dispatch_A993テーブル1,729
サウンドドライバ: 走ったフレーム 1,825、書き込み 4,436
$9543engine_9543呼び出し1,511
ジャンプエンジン: テーブル 1、そこを通った跳躍 2
$8A69engine_8A69呼び出し1,108
ジャンプエンジン: テーブル 1、そこを通った跳躍 6
$90B8compare_90B8呼び出し832
二つのものを比べる所: 命令 1、バイトの組 3、バイトの総数 4、比べた回数 822、横の位置のバイト $001E,$001F,$0020,$0025
$A24Eengine_A24E呼び出し186
ジャンプエンジン: テーブル 1、そこを通った跳躍 1
$80A4bank_80A4呼び出し157
バンク切り替え: 書き込み 314、ブランク中 14、描画中 300
$80B3engine_80B3呼び出し58
ジャンプエンジン: テーブル 1、そこを通った跳躍 58
$A50Bhandlers_A50B呼び出し42
メモリに置かれたハンドラ: 跳躍 223、着地した場所 6、アドレスの写し元 $0002,$0003
$8D16dispatch_8D16テーブル4
メモリに置かれたハンドラ: 跳躍 404、着地した場所 13、アドレスの写し元 $009D,$009E
$81F0呼び出し305,019
$81B6呼び出し60,620
$94FCテーブル46,208
$867E呼び出し38,791
$A4E2呼び出し30,782
$9F44テーブル25,445
$9FA4呼び出し25,445
$9FB6呼び出し25,445
$834D呼び出し24,172
$84F3呼び出し23,271
$8044呼び出し23,207
$8DB6テーブル23,207
$8F86呼び出し23,178
$A462呼び出し23,178
$9BE0呼び出し23,176
$832B呼び出し21,746
$8618呼び出し20,167
$9B65テーブル19,695
$865E呼び出し19,064
$A512呼び出し18,247
$A4CD呼び出し17,158
$A522呼び出し16,129
$8A70呼び出し15,516
$8151呼び出し14,523
$8A76呼び出し13,400
$8A80呼び出し13,002
$9C1C呼び出し11,578
$8A0A呼び出し11,498
$8A59呼び出し11,100
$85C4呼び出し9,698
$908Bテーブル9,607
$8DC8呼び出し8,919
$8FD6呼び出し7,457
$9E98呼び出し7,204
$8629呼び出し6,264
$88A4テーブル5,358
$872F呼び出し5,145
$8319呼び出し4,907
$84EA呼び出し4,173
$9BC3テーブル3,473
$9899テーブル3,355
$98A4テーブル3,220
$98B2テーブル3,157
$98BDテーブル2,980
$81AA呼び出し2,491
$864D呼び出し2,449
$A4E6呼び出し2,364
$9E50テーブル2,121
$9B25テーブル2,119
$817A呼び出し2,080
$818B呼び出し2,080
$9AB2テーブル2,055
$A537テーブル2,010
$9E62テーブル1,834
$A36F呼び出し1,798
$9E7Aテーブル1,662
$A356テーブル1,648
$95A4テーブル1,623
$95C4呼び出し1,623
$9E8Cテーブル1,589
$862B呼び出し1,572
$864F呼び出し1,570
$A69Bテーブル1,454
$A87Cテーブル1,281
$8790テーブル1,277
$8883テーブル1,274
$A90Eテーブル1,258
$9698呼び出し1,224
$8A65テーブル1,108
$A1D6テーブル894
$86CC呼び出し892
$9553テーブル858
$9594呼び出し858
$860F呼び出し843
$98A1テーブル831
$98ACテーブル807
$98BAテーブル783
$952Aテーブル762
$98C5テーブル760
$953Dテーブル749
$8D8Dテーブル681
$A61Dテーブル558
$8678呼び出し502
$8290呼び出し477
$90A5テーブル426
$90B2テーブル406
$8505呼び出し404
$8530呼び出し404
$863A呼び出し396
$A1C2呼び出し384
$907B呼び出し315
$8643呼び出し256
$A7BAテーブル252
$8261呼び出し223
$82B8呼び出し223
$A248呼び出し212
$8244呼び出し198
$986Eテーブル198
$A4BDテーブル198
$A1AFテーブル193
$A1BCテーブル191
$866F呼び出し183
$9494テーブル170
$A683テーブル166
$94CEテーブル154
$A36Bテーブル150
$94F0テーブル149
$94F5テーブル149
$9883テーブル140
$A5E1テーブル128
$9527テーブル127
$953Aテーブル127
$9057テーブル121
$A208テーブル110
$86C1呼び出し109
$825C呼び出し104
$9066テーブル104
$A1F6テーブル104
$95BDテーブル101
$95C1呼び出し101
$811A呼び出し96
$94E3テーブル92
$9075テーブル90
$A502テーブル83
$A50Aテーブル83
$8716呼び出し80
$9652呼び出し72
$94EBテーブル62
$A605テーブル62
$86D5呼び出し56
$91B1呼び出し56
$9235呼び出し56
$E100呼び出し53
$A235テーブル48
$A21Bテーブル47
$A242テーブル47
$852A呼び出し44
$A228テーブル44
$9E5Fテーブル43
$87BCテーブル42
$87CAテーブル42
$87D9テーブル42
$87F1テーブル42
$8813テーブル42
$882Dテーブル42
$883Eテーブル42
$885Cテーブル42
$8861テーブル42
$8868テーブル42
$887Bテーブル42
$A7B0テーブル42
$8782テーブル41
$8785テーブル41
$A4ED呼び出し41
$8048電源投入39
$8092テーブル39
$809Aテーブル39
$813E呼び出し39
$8754テーブル39
$9BDE呼び出し39
$88C8テーブル36
$95CB呼び出し36
$9E4Dテーブル36
$9E74テーブル36
$9AAFテーブル34
$9E89テーブル34
$889Cテーブル33
$821D呼び出し31
$9AA1テーブル31
$89CCテーブル29
$89D1テーブル29
$89D6テーブル29
$9B50テーブル29
$9F31テーブル29
$9F36テーブル29
$A7C9呼び出し29
$A7DCテーブル29
$A7E3テーブル29
$A7EAテーブル29
$A805テーブル29
$A897テーブル29
$A929テーブル29
$90A2テーブル28
$9F24呼び出し28
$8568呼び出し27
$8927テーブル27
$8928テーブル27
$89DC呼び出し27
$8A09テーブル27
$9ACA呼び出し27
$9D37呼び出し27
$9EF8呼び出し27
$90AFテーブル26
$9AC4テーブル24
$9493テーブル21
$9A84テーブル18
$A58Dテーブル16
$A5B2テーブル16
$A1F3テーブル15
$9E43テーブル14
$A205テーブル14
$88F0テーブル13
$9159呼び出し13
$916Eテーブル13
$917Bテーブル13
$9486呼び出し13
$A1ACテーブル13
$8A8B呼び出し12
$8A94テーブル12
$A1B9テーブル12
$9054テーブル11
$9063テーブル11
$8AA8呼び出し10
$8AB0テーブル10
$8AB1テーブル10
$8AB6テーブル10
$9072テーブル10
$9BB2テーブル10
$8AC5テーブル9
$88FBテーブル8
$890Fテーブル8
$8A52テーブル8
$9481呼び出し8
$A218テーブル7
$A225テーブル7
$8917テーブル6
$A232テーブル6
$A23Fテーブル6
$8953テーブル5
$8AF7テーブル5
$891Cテーブル4
$8AD1テーブル4
$8D05テーブル4
$8D27テーブル4
$8D30テーブル4
$8D36テーブル4
$9FD1呼び出し4
$A12B呼び出し4
$A40A呼び出し4
$879Bテーブル3
$951Dテーブル3
$95BAテーブル3
$875Fテーブル2
$8945テーブル2
$8979テーブル2
$8DB5テーブル2
$999Cテーブル2
$A4C9テーブル2
$A633テーブル2
$8DA0テーブル1
$904Aテーブル1
$9975テーブル1
$9C29テーブル1
$A1A7テーブル1
$A1C5テーブル1

待つ場所

規則が名付けたループのうち、ルーチンの内側にあって、それ自身はコードの入口ではないもの。

場所リスティングでの名前何であるか、その証拠
$80A1spin_80A1
待機のループ: 周回 271,492,681、一フレームの周回 6,852

ジャンプに使うテーブル

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

場所届き方項目選ばれた数選んだバイト
$98AA戻りで11

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

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

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

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

起点届いたバイト命令含まれる位置
$003F2522縦 5
$000D2517横 13
$02002532
$03002128
$03012114
$03021932
$02011771
$02021771
$02031771
$0773803
$0535623
$05CD448

位置と一緒に動くもの

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

04812162024$000DX$0026$003FY$0058$0071
表 1: 25 個のルーチンが一緒にたどる、最大 25 枠の配列 5 本。列はそれぞれのアドレスにある配列、行は枠で、画面上のもの一つが、すべての列を横切る一行になる。 X と Y は位置で、濃い四角は規則が比較を見た枠。+ は位置に足し込まれる配列で、速度がすることだ。→ はジャンプを選んだ配列で、状態や種類がすることだ。↓ は減らされる一方の配列で、タイマーがすることだ。輪郭だけの列は一緒に動くが、まだ名付けていない。
枠配列ルーチン横の位置縦の位置位置に足し込まれる配列ジャンプを選ぶ配列減らされる一方の配列一緒に動く配列
25525$000D$003F$0026, $0058, $0071

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

バイト読み書き書くルーチン読むルーチン
$00003,832,70566
$009E1,765,30666
$009D1,765,28646
$04501,548,19034
$00941,032,02333
$0001942,47066
$0095727,00433
$0002619,36666
$0451594,19056
$0097519,01521
$0098385,52416
$0005379,89226
$00B1255,09742
$0006193,85646
$0025163,11836
$0007139,44546
$044B137,74266
$0099122,73316
$003E121,72123
$041F117,72166
$0438117,71966
$04F9117,19466
$04FA114,32366
$04FB114,30566

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

すべてのゲーム