グレイゾーン

近頃は、エミュレータソースコード等を公開するための準備を行っています。
著作権など、いろいろとグレイゾーンにあるものなので取り扱いが難しいです。
一歩間違うと、ぎりぎりグレイゾーンに入ってたのが、ブラックな方に入っちゃいそうですよね。

一応、自分以外の人でも簡単に使えるようにGUIを作ってます。
GUIから、以下のような操作を行うことで、NESのROMを、iアプリに変換することができます。

    1. トランスレータのプログラムを起動
    2. パスなどの初期設定を行う
    3. NESROMイメージを開く
    4. 出力するパスを指定する
    5. iアプリ名を指定する
    6. 変換ボタンを押す

この後の内部処理では、いちおうほとんど完全自動でiアプリに変換する処理が流れるようにしました(今までは手作業でいろいろやる必要がありました)。内部処理は以下のような流れです。

    1. 指定されたNESROMのエミュレーションを180フレームの間だけ、内部的に行い、その時点でのスクリーンショットを保存する
    2. 取得したスクリーンショットiアプリのアイコンサイズに縮小して、リソースフォルダに保存する
    3. NESROMの6502バイナリからJavaソースコードへ変換する
    4. javac.exeを起動して、コンパイルを行う
    5. 出力されたclassファイルに対して、直接的にgotoする書き換えの最適化処理を行う
    6. priverify.exeを起動して、classファイルの事前検証を行う
    7. jar.exeを起動して、classファイルとリソースファイルをjarアーカイブにまとめる
    8. jamファイルを生成する
    9. jarファイルとjamファイルを、出力先フォルダにコピーする

このような処理が内部的に行われますが、外部のプログラム(javac.exe, preverify.exe, jar.exe)を呼び出している関係で、Java2 SDKとDoJa SDKが必要になります。

こういう外部プログラムに依存するのは、ちょっとアレな気もするんですよね。

javac.exeを私のプログラムと一緒にして、再配布できないかとか調べてみたのですが、再配布することは一応可能なようです。
ただし、JREと一緒にjavac.exeを配布することが必要らしいです。あとは、ライセンス条件を明記したりする必要があったり、なんかめんどくさそうな感じではあります。
JREも一緒にしてしまうと、結構ファイルサイズがでかくなりますね。まあ、今の時代なら大して問題にならないサイズではありますが。

IBMオープンソースJavaコンパイラであるjikesは、コンパイラ単体で再配布しても問題なさそうです。こっちのほうがコンパクトで再配布するならよさそうな感じです。

問題となるのが、DoJa SDKです。
これは再配布しちゃだめっぽいですね。
DoJa SDKに含まれるファイルのうち、必要となるのがAPIライブラリ(classes.zipとdoja_classes.zip)と、preverify.exeです。

classes.zipとdoja_classes.zipが無いとコンパイルができないんです。
でも、これってコンパイルが通らないっていうだけで、APIの実装は特に必要ないはずなんですよね。
要するに、APIのメソッドのインタフェースだけあわせた、空っぽの実装を作ってそれでコンパイルしてもいいはずです。
なぜなら、iアプリにするjarには、APIのライブラリは含まれないからです。

空っぽの実装を適当に作って、それでコンパイルを通すのはありかもしれません。
javaの逆コンパイラjadを使って、classes.zipに含まれるclassをリバースして、そこからモックアップ(空の実装)を作ると簡単にできそうな気がします。
全部のAPIをやると大変ですが、私が作ったエミュレータで使っているAPIの分だけ作ればいいのですから。

あと、コンパイル時には、J2SDKのrt.jarが必要になります。
これには、javaの基本的なクラスの実装が含まれてます。
これを空の実装に置き換えてコンパイルするのってできるのでしょうか?
この辺の仕組みが良くわかりません。
うーん。