ファミコンエミュレータ for Java

http://d.hatena.ne.jp/tanakh/20050506#p2

のあたりで開発したファミコンエミュレータJavaに移植しました。

ここで公開中
http://github.com/tanakh/bjne-java

jarもあります。
http://github.com/tanakh/bjne-java/downloads

オリジナルのC++版。
http://github.com/tanakh/bjne

セーブ機能意外はすべて移植しました。
マッパは#0〜4と、VRC6を実装しました。VRC6は趣味です。
割と動いてるんじゃないかなあと思います。

なぜJava?

Androidで動かすためです。今のところは普通のAWTアプリです。

Javaで辛かったこと

  • 符号なし整数型がない。

メモリは基本的にbyteの配列で持つことになりますが、そこから取り出すときに気をつけないと負の数になってしまったり、レジスタをbyteなどで持ちますがこれも気をつけないと負の数になったり、アドレスが16ビットだけど、これも気をつけなければ負の数になったりとか、とかく短い長さの符号なし整数を多用するエミュレータではしんどいです。気を付ける箇所が無数にあるのに、コンパイラは何も言ってくれないので、とても怖いです。

CPUのエミュレーション部分など、似たような箇所が多いので、C++版ではマクロでまとめていたところがあまりうまく書けなかった。

  • プリミティブ型の参照がない

書き換える変数をパラメータ化できない。load(regHoge, addr)とかみたいなのができないので、loadHoge(addr)とかをレジスタごとに作ったり…。

どうしたものか。

Javaで良かったこと

C++でもVCを使えばいいという話ですが。LinuxでVCが使いたい…。

メモリアクセスのバグがすぐ見つかるので、かなり楽。安心感もあって良いです。必ずスタックトレースが出るし、Eclipseだとクリック一発でコードの当該箇所に飛べるので便利。

  • GUI作りやすい

思ったよりはるかに楽だった。クロージャがあればもっと楽なのに。

手動でミキサー書くのがびっくりするほど楽でびっくりした。