ixpceその後について

以前開発していたiアプリPCエンジンエミュレータのixpceですが、ソースコードを暇なときにいじってたんですが
どうも思ったような成果が出ませんでした。

特にCPUコアのソースなんですが、速度を稼ぐ目的でほとんどの処理をインライン展開してしまったので、
読みづらいし、手直ししづらくて仕方ありません。


そんなとき、以下のエミュレータの存在を知りました。
jpcsp Java psp emulator - debugger
Javaで書かれたPSPエミュレータです。

実際にゲームを動作させて試してはいないのですが、Youtubeにアップされている動画を見る限りだと、
Javaで書かれているのに、かなりの速度と互換性で動いているようです。

オープンソースプロジェクトなので、ソースコードを自由に見ることができます。
そんなわけでソースを読んでたんですが、これがめちゃめちゃすごい。
まず、すごくソースがキレイです。
Javaらしさを一切捨てずに、きちんとOOPで組まれてます。
実行速度を稼ぐために、Javaらしさとかソースの可読性を一切捨ててしまった、ixpceとは対象的です。
ソースコードのキレイさを保ったまま、実行速度を稼げている理由は何なのでしょうか?

私がちょっと調べた限りの話ですが、理由は2点あり、

  1. PSPのバイナリコード(MIPS R4000)をJITコンパイルしている
  2. PSPBIOSコールなどが、ハイレベルエミュレーション(HLE)にて実装されている

ということのようです。

ハイレベルエミュレーション(HLE)というのは、BIOSAPIなどのコードのエミュレーションを
逐次行うのではなく、それらと同等の処理をエミュレータ側で用意する機構のことだと私は思っています。

PSPBIOSはR4000のコードで組まれているはずなので、そのコードをひとつづつエミュレーションしていくこともできます。
しかし、BIOSコールという性質上、入力に対する出力というものが明確になっているため、結果さえ同じになれば
コードをひとつづつエミュレーションしなくてもいいわけです。
たとえば、ポリゴンを描画するBIOSコールがあったとした場合、そのBIOSのコードを逐次エミュレーションするよりは、
エミュレータ側でBIOSコールに渡した引数だけ取ってきて、PC側のOpenGLにポイっと渡してしまえば高速なわけです。

まあ、HLEはBIOSがあるような割と新しいマシンのエミュレーションには使える手法だと思います。
PCEの場合は、ちょっと無理そうですね。


しかし、R4000のコードからJava byte codeにJITコンパイルする部分のソースは、非常に興味深いものがあります。
まだあんまりちゃんと読んでないですけど。
とりあえず、とてもキレイなので、地道に読んでいけば構造を理解できるはずです。


そんなところで思ったのは、とりあえずixpceはクローズでいいでしょう。
ソースコードがあまりにレガシーすぎて、いじるのがつらいわけです。

別なPCエンジンエミュレータをベースにして、もっとキレイなソースと設計で、より高速動作する
エミュレータを作成することを考えてみることにします。

ベースとしては、下のエミュレータがよさそうだと思っています。
mednafen


今回は、

  1. Pure Javaで完全OOPかつ、クリーンなコードにする
  2. JITコンパイラを搭載する

を目標にしたいと思います。


まずは、mednafenの調査から始めますが、
http://d.hatena.ne.jp/aoisome/20091209/1260374202
にも書いたとおり、とにかく動作確認できる環境を作ることが重要となります。
Visual C++ 2010 expressでビルドできるように手直ししてみます。