Darkside(リンクエラー修正しました)

2013年11月11日(月) 21:15

ミサイルコマンド解析

 完全自動プレイを行なうためには、いろいろ情報を集めねばならない。ミサイルの位置などを知るには、メモリーのどこにその情報が格納されているかを知らねばならない。
 ところが、いきなり最初から躓いた。MAME-rr には search memory とか watch
memory など解析に必須の機能が備わっているのだが、ミサイルコマンドではなぜか動作しない。search
memory はエミュレーターが落ちてしまう。たまに落ちない場合でも、何も表示されない。他のゲームで試すと、プレステ系のエミュで御馴染みの画面が表示される。メモリー内容も表示される。
 watch memory ではどんなアドレスを入れても、それは不正アドレスだと弾かれて何も確認できない。

 これでは、どこに何が格納されているか分からず、自動プレイとかTASとか論外だ。
 ミサイルコマンドは人気ゲームではあるので、誰か既にメモリーマップを解析していないかネット検索してみる。殆どヒットせず、一部情報だけ出てきた。それを見て、遅まきながら気付いた。そうだ、MAME
のソースリスト。少なくとも、プログラムがどのアドレスに格納されているか不明では、エミュレーターは動作しない。そのあたりの事情はゲーム個別で異なる。それが、プレステなどコンシューマー機のエミュとの違いである。アーケードのエミュではゲーム毎に個別対応の部分が多く、ミサイルコマンド独自の情報もソースリストの個別対応部分に書かれている。
 こうして、プログラムが 0x5000 から 0x7FFF に格納されていると判明。CPUがファミコンと同じなのも既知なので、いちおう逆アセンブルしておく。

 更に、キー入力やコイン投入が、0x4800 と 0x4900 を利用した memory mapped
I/O であることも判明した。まあ、よくあるパターンだ。
 また、ワークRAM が 0x0000 から 0x01FF までと、0x0600 から 0x063F までであることも判明した。さすがに古いハードだけあり、RAM
は少ない。
 まてよ・・・512+64 バイトしかワークRAMが無いなら、すべてリストアップしても大したことがないぞ。

 lua スクリプトの memory.readbyte() を使用し、RAMの内容をすべて読み出す。画面表示などやってられないからファイルに出力するが、幸い
MAME-rr の lua は両方とも完全に対応していた。さもなければ、手詰まりになるところだった。

 8フレームごとに8回出力させ、結果をエクセルに読み込んで確認。ミサイル関係のワークは、簡単に判明した。始点と終点と現在位置と移動ベクトルが、それぞれ別々に格納されている。移動計算はデジタル微分解析だろうと予想していたが、単なる固定小数点だった。
 ドット位置の他に、256分の1ドット単位の少数部を記録している。移動計算は、256分の1ドット単位で行なっている。当たり判定は、整数部だけで行なっている可能性が高い。

 ミサイル用のワークは8発分しかないので、画面に一度に表示されるミサイルも8発までである。
 迎撃ミサイル側も、同様に8発。同時期の日本のシューティングゲームの場合、画面に一度に表示可能な自弾は1〜2発だったから、先進的だ。しかも、4方向とか8方向の制限はなく、画面解像度の範囲内でどの向きにでも発射できる。
 それ以外に、水平移動する爆撃機用にワークが1セット用意されている。どうも確証は持てないが、プレイ動画を見る限り爆撃機が同時に2つ出現しているものはない。

 アドレスの意味が判明すれば、逆アセンブルを見て更に情報が得られる。ワークRAMのダンプと逆アセンブルを並行活用し、少しずつ解析を進行させる。

written by higashino [ゲーム] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(リンクエラー修正しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4