NesterJ for PSPの驚愕の製作理由からソース公開までの隠された道のり 通称駄文。

仕事の休憩中にささっと思い出しながら書いたので変なとこあるかも。

5月23日 ふとソロモンの鍵をPSPでプレイしたくなりトライしてみるが動かず。
・・・じゃあ自分で動くの作るか!って事でNESエミュ捜索。条件としては
・ある程度ROMが動くらしい物。
・ソロモンの鍵が動く
・スペランカーとアトランチスの謎も動く
上記3つの条件を加味して調査。Nester系が良いとの情報を小耳に挟んでいたのでNesterかNesterJかuoNesterかNNNesterJに絞られる。NNNesterJをみると「NesterとNesterJとuoNesterを融合させさらに改良云々」のような文章をみたのでNNNesterJに決定。
ソースを2時間くらいさらっと見つつ手を入れる順序を決める。作業は大きいのだけ上げるとAPU,PPU,Mapper,CPU,NES_ROM,NESの順だったかな。
5月24日 怒涛のMapperのCコード変換地獄。単純作業で辛い辛い。飽きたらSNESのコードを弄ってた(SNESのエミュの存在がどうなるのか不明になってた時期だったのでこっそり作ってた。)動かしたいソフトはPDROMの回転するやつ(回転処理見るのが好きなんですw)
5月25日 Mapper変換地獄から脱出。勢いづいてCPU,NES_ROMも作業する。SNESのCコードは一足お先に完成。しかしLink通らず、NESの勢いがあってそのまま放置。
5月26日 一通りのEmuコードがCに変換完了。機種依存部(Win,PSP)とEmuコード(C)の架け橋コード作成。
5月27日 PSPで使えなさそうなコードを置き換え。
5月28日 実機初テスト、RINのメニュー周りのコードを頂いてファイル選択->実行のみ作成。初テストは失敗に終わる。原因不明のハングアップ。
5月29日 調整をし今度はPSPEにてテスト。落ちることなく見事にウィンドウ内に「アトランチスの謎」が映る(ただしパレットめちゃくちゃ)。実機で動かずPSPEで問題なしの原因調査・・・数時間後バウンダリ違反でハングアップしていることが判明。オチにゲンナリしつつ対応コードを書き、実機にて動かすと…動いた!
5月30日 ファーストリリースに向けた準備。当初はキー入力も出来ないバージョンの予定だったけどそれじゃ余りにもヒドイと思い直してキー入力対応。
そしてリリース(0.01)
5月31日

ディスクシステム周りの実装。実はNNNesterJでディスクシステムが動くことは知らなかった。(Uploaderのコメントで初めて知ったw、Mapper20のコードにDiskSystem周りのコードがあるがMapper変換は半分意識飛んでたので覚えてなかったorz)とりあえずの実装は完了したが動作確認できず。
バウンダリ違反回避コード見直しで速度改良。
音周りのPSPとの接続。サクッと繋げて鳴らすが、タイミングの取り方に失敗しているようで再生がオカシイ。時間がなくなったのでとりあえず リリース(0.50)。

この時点であと2〜3日で終わる(1.00達成)予定だった…

6月 1日 各所にて上がっていたバグ報告を集め対応。実際コード修正より情報集めるほうが数倍時間掛かった。
暫定コード1/3フレームのみ描画から、自動速度調整コードに切り替え情報量により速くなったり遅くなったりしないように改良。
音は単に凡ミスがあったためかな、1〜2分で直ったような・・・
Unzipに対応してみたり(実際はRINの時に書いたコードが既にあるので対応は5分もかからず)。
そしてリリース(0.70)
SNESはソースが公開されるようなのでNesterJに集中するため作成してたSNESコードを破棄。
6月 3日 思っていたよりバグ報告が上がったのでその対応。NNNesterJからの問題なのか切り分けが必要になったため、報告用テンプレ決める。
ROMによって速くなるという情報の調査をしたらfloatの置き換えのミス発見。修正(多分直る)
外部データベースファイルの存在を知る(ォィ)。コードは排除済みだったがサルベージして実装。
そしてリリース(0.71)
ついでにその後Unzipがbetaのまま放置状態だったので4M制限をなくしてリリース。
6月 4日 バグ修正(主にMapper周り)。さすがに単調作業のMapperはバグが多い。たしか書き換えてるとき半分寝てたような・・・
SRAMのセーブ/ロードに対応。使う側と作成側の差なのか、もっと後まわしにしようとしていたが希望者が多数だったので優先して実装。
各種細かい設定をMENUに導入。
そしてリリース(0.80)
6月 5日 PPUコードに光線銃用の画面バッファがあり、2画面分renderしている事が判明したので光線銃用コードをカット。その他細かい問題修正
そしてリリース(0.81)
リリースのあとにディスクシステム入れ替えを思い出し実装。その他報告を貰った不具合対応。デバッグ表示が邪魔と言われ画面端に移動。
デバッグの為のリリースなのに邪魔って・・・。
そしてリリース(0.82)
6月 6日 不具合対応。ディスクシステムの認識確認機能追加など
そしてリリース(0.83)
6月 8日 不具合対応。パンチアウト(Mapper9)の動作が重くなる問題は描画しないフレームでも内部的に描画するように作成されていたから。とりあえずコメントアウトして様子見る(結果問題なさそう。)
FPSを表示するようにした。やる気アップ(プログラマの性ですなw)
そしてリリース(0.84)
6月10日 どこでもセーブ/ロード周り実装。SRAMセーブもだけど、ファイルI/O周りが一番神経使う。不具合がある=生成されたデータが異常となりそれ以降使えないセーブデータになってしまうため。エンディアンに注意をして実装完了。
セーブデータのサムネイル表示実装。サムネイル表示は忘れやすい自分のための機能。(思ったより好評なので良かった。)
画面サイズ変更の機構を実装。とりあえず雑な画面モード付ける。
サウンド周波数変更を実装。単にサウンドを軽くしてFPSを上げたいから実装したらしいゾ。
キー未実装部実装ついでにPlayer2のマイクボタン実装。マイクってたけしの挑戦状とバンゲリングベイくらいしか思いつかない・・・
連射処理が余にもアレなのでちゃんとフレーム単位で処理するように変更。
そしてリリース(0.95)
6月11日 不具合対応。そしてリリース(0.96)
6月12日 不具合対応。エミュレーション精度を128倍上昇させた。単に8ビットシフトした固定小数点を15ビットシフトしただけ。でも効果抜群のようで初期リリースから不具合リストに鎮座していたドラえもんの改善報告を貰う。棚ボタ的な改善により満足の行く出来になる。
デバッグ版最終リリース(0.97)
リリースに向けた調整。ソースの整理、画面設定をFULLとNORMALの2つを付ける。デバッグ表示コードの排除。FPS表示有無のMENU実装。
そしてリリース(1.00)。
リリース後メニュー周りの修正が残っていたためソースはその修正の終わったあと公開
6月13日 動作クロック設定方法判明したので222から333まで任意で設定できる機能を実装。メニューの改善、ソース整理
そしてリリース(1.01)
ソースコードも無事公開。目標達成!

 

思ったこと、感じたこと、その他
・思ったよりバグ発生の見積もりが甘かった。
・NNNesterJの機能自体あまり把握していないのもあり、予定作業が30%くらい増えた。
・予定よりも5日くらいオーバーした1.00リリースになった。
・想像していたよりも不具合報告を多く頂いたのが助かった。
・途中からバグ報告テンプレと報告場所を作ったのも良かった。
・ソース公開のタイミングをミスった気がする。0.7くらいでソースも公開すれば速度改善と機能向上が平行して行われて1.00リリースがもっと早くなったかも。

・「神」とか言われて複雑な気分に(Uploaderのデフォルト名から来てるんだけど…)。移植作業自体はたいした事ありません。凄いのは元のコードです。コードを見れば分かりますが、凄い細かい部分まで作りこんで(エミュレートして)います。例えば、実機で処理落ちするところまで完全再現してるとか。その凄いコードを移植するので酷評されないように努力をしたつもり。Nester作者へのリスペクトですなw

・昔のバージョンから最新のまで順番にいれて動作させると進化を感じることが出来て楽しいですなw

・次回何か作成する際は最初のリリースからソース公開で行ってみたい。