新型PCEエミュレータの開発

昨日のエントリーでmednafenをベースに開発しようかなーという話を書きましたが、
mednafenをVisual C++ 2010 expressでビルドできるようにするまでがけっこう大変そうでした。
ちょっとやってみたんですけどね。
ひさびさにC言語をいじってると、
2重インクルード抑止のマクロとか、
複雑に入り組んでて
Javaとかになれちゃうとなかなかきついものがありますねえ…

というわけで、mednafenベースはやめだやめ!というわけで
Ootakeベースにすることにしました。

こちらは、Visual Studio 2008で開発されているらしく、2010 expressでも
無修正でビルドできました。


やっぱ無修正がいいよねー。


こちらのソースコードは非常に丁寧にメンテを続けてきたのが見ると良く分かります。
俺なんかが手をいれるのは気が引けますね。

こちらはあまりマクロとかが使われていないので、Javaに持っていくのも割と楽そうです。
最初からOotakeベースにすればよかったですねえ…


また、JITコンパイルをどうするかということについても調べてました。
PCEのCPUである、HuC6280のコード列のうち、何度も実行された場所について
Java bytecodeに変換して、クラスローダ経由で読み込み、次回からは代わりにそれを実行
するようにすればよいわけです。

そこで、Java bytecodeをどうやって生成するか?ということなんですが、
Java bytecodeをマニピュレーションするためのライブラリがいくつか存在しているようです。

そのなかで、今回はJavassistを使ってみることにしました。

このライブラリを使うと、面白いことがいろいろとできます。
既存classファイルを読み込んで、メソッドを追加したり、メソッドの頭とか末尾とかに処理を追加したりすることが
簡単にできます。
そして、中身をいじったclassを、そのままロードすることもできますし、ファイルに書き出すこともできます。

おおっ、ということは、これでほとんどJITコンパイラが出来たも同然ではないですか!


また、JITコンパイルまでいかなくても、コード(特にCPUコア)の最適化にも利用できそうです。
ixpceでは、手作業でコードをインライン展開して速度を稼ぎました。
その結果、かなり可読性が劣るソースになってしまいました。
しかし、javassistを使えば、インライン展開と同等のことをプログラムにやらせることが可能ですね。
可読性を保ったまま、速度を稼ぐことが可能になるわけです。
これはいいかもしれません。