ファミコンエミュレータ 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で辛かったこと
- 符号なし整数型がない。
メモリは基本的にbyteの配列で持つことになりますが、そこから取り出すときに気をつけないと負の数になってしまったり、レジスタをbyteなどで持ちますがこれも気をつけないと負の数になったり、アドレスが16ビットだけど、これも気をつけなければ負の数になったりとか、とかく短い長さの符号なし整数を多用するエミュレータではしんどいです。気を付ける箇所が無数にあるのに、コンパイラは何も言ってくれないので、とても怖いです。
- プリプロセッサがない
CPUのエミュレーション部分など、似たような箇所が多いので、C++版ではマクロでまとめていたところがあまりうまく書けなかった。
- プリミティブ型の参照がない
書き換える変数をパラメータ化できない。load(regHoge, addr)とかみたいなのができないので、loadHoge(addr)とかをレジスタごとに作ったり…。
どうしたものか。