ビデオゲームの解析のために、 FCEUXで実装されているような Code/Data Logger(以下CDL)を活用してみようという試みです。今のところNES限定に なると思います(私はNES以外はほとんどわからないので^^;)
CDLとは、「プログラム内でどの部分がコードとして使われ、どの部分がデータと して使われたか」のログをとるツールです。当然、ログに記録されるのはプログラム 動作中にアクセスされた領域のみなので、プログラム全体のログをとるためには色々 な方法でプログラムを動作させ、なるべく多くのコード/データへのアクセスを発生 させる必要があります。
大まかな雰囲気を示すために、FCの「F1レース」のCDLログを後述の cdl2txt で HTML化したものを置いておきます。
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には他にも以下のような利点があります:
とりあえずFCEUXでの例:
ゲーム起動後、メニューからCDLを起動すると上のようなウィンドウが現れるので、 "Start" を押してやるとロギングが開始されます。後は適当にプレイする だけ。ログの読み込み/保存はLoad/Saveボタンから。
ゲームにもよると思いますが、なるべく隅々まで網羅するような感じでプレイす れば網羅率(100 から "Bytes Not Logged" の数値を引いたもの)は8~9割 程度にはなると思います。なお、コード/データ兼用領域が存在する場合もあるため、 必ずしも (コード率) + (データ率) = (網羅率) とはならないことに注意。
出力されるCDLファイルはiNESヘッダを取り除いたROM本体と同じサイズで、各 Byteにコード/データ区分を示すビットフラグが書き込まれています。詳しいフォー マットについてはFCEUXのヘルプファイルを参照。
なお、"Save Stripped iNes Rom..." を押すと、CDLログに記録されな かった領域を0で埋めた .nes ファイルが出力されます。
今のところCDLファイルに対応したツール類は見当たらないので、やっつけで自作 してみました(万人向けとは言いがたいものですが…)。
CDLファイルを直接読み込める逆アセンブラの制作を検討中です。
追記: NesDevフォーラム のCelius氏がCDLに対応した逆アセンブラ(GUI)を開発しているようです。
私が採取したいくつかのCDLログを公開しておきます。利用 はご自由に。
CDLログ採取/公開の際の指針などを適当に考えてみました: