2008-09-01から1ヶ月間の記事一覧

JavaでPlayStationエミュレータ

http://journal.mycom.co.jp/articles/2006/05/20/javaone1/ 2年前ぐらいの記事ですが、JavaでPlayStationのエミュレータを実装して、それについてのプレゼンした人がいたらしいです。プレゼンの資料のpdfがありました。 http://gceclub.sun.com.cn/java_one…

TODO

ファミコンのソフトを携帯に移植する場合に、法的な問題点が無いか調査 特殊な携帯端末への対応について 903i以降で一般的になった高解像度画面 NEC端末のニューロポインタ等、特殊な入力デバイス P902i等の音源 液晶を横に回転できる端末 複数の統計情報を…

switch文の最適化

CPUのエミュレータを高級言語で実装する場合、switch-caseを多用して実装する場合が多いと思います。その場合は、エミュレーション対象のCPUの1命令を実行するたびに、switch文を1回実行することになります。 そのため、switch文をコンパイルしたときに、ど…

もっと最適化

PPUはまだまだ最適化できる部分だらけですねぇ。今日思いついたのをメモしておきます。CHR-ROMには、2bit per pixelのフォーマットでデータをもっています。 1つのキャラクタは8×8pixelなので、16byteのデータです。 前半8byteは、pixelの下位bit、後半8byte…

60fpsでますた

PPUの最適化を進めていったところ、ついにフレームスキップ無し、サウンド有りの条件下でも60fps出るようになりました。FOMA D703iで動かしてます。 ちなみにこの機種は2年前ぐらい前なので、今となっては低速な部類です。 70Xシリーズはミドルレンジ、90Xシ…

PPUの最適化

前に書いた、キャラクタパタンを携帯JavaのAPIで描画し易いフォーマットに、静的にあらかじめ変換しておくという方法は、問題があって難しいことがわかりました。 パレットを頻繁に変更するようなゲームに対応できなくなるのです。静的に変換するのではなく…

眠い

会社でもプログラミングして、家でも夜中までプログラミングするような生活してると、体調とかに悪影響がでますねぇ… 激しく眠いー!朝起きてから会社行くまでのシーケンスも、コードと同様に限界まで最適化してますので、ギリッギリの時間まで寝てます。ア…

携帯Javaで最適化

携帯で動かした場合に、6502の1フレーム分の処理が、10msまで縮まりました。最初に携帯Javaに移植したときは35msぐらいかかってたのでだいぶ速くなりました。 1フレームは16.6msなので、他の処理にまわせる余力があと6msぐらいあります。 PPUとAPUの処理を合…

でばぐ

マリオブラザーズが2画面つながってます。 これは何をやってるかといいますと、左右で動作を比較しているのです。左が最適化してバグを入れてしまったCPUコアで動いている画面、右が最初に作ったリファレンス実装のCPUコアで動いている画面です。左側の画面…

処理時間の計測について

今までのは大ざっぱに処理時間をはかれば速くなったかがわかるような最適化だったんですが、すでに大きく削れる所は削ったので、後はかなり細かい最適化の積み重ねとなります。 最適化前と後でどの位の変化があったかを正確に測定しないと、最適化の効果を評…

速くなりますた

1スキャンライン間の6502のクロック数の計算を間違えて、本来の3倍のクロック数で駆動していたことに気が付きました。要するに、約5メガヘルツ動作の6502としてエミュレーションしていたようなものです。 これでもvblank待ちのウエイトの割合が多くなるだけ…

ハンドインライン展開

今日はひたすら手作業でインライン展開してました。 多分ですが、携帯Javaのバーチャルマシンが自動でインライン展開するようになるのはまだ先の話なんではないかと思います。アドレッシングモードに応じて有効アドレスの計算をするメソッドと、6502のそれぞ…

DoJa5.0に移植

アチョー!っていうノリでdocomoのJavaに移植しました。 とりあえず動いたんですけど、思ってたよりずっと処理が遅いんですよねえ…上の画像ではiアプリのエミュレータで動かしてますが、実機でも一応動きました。 でも、実機だと色が変でした。PPUのエミュレ…

リコンパイルする比率について

エミュレーションと静的リコンパイルのハイブリッドなので、それらの比率は適切な値を設定してやる必要があります。 比率をどれぐらいにすれば、高速かつコンパクトなバイナリになるかを、値を変えながら試してみました。実際には、プログラム領域で実行回数…

デバッグの為のコーディング

ヌル許容型を使えば、以下のようなコードが書けると思ってたんですが、これだとコンパイル出来ないんですね。 bool? flg; if (flg) { } これで、flgがヌルだったら、ヌル参照の例外が発生してくれることを期待してたのですが… キャストしたりすればいいんで…

デバッグ

なんかバグがとれないんですよねー!デバッグがやたら困難です。 マリオが宇宙空間を漂っているかのように、ゆーっくり落ちてくるようになってしまいました。 フラグ操作除去の最適化をOFFにしたら直ったので、この最適化の処理にバグがあるみたいです。おお…

描画の高速化

今まで6502コアの最適化ばっかりやってましたが、携帯JavaではPPUのエミュレーションが処理時間の内でかなりの割合を占めているようです。ファミコンのVRAMとかのビデオ周りの仕組みはかなりややこしいことになってます。 たぶん、2キロバイトという極めて少…

フラグの最適化

フラグ演算結果の参照回数を詳しくプリプロセスで解析するようにしたいです。 今は、参照0回と1回以上という区分で解析してました。それによって参照0回はコード生成しないようにしてるわけです。これを細分化して、参照0回、参照1回、参照2回以上、という区…

処理時間の計測について

.netのStopwatchクラスを使って、今まで6502の処理時間を計測してたのですが、測定の仕方がまずかったようです。1スキャンラインの時間に相当するクロック数だけ6502コアを駆動したら、PPUなどのタスクに処理が移るようにしてたので、6502の処理時間測定もそ…

気が付いたこと

なんで今まで気が付かなかったのかが不思議なんですが、プログラムカウンタの加算を全部はしょれることにさっき気が付きました。 エミュレーションではなく、トランスレートの場合です。 今までは、6502の1命令を変換したコード中には、必ずプログラムカウン…

いろいろ

ところでファミコンとか旧世代のマシンのバイナリ(ROMイメージ)をソースコードに変換するソフトを作った前例はないのでしょうか。 ネットで調べたのですが、やねうらおさんがだいぶ前に同じようなことを考えてらしたみたいです。 http://www.sun-inet.or.j…

最適化13

昨日のコードですが、以下のような感じにまでは最適化が出来ると思うんですよね。 switch (pc) { case 0xC002: clk -= 6; pc += 3; a = ppu.StatusRegister; if ((a & 0x80) != 0) { clk--; pc = 0xC002; if (clk > 0) { goto case 0xC002; } else break; } …

最適化12

以前書いた、以下のようなパターンですが、 public class Test { public static void main(String[] args) { int a = 0; a += 10; a += 20; System.out.println(a); } } これをコンパイルして、逆アセンブルします。ちなみに上のはjavaです。 C:\>javap -c T…

フラグ操作最適化とか

前に書いた通り、Cフラグだけintで、そのほかのフラグはboolで実装してみました。 速度はまだ測定してないのですが、バイナリのサイズはかなり小さくなりました。マリオブラザーズを変換した場合に80キロバイトぐらいです。これは、.NETでの場合ですので、Ja…

最適化11

フラグレジスタの使われ方を分類してみます。 まずは、フラグを読む場合です。分岐の条件になる NVZC演算命令の入力値になる C割り込みの条件 IBCフラグだけは、演算の入力値になりえるんですよね。こんな感じなので、Cフラグだけintで実装して、そのほかの…

最適化10

超絶地味な最適化を思いついたのでメモしておきます。フラグレジスタをintにするかboolにするかはとても微妙な問題なんです。フラグレジスタをintにすると、ADC命令のAレジスタの計算は、 a = a + m + (p & 1); こんな感じです。同様に、フラグレジスタをboo…

予定

今まで最適化について検討と検証をいろいろやってみました。ソースコードは検証目的で書いてたのであんまりすっきりした書き方にはなってないです。しかし、最適化を行う上でのプログラム構造の問題も見えてきました。この辺で、いったんソースをきれいに書…

最適化9

できればgotoは使いたくなかったんですけど、10倍高速にするためなら、もはや何でもやってみないと厳しい状況ですので、gotoが使える場面では使っていこうと思います。C#にはgotoあるんですがJavaには無いので、携帯Javaに後で持って行くことを考えると使い…

最適化8

ファミコンのゲームでは全体的な処理のタイミングをvblankで取ってると思います。 今のパソコンのソフトの様に、CPU資源を複数のソフトで分けながら処理したりする必要がないため、vblank待ちはポーリングしてるはずです。つまり、vblankのフラグが立つまで…

最適化7

6502の各レジスタをプログラムで表現するために、何の型を使うか?ということについては、最初かなり迷ったのですが、とりあえずは全てのレジスタをint型にすることにしたのでした。6502のAレジスタは8ビット幅ですので、同じく8ビット幅であるbyte型を使え…