CDL計画

CDL計画とは

ビデオゲームの解析のために、 FCEUXで実装されているような Code/Data Logger(以下CDL)を活用してみようという試みです。今のところNES限定に なると思います(私はNES以外はほとんどわからないので^^;)

CDLとは、「プログラム内でどの部分がコードとして使われ、どの部分がデータと して使われたか」のログをとるツールです。当然、ログに記録されるのはプログラム 動作中にアクセスされた領域のみなので、プログラム全体のログをとるためには色々 な方法でプログラムを動作させ、なるべく多くのコード/データへのアクセスを発生 させる必要があります。

大まかな雰囲気を示すために、FCの「F1レース」のCDLログを後述の cdl2txt で HTML化したものを置いておきます。

CDLの利点

CDLのわかりやすい利点として、逆アセンブルが楽になることが挙げられます。一 般に、逆アセンブラはコード領域とデータ領域を完全には判別できないため、しばし ば以下のようなアセンブルリストが出力されます (md6502 を使っ た例):

  C541 : 02             db      #$02            ;
  C542 : 05 20          ora     $20             ;
  C544 : 1B             db      #$1B            ;
  C545 : C9 A2          cmp     #$A2            ;
  C547 : 00             brk                     ;

上の例では、実際には $C542 までがデータ領域であり、コード領域は $C543 か ら始まるのですが、逆アセンブラがコード/データ境界を検出できずに誤ったコード を出力しています。これを手直ししてやると:

  C541 : 02             db      #$02            ;
  C542 : 05             db      #$05            ;

  C543 : 20 1B C9       jsr     $C91B           ;
  C546 : A2 00          ldx     #$00            ;

のようになります。しかし、こうした修正作業は面倒(私の場合、命令表を参照し ないと機械語が読めない^^;)なので、事前にできるだけコード/データ領域を特定し ておき、逆アセンブラにデータ領域を教えてあげるようにすれば、修正の手間がかな り軽減されるというわけです。

CDLには他にも以下のような利点があります:

CDLの使い方

とりあえずFCEUXでの例:

FCEUX CDL screenshot

ゲーム起動後、メニューからCDLを起動すると上のようなウィンドウが現れるので、 "Start" を押してやるとロギングが開始されます。後は適当にプレイする だけ。ログの読み込み/保存はLoad/Saveボタンから。

ゲームにもよると思いますが、なるべく隅々まで網羅するような感じでプレイす れば網羅率(100 から "Bytes Not Logged" の数値を引いたもの)は8~9割 程度にはなると思います。なお、コード/データ兼用領域が存在する場合もあるため、 必ずしも (コード率) + (データ率) = (網羅率) とはならないことに注意。

出力されるCDLファイルはiNESヘッダを取り除いたROM本体と同じサイズで、各 Byteにコード/データ区分を示すビットフラグが書き込まれています。詳しいフォー マットについてはFCEUXのヘルプファイルを参照。

なお、"Save Stripped iNes Rom..." を押すと、CDLログに記録されな かった領域を0で埋めた .nes ファイルが出力されます。

ツール

今のところCDLファイルに対応したツール類は見当たらないので、やっつけで自作 してみました(万人向けとは言いがたいものですが…)。

cdl2txt
16K単位に分割されたCDLファイルを読み取り、同じ値の領域をまとめた上でタ ブ区切りのテキストファイルに変換します。変換結果をHTMLや md6502 のオプショ ンファイルに変換するスクリプト(要Python)も同梱しています。なお、md6502.py を使用する場合は、オリジナルの md6502 を使用するとバッファ溢れで落ちる場合 があるので、拙作のmd6502-modの使用を推奨しま す。

CDLファイルを直接読み込める逆アセンブラの制作を検討中です。

追記: NesDevフォーラム のCelius氏がCDLに対応した逆アセンブラ(GUI)を開発しているようです。

CDLログの公開

私が採取したいくつかのCDLログを公開しておきます。利用 はご自由に。

CDLログ採取/公開の際の指針などを適当に考えてみました:


Back