PSやろーぜ'99[第2回]
■ どこから手を付けようか...
エミュレータを作る上で一番最初にやるべきことは、CPUのエミュレートでしょう。
CPUはハードの心臓部です。これなしにはほかのデバイス(SPU,GPU等)を操作するこ
とさえもできません。とりあえずmipsの本(通称青本)とにらめっこしながら命令の
処理を実装していきます。RISC型のCPUは命令が単純なのでCISC型のCPUと比べて実
装が楽です。R3000は一命令4バイトと統一されているのでかなり実装がやりやすい
です。また、R3000はメモリマップドI/O(I/O領域がメモリアドレス上に存在)なので
この時点では、まだ実装の必要がありません。とはいえ、CPU部分を作っただけでは
プログラムを走らせることはできないので、メモリ部分を同時進行で実装します。
もちろん、メモリ部分にはメインメモリや外部ROMの実装のほかにI/Oの実装を行な
います。
CPUの実装で注意したいのは、やはりCPUの特性をおさえることでしょう。R3000には
メモリ読みこみ時に遅れてデータが読み込まれる(遅延ロード)や、分岐命令が遅れ
て実行される(遅延分岐)などをしっかり実装するようにします。遅延ロードに対し
てはそんなに注意しなくてもいいですが、遅延分岐に対してはしっかり考慮してな
いと実行がとんでもないことになってしまいます。また、例外処理も注意して組ま
ないとプログラムが永久ループに陥ってしまうことがあります。
メモリの実装で注意したいのは、メモリにマップされたI/Oの処理でしょう。割り込
みやタイマ、DMAなどの処理は情報が不完全で試行錯誤するしか方法がないみたいで
す。うまくいけば永久ループを脱出できることでしょう。
この時点エミュがちゃんと動作しているかを確認するためには、デバッガを使って
メモリやレジスタの内容を確認する方法の他に、実行経過のログをとることも有用
です。I/Oのアクセスに対して書き込まれるデータや、読み込まれたデータをログ
として出力することでハードウェアの扱い方を推測することができます。
現在の開発状況といえば、SCEのロゴが出たあとにCD-ROMアクセスで永久ループに入
ってしまってゲームが読みこめないんですよ。こりゃ解析あるのみだ。
- 1999年10月25日 -