2009.07.13版 ・ディスク読み込み部にオーバーランのバグがあったのを修正。 ・曲選択時に一旦音を消すようにしました。 ・三角波チャンネルのリニアカウンタの挙動を修正しました。 ・DPCMのコードを書きました。試行錯誤してみたのですが、まともに音が出ないのと現実的な速度では動かないので未実装のままです。 88の割り込みの挙動がよくわかりません。 ・VRC6仮実装。デューティー比固定です。ノコギリ波形chの仕様がよくわかりません。また、M88だと何故か動きません。 デバッグの困難さに負けてリリース。 2009.10.24版 ・掲示板でkashiwaさんに音色をいただいたので、音色埋め込み & duty比実装。thanks! 2009.11.01版 ・さらに修正。高速化とTLの扱いを変えてみた。 2010.05.12版 ・カーソル点滅停止、ファンクションキーを非表示にした ・4byte転送を使ってディスク読み込みを高速化 ・カーソルキーの上下で演奏開始・停止できるようにした アドバイス頂いた UME-3さん、コードを提供してくださった Fu-.さんに感謝します。 2010.05.31版 ・バンク未使用のnsfの読み込み処理がバンク使用のものと(事実上)同じになっていたバグを修正。 今までハングアップして聴けなかったnsfも聴けるようになった(はず)。 ・nsfサイズ情報をヘッダの使っていない部分に埋め込み。 nsf本体もロードアドレスに揃えて空値を挿入するようにした。 読み込み処理自体を書き直してロード高速化。 ・CPU初期化時にNESのRAMをクリアするようにした。nsf演奏の正式な手順。 ・曲を切り替えて演奏を開始した時にデューティ比が初期化されないバグを修正。 ・曲切り替え時に$5FF8-$5FFFのバンク情報を初期値に書き戻すようにした。 ・APU処理アドレス引きを気持ち程度高速化。 ・SSGで出力しているノイズの音量を適正レベルにした。2ch合計の結果を半分にするのを忘れていた。 ・エンベロープ設定($4000,$4004,$400C)を初期化せずに発音を開始するnsfでハングする不具合を修正。 ・VRC6を改良。再現性が大幅に改善。専用周波数テーブルをVRAMに置いた。とてつもなく重い。 ・バンクを使わないnsf向けにメモリインターフェースを簡略化した NSF88_H.D88 を付属。 実機動作に耐えられる速度が期待できる。DPCM使用のものはやや重い。 イメージ作成はmakensf88.exeによる自動判別。 2010.06.01版 ・$4080などサポート外のレジスタに書き込もうとして止まるnsfがあったので対策した。 ・6502の未公開命令を使っているnsfがある模様。現状では問答無用で停止。 2013.03.12版 ・ソースコードを整理。前回入れ忘れていたvrc6.binも同梱。 ・nes6502emuの高速化。フラグ回りなど全命令で数%程度速くなった。 ・nes6502emuのバグ修正。ADC/SBC命令でVフラグが変化していなかった他、ROL A/ROR A命令でZ,Nフラグが異常だった。 ・6502未公開命令を実装。資料によってまちまちな部分もあるので、十分なテストはできていない。
高速化 |
バンク切り替え有り版はとバンク切り替え無し版で専用版を作ればもっと速くなるはず。 NES/NSFの構造に絞った高速化はまだまだ可能だと思います。 JR命令をJP命令に書き換えた方が良いかもしれません(GBはJRの方が速い)。 |
バグ | 何回も見直しはしましたが、GB版から書き直した部分もあって、いまだに不安が残ります。 |
移植性 | メモリーインターフェースがキモなので、多少弄ればGB版と同じくエミュレータ本体はROMに突っ込んでも動くはず。 |
拡張性 | NESのROM領域への書き込みを STA STX STY 命令についてトラップするようにしました。 とりあえず VRC6 用です。他の拡張音源にもチャンネル数が足りていれば、対応できると思います。 |
精度 |
音源レジスタアクセスはCPUのアクセスに同期。フレームシーケンサは60Hzです。 割り込みを使って240Hzで動かせば再現性も増すはずですが、それに見合う効果があるかどうかは疑問。 |
割り当て | 矩形波1,2=FM音源のch1,ch2 三角波=FM音源のch3 ノイズ=SSGのch4,5 DPCM=未実装 FM音源・SSG共に音量がリニアではないので、テーブルを挟んで16段階に近似。 SSGは2音より3音の方が精度も高まるのですが、コストもかかるので簡略化。 DPCMは実装する気満々だったのですが、未実装状態でこの重さでは保留せざるを得ない…。 |
デューティ比 | 矩形波はデューティー比50%のPSGっぽい音で、三角波はサイン波っぽい音で固定です。 うまい音色が固まっていないから、というのが理由。 (できれば)直列2オペで良い音色があったら教えてください。 (2オペなのはレジスタ設定の簡略化のため) FM音源で変位の極端な矩形波を作って、最大変位(TL)を時間軸に沿って弄ることで 波形メモリ音源っぽいものが実現できるのでは無いか、と思ったのですが、 さすがに6502をエミュレートしながらでは無理でしょう。 …S44PLAY を見て妄想しただけですが。 |
エンベロープ | ハードウェアエンベロープが無いので、ソフトで実現。 240Hzの所を60Hzで動かしているため、精度は1/4程度。エンベロープループ含め、それなり?には聞こえるかと。 FM音源の矩形波1,2は SSG-TypeEG が使えそうな気もしますが、音程と共にスピードが変わってしまいそうなので却下。 SSGのノイズ音源はSSG内蔵のハードウェアエンベロープを流用することも考えたのですが、 ノイズを別の音源に置き換えることも考えて、当面このままにしておきます。 エンベロープパターン0と8がそのまま使えて、非常に好都合なのですが…。 |
長さレジスタ | これはGB版とほぼ同じです。60Hz精度で問題無いと思います。 大丈夫、だと思います。 |
ノイズ | NESが5bitで、都合の良いことにSSGも5bitなので、そのまま突っ込んでいます。 再現性という点では、もちろんそのままで良いわけが無いのですが、ノイズの近似をどうやれば良いのか わからないので、当面このまま。 |
スイープ | GBとほぼ同じです。矩形波1,2での違いは未実装。 |
周波数 | NESが11bitで、FM音源が14bit,SSGが12bitなので、さすがにPC側が有利です。 全11bitに対して近似した値をテーブルに持っています。 発音域(出力する値が 8 以下になると無音になる)は未実装です。 |
DPCM | 実装済みですが、使わないようにしてあります。 1サンプル取得毎にROMアドレス変換が必要になるなど、現実的な速度では動きません。 |
IRQ | 未実装です。処理自体はCPUエミュレータに書いてあります。 NESはCPU1命令毎にIRQをチェックするらしいので、 実装するとなると、速度にかなりの影響が出るでしょう。 |
速度 | GB版から書き直した部分を含めてかなりカオスなことになっているので、整理する必要があります。 FM音源のアクセスウェイトの待ちループの代わりに別の処理を挟む等、工夫をする余地は大いにあります。 テーブルも使用可能なメモリ範囲を確定させれば、もう少しアクセスが楽になるかも。 |
OPN | OPNA | |
4MHz | 17クロック | 9クロック |
8MHz | 34クロック | 17クロック |