NEStinymachines

Q-bert (USA)

Q-bert (USA) は CNROM の基板に載り、プログラムは 32,768 バイト。電源投入から 6,400 歩のクロールが、新しいコードを見つけた道筋を 56 本残した。それらを 251,556 フレームにわたって再生すると、プログラムのうち 8,718 バイト、27 パーセントが実行された。

規則が名付けたもの

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

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

場所リスティングでの名前入り方回数何であるか、その証拠
$911Esprites_911E呼び出し1,304,277
スプライトの書き手: 走ったフレーム 81,519、スプライトのページへの書き込み 3,237,903
$91ECsprites_91EC呼び出し1,079,301
スプライトの書き手: 走ったフレーム 66,686、スプライトのページへの書き込み 1,079,299
$8207engine_8207呼び出し282,967
ジャンプエンジン: テーブル 18、そこを通った跳躍 282,967
$CE58sound_CE58呼び出し179,428
サウンドドライバ: 走ったフレーム 45,282、書き込み 15,987
$CC12poll_CC12呼び出し163,051
パッドの読み取り: ポート $4016、一フレームの読み 16、一フレームのストローブ 4
パッドの読み取り: ポート $4017、一フレームの読み 16、一フレームのストローブ 4
$CAF5nmi毎フレーム(NMI)81,735
割り込みの中のゲーム: 走ったフレーム 81,791、全フレーム 82,296、待機の場所 $CAF2
$90A5drain_90A5呼び出し81,573
パレットの書き手: 走ったフレーム 81,573、書き込み 7,136
画面メモリへの書き手: 走ったフレーム 81,573、書き込み 257,177、ブランク中 256,645、描画中 532
$CB69scroll_CB69呼び出し81,573
スクロールの書き手: 走ったフレーム 81,545、ブランク中の書き込み 163,090
$8000random_8000呼び出し81,525
乱数のバイト: 走ったフレーム 80,637、バイト $003C,$003D、回転 2、排他的論理和 1
$9292sprites_9292呼び出し81,520
スプライトの書き手: 走ったフレーム 81,519、スプライトのページへの書き込み 4,137,789
$BA3Ccompare_BA3C呼び出し11,684
二つのものを比べる所: 命令 2、バイトの組 25、バイトの総数 20、比べた回数 12,986、横の位置のバイト $0480,$0482,$0483,$0484,$0485,$0490,$0492,$0493,$0494,$0495、縦の位置のバイト $0460,$0462,$0463,$0464,$0465,$0470,$0472,$0473,$0474,$0475
$B39Edispatch_B39Eテーブル2,654
二つのものを比べる所: 命令 1、バイトの組 6、バイトの総数 5、比べた回数 373、横の位置のバイト $0480,$0482,$0483,$0484,$0490
$B4D7dispatch_B4D7テーブル2,150
二つのものを比べる所: 命令 3、バイトの組 9、バイトの総数 9、比べた回数 4,211、横の位置のバイト $0480,$0482,$0490、縦の位置のバイト $0460,$0462,$0463,$0464,$0465,$0470
$E88Dsprites_E88D呼び出し971
スプライトの書き手: 走ったフレーム 971、スプライトのページへの書き込み 971
$B404dispatch_B404テーブル743
二つのものを比べる所: 命令 1、バイトの組 2、バイトの総数 3、比べた回数 328、縦の位置のバイト $0460,$0462,$0470
$CC3Bbank_CC3B呼び出し194
バンク切り替え: 書き込み 388、ブランク中 4、描画中 384
$CA85reset電源投入56
バンク切り替え: 書き込み 112、ブランク中 112、描画中 0
スプライトの書き手: 走ったフレーム 81,791、スプライトのページへの書き込み 14,336
$CC37bank_CC37呼び出し56
バンク切り替え: 書き込み 112、ブランク中 0、描画中 112
$9329呼び出し1,160,818
$8452呼び出し664,576
$D3CD呼び出し179,428
$D430呼び出し104,220
$CE35呼び出し98,459
$D4C9呼び出し91,411
$CB9F呼び出し81,573
$CBB5呼び出し81,530
$CD6C呼び出し81,530
$CDDA呼び出し81,530
$CE3C呼び出し81,530
$CBDB呼び出し81,526
$84FD呼び出し81,517
$CBF7呼び出し81,500
$9C73テーブル50,426
$D20E呼び出し47,694
$D237呼び出し47,694
$D1A7呼び出し35,214
$D1C6呼び出し35,214
$9CDCテーブル31,422
$E510呼び出し31,390
$D252呼び出し29,546
$E8B9呼び出し26,880
$E8E0呼び出し26,196
$E85F呼び出し26,096
$8132呼び出し24,896
$E4E9呼び出し23,441
$E5D4テーブル22,899
$E611テーブル21,912
$84F4呼び出し18,620
$8220呼び出し18,021
$84A1呼び出し17,911
$C4FF呼び出し15,395
$C272呼び出し14,309
$D0B7呼び出し14,270
$811Cテーブル14,095
$802Dテーブル12,958
$D1D3呼び出し12,483
$C1F1呼び出し12,376
$C7C8呼び出し12,213
$A1A4呼び出し11,809
$9EF1テーブル11,721
$E4C6呼び出し11,721
$C12E呼び出し11,720
$B9C3呼び出し11,574
$A7C5呼び出し11,552
$A880呼び出し11,552
$B123呼び出し11,552
$C28Eテーブル11,416
$C29D呼び出し11,416
$C54A呼び出し10,771
$B17E呼び出し10,060
$C286テーブル9,591
$C4E3呼び出し9,133
$C216テーブル8,155
$C4C4呼び出し8,155
$C55F呼び出し7,985
$E6D6テーブル7,508
$C56A呼び出し7,410
$81B5呼び出し6,436
$9D9Aテーブル5,600
$CC8E呼び出し4,767
$BCE7呼び出し4,704
$C555呼び出し4,624
$B1D3テーブル4,300
$E741テーブル4,185
$E7A3呼び出し4,185
$D3E7テーブル4,053
$A8C1呼び出し4,041
$D2BAテーブル3,854
$80AEテーブル3,834
$B1B3テーブル3,712
$BFD9呼び出し3,544
$C243呼び出し2,984
$C268呼び出し2,878
$EF72呼び出し2,801
$EF88呼び出し2,800
$E796テーブル2,704
$B4F3テーブル2,605
$84EE呼び出し2,334
$84F6呼び出し2,334
$F01Bテーブル1,985
$A9B6呼び出し1,957
$D1FD呼び出し1,788
$BFAD呼び出し1,772
$9E0Dテーブル1,676
$BC73呼び出し1,568
$BC82呼び出し1,568
$BDCB呼び出し1,568
$BDD9呼び出し1,568
$BDE7呼び出し1,568
$BDF5呼び出し1,568
$C145呼び出し1,492
$C190呼び出し1,492
$C196呼び出し1,492
$E81A呼び出し1,406
$B4E7テーブル1,374
$B233テーブル1,339
$D370テーブル1,108
$D39C呼び出し1,000
$A1C9テーブル962
$D38F呼び出し856
$D2C1テーブル806
$C21Fテーブル787
$C2F7呼び出し786
$E59Aテーブル784
$E5AFテーブル784
$B1C3テーブル709
$CEBE呼び出し674
$E94D呼び出し642
$C2AFテーブル599
$C33E呼び出し599
$E575呼び出し594
$CBC3呼び出し584
$C23C呼び出し580
$A222テーブル561
$CB89呼び出し533
$E5DFテーブル495
$E5FAテーブル492
$9E73テーブル476
$CD57呼び出し418
$C000呼び出し408
$A217テーブル384
$B6C0呼び出し381
$D2D4テーブル379
$E940呼び出し322
$E730テーブル300
$9E1Fテーブル297
$F0A6テーブル256
$814C呼び出し253
$B73D呼び出し236
$F102呼び出し232
$83E0呼び出し228
$C37Dテーブル215
$EFDAテーブル200
$E51Dテーブル199
$E918呼び出し198
$83E4呼び出し193
$9E2Bテーブル174
$F04Eテーブル148
$D3DA呼び出し144
$D340テーブル138
$9E23テーブル132
$8143呼び出し121
$8303呼び出し117
$B31Eテーブル116
$CC56呼び出し115
$E645呼び出し115
$81D4呼び出し114
$B267テーブル113
$E70Dテーブル100
$E6E9テーブル99
$B243テーブル94
$B37Fテーブル93
$D2EBテーブル90
$E77Fテーブル87
$EFFDテーブル80
$A2CAテーブル78
$C448呼び出し72
$F072テーブル72
$9E27テーブル70
$B665テーブル64
$A871呼び出し62
$A913呼び出し62
$A99C呼び出し62
$AA50呼び出し62
$AA6A呼び出し62
$83BA呼び出し59
$9E9D呼び出し58
$8157テーブル56
$8174テーブル56
$817Fテーブル56
$9E5D呼び出し56
$BC24呼び出し56
$BE1C呼び出し56
$CA8A割り込み(IRQ)56
$CB53呼び出し56
$9CA8呼び出し55
$B149呼び出し54
$9CE7テーブル52
$80F2テーブル50
$8107テーブル50
$81CF呼び出し50
$81D8呼び出し50
$8236呼び出し43
$8290呼び出し39
$E6FBテーブル33
$9D20テーブル30
$8265呼び出し28
$9E41テーブル28
$9EC8テーブル28
$BBE2呼び出し28
$C77A呼び出し28
$B2B3テーブル27
$B2F7テーブル27
$EFCCテーブル25
$EFE5テーブル25
$C356テーブル19
$C806呼び出し18
$A1D4テーブル17
$C219呼び出し15
$C42F呼び出し15
$E908呼び出し9
$C451呼び出し6
$EFA2テーブル5
$F037テーブル4
$C459テーブル3
$C49Dテーブル2
$CD9B呼び出し1

待つ場所

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

場所リスティングでの名前何であるか、その証拠
$CAF2spin_CAF2
待機のループ: 周回 550,559,895、一フレームの周回 6,689

ジャンプに使うテーブル

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

場所届き方項目選ばれた数選んだバイト
$801B呼び出しの直後98$0018
$8179呼び出しの直後11$0090
$9C8A呼び出しの直後149$0034
$9CE1呼び出しの直後33$0090
$9DD4呼び出しの直後55
$A1CE呼び出しの直後33$0088
$B1A1呼び出しの直後94$0613, $0614, $0615, $0616
$B1B9呼び出しの直後44$061B
$B1C9呼び出しの直後44$061E, $061B
$B1D9呼び出しの直後55$061C, $061D, $061B
$B239呼び出しの直後44$061B
$C1F8呼び出しの直後119$0053
$D457ポインタ経由217
$E515呼び出しの直後44$008E
$E59F呼び出しの直後11$008F
$E5D9呼び出しの直後33$008F
$E6DB呼び出しの直後77$008F
$E885呼び出しの直後44$002E
$EF8E呼び出しの直後1010$060A

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

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

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

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

起点届いたバイト命令含まれる位置
$04601624縦 5
$04801615横 5
$047063縦 5
$049063横 5
$030025639
$070025614
$040025612
$05002561
$02002532
$02012531
$02022531
$02032531

位置と一緒に動くもの

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

0123456789101112131415$0400+240$0410$0420$0440$0460Y$0470Y$0480X$0490X$0611→$0619→
表 1: 24 個のルーチンが一緒にたどる、最大 16 枠の配列 10 本。列はそれぞれのアドレスにある配列、行は枠で、画面上のもの一つが、すべての列を横切る一行になる。 列の下の数は、その配列が表の長さを超えて届いたバイト数。 X と Y は位置で、濃い四角は規則が比較を見た枠。+ は位置に足し込まれる配列で、速度がすることだ。→ はジャンプを選んだ配列で、状態や種類がすることだ。↓ は減らされる一方の配列で、タイマーがすることだ。輪郭だけの列は一緒に動くが、まだ名付けていない。
枠配列ルーチン横の位置縦の位置位置に足し込まれる配列ジャンプを選ぶ配列減らされる一方の配列一緒に動く配列
161024$0480, $0490$0460, $0470$0611, $0619$0400, $0410, $0420, $0440, $0611, $0619

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

バイト読み書き書くルーチン読むルーチン
$00009,977,12866
$00088,630,69866
$00098,406,23166
$00017,593,10766
$00036,703,81366
$00025,145,87866
$00055,067,35466
$000E3,430,92946
$00042,963,67866
$000C2,501,84423
$000B2,260,33133
$00221,013,18323
$00AB926,22426
$009A608,72166
$00F7489,11223
$00A5440,41766
$000D421,83956
$0032384,95266
$0030376,59056
$0098375,02736
$0099375,02736
$001E311,56866
$009B306,22266
$0601287,42565

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

すべてのゲーム