SN76489をDAC代わりに使用できるように修正しました。
以前は、VBlank時にSN76489の更新していたため遅延は0-16.7msecでしたが、必ず10msecの遅延にすることで音声が出るようになりました(しんちゃんが喋るようになります)。
実機に比べてsm3ggの遅延ですが、画像は1フレーム(約16.7ms)、パッドは遅延なし(元々通信に時間の掛かるパッドは除く)、サウンドは10msecとかなり実機に近いと思います。
ただ、VSyncのタイミングが少し異なるため、100%同じタイミングにはなりません。
また、Raspberry Pi Picoをオーバークロックしたことにより、Wii クラシックコントローラが正常に動作しなくなっています(クロックを元に戻すと動作)。
タイミングのシビアなニンテンドークラシックミニ スーパーファミコンコントローラは問題なく動作しているので、なぜ動作しないのか不明???
後で波形などを確認します。
Raspberry Pi Picoで動作する、SEGA MARKIII・GAME GEARのエミュレータを作成しました。
手持ちのGAME GEARのソフトを動作させるために作成したのですが、GAME GEARはSEGA MARKIIIとほぼ同じなのでついでに対応しました(ただし、TMS9918は未対応)。
Z80とVDPにlibvdmgrを使用できれば良いのですが、libvdmgrはCPU、RAMを非常に消費するため、メモリ削減したものを作成して動作させました。
ただ、それでも125MhzのRaspberry Pi Picoで動作させるのは厳しく、30fpsに落とす必要があるかと色々調べていると、以下にRaspberry Pi Picoをクロックアップ可能なことを書いている方がいました。
PicoのVGA出力で動かすブロック崩し・疑似3Dカーレース風デモ
大変貴重な情報を公開していただき有難うございます。
クロックアップすることで、どの程度Raspberry Pi Picoに負荷がかかるのか分かりませんが、とりあえず200MHz(175MHzでも良かったのですが余裕を見て)で動作させてもICが熱を持つこともなく安定動作しています。
これだけ高速になるとVGA表示に、スプライト数を128個(1行に32個表示)や、スプライトの回転・拡大・縮小追加、タイル面を2画面など追加できそうです。
今回作成したsm3ggは、遅延が最大1フレームとほぼ実機と同じ速度で動作します。
PCや何とかミニなどリアルタイム性のないOSを使用したエミュレータで遊ぶと動作に違和感を感じていたのですが、その違和感sm3ggではないです。
とりあえず簡易的なメニューを用意し、以下の機能を作成しました。
今回ROMイメージの追加方法をどのようにするか考えたのですが(マスストレージ経由、HIDデバイスによる別アプリ経由、SDカードから書き込みなど)、フラッシュメモリの書き込みにはブロックサイズなどを意識する必要があり、自由に書き込みができないため、ソースコードに含めることにしました。
ソースファイルの生成は、テキストファイルを作成(サンプルはtool/rominfo.txt参照)し、sm3ggのtool/rominfo.vbsへドラッグアンドドロップすることで、自動生成します。
生成されたrominfo.c/hをsm3ggのソースファイルへコピーした後、ビルドすることでuf2ファイルが生成されます。
Downloadから、libvgaとsm3ggのソースコードをダウンロードし、適当なディレクトリへ展開する。
展開したlibvga/vga/vga.pioファイルを開き、8行目にある".define sysclk 125"を".define sysclk 200"へ書き換えます(pioasmで外部から値を変更する方法が分からなかったため手動)。
「ROMイメージについて」の手順からrominfo.c/hを作成し、コピー後ビルドする。
ポーリングしてSN76489をDAC代わりに使用することはできない(音声は出せない)。
TMS9918未対応。
FM音源未対応。
※FM音源以外は対応予定