![見出し画像](https://assets.st-note.com/production/uploads/images/125593949/rectangle_large_type_2_c84616ab1c814cd193059bba5e30438c.png?width=1200)
FCS80→VGS0
RaspberryPi Zero (ベアメタル環境)で動作する自作ゲーム機の開発状況です。
前回までのあらすじ
ベアメタル環境で開発するのに際して、ユーザープログラムのライセンス上の課題(GPL汚染)を回避するため、FCS80という過去に開発した架空のゲーム機エミュレータを用いて開発を進めることにしました。
FCS80は通常、Z80アセンブリ言語でゲームを開発しますが、より効率的にゲーム開発できるようにするため、C言語対応を進めていました。
新たなる課題(性能)
アセンブリ言語(Z80)で記述されたFCS80のexamplesを只管C言語にポーティングしていたのですが、256個のスプライトを表示して動かすヒートラン的なexampleをポーティングして動かしてみたところ、かなり処理落ちしてしまいました。
![](https://assets.st-note.com/img/1703508184799-YNV5DOUtKC.png?width=1200)
そこで、スプライトの数を64個に減らしてみたところ、C言語でも60fpsで問題なく動作するようになりました。
![](https://assets.st-note.com/img/1703508331186-J44TehHpjS.png)
これはある程度想定済みの事象※でしたが、やはりSDCCの最適化があまりイケていないようなので、性能が求められる処理ではアセンブリ言語で記述する必要がありそうです。
Z80を利用する必要がある実用的なシーンで求められることは恐らく、「如何に速く動かすか」ではなく「いかに正確な時間で動かすか」(リアルタイム性)に限られると思われ、速度追求したければARMやIntel等の現代のRISC CPUを使うべきだと考えられるので、Z80クロスコンパイラの最適化は変態的なレベルでは頑張っていないだろう…という想定です。
この点は仕方ないのですが、以下のような対処が必要だと考えています。
なるべくZ80側ではゲーム本質部分の処理実装に集中できる形にして、CPUリソースの切迫を緩和
Z80のクロックアップ(RaspberryPi Zeroで限界の速度までクロックアップすることでCPUリソースを増やす)
もうひとつの課題(音楽)
FCS80には、AY-3-8910(PSG音源)とSound Creative Chip(SCC音源)という2つの音源を搭載していますが、これらの音源チップで使える軽くてライセンス的に問題なさそうなOSSを探したところ、私にとって都合が良いものが見つかりませんでした。
そうなると、音源ドライバを新規で(Z80で)作る必要があります。
Z80でSCC+PSGの音源ドライバを開発するのはそんなに難しくないのですが、悩ましいのがその音源ドライバに喰わせるシーケンスデータを生成するツール(MMLコンパイラ)を開発することです。
MMLコンパイラはVGS用に開発した経験がありますが、ものすごく大変だったと記憶しています。
できればもう二度とMMLコンパイラの開発はしたくないです😅
そこで、VGSのシーケンスデータをそのままFCS80で再生できるようにすれば良いのではないかと考えました。
それならば、MMLコンパイラはVGSのものがそのまま使えるので、新規開発をする必要がなくなります。
また、VGSの音源ドライバ実装は、Z80側ではなくエミュレータ側に持たせることも出来るので、ゲーム側のCPU(Z80)リソース切迫を緩和でき一挙両得です。
FCS80 → VGS0
FCS80にVGSの音楽を再生する機能を実装してみたのですが、あまりにも変更が多すぎて混乱してきたというか、SCC+PSG(MSXのKONAMIスタイル)でゲーム開発ができるシンプルなゲーム機としてFCS80はそのまま残しておきたくなったので、FCS80にVGSを対応させる実装のPull Requestは一旦リジェクトしました。
そして、FCS80をコードベースにしたものを別リポジトリ(vgszero)で新規開発することにしました。(これで好き放題に創れます)
CPUとVDPはFCS80を(ほぼ)そのまま利用しつつ、PSGとSCCは取っ払い、VGSによる音楽再生とPCMによる効果音再生に対応する形で現在開発中です。
つまり、ゲームコア=FCS80、サウンドコア=VGSというキメラ・ゲーム機ですね。
まだ、完成していませんが先に起動時のラズパイ用のローディング画面をデザインしてみました。
![](https://assets.st-note.com/img/1703546728845-5tfeNXDaeg.png?width=1200)
VGS-Zeroは、ラズパイの電源を入れるとレインボースクリーン(VC4のブート処理)の後、ゲームデータ(game.rom)、音楽データ(bgm.dat)、効果音データ(se.dat)をSDカードから読み込んでRAM上に展開後、Z80エミュレータが動き始める仕様になっています。
ゲームのデータサイズによっては読み込みに結構(3〜4秒程度)時間が掛かる可能性があるので、その間に上図が表示されます。
「ゲームの読み込み画面」というと個人的にPCエンジンCD-ROM2のイメージが強いので、何となく色合いをそれっぽくしてみました。
ちなみに、上図は良い感じのインタレースが入ってますが、これは宣材用の加工で、実機では解像度が低い(240x192)ため、普通にプログレッシブ表示(下図)になります。
![](https://assets.st-note.com/img/1703547140876-6BOgj7zAtj.png)
個人的には、プログレッシブ表示よりインタレース表示の方が味があって好きです。
なので、ラズパイZeroではなくプレイステーション5やパソコン用などであれば、スペックにかなり余裕があるのでブラウン管っぽいインタレース表示に全力を注ぎたいところですが、ラズパイZeroにはそれだけのスペック的な余裕がありません。
肝心な本編の開発進捗としては、とりあえずBGMの再生は問題なくできたので、後は効果音再生機能を作ろうとしているところです。
![](https://assets.st-note.com/img/1703547583878-gt59WRUrAj.png)
効果音再生はvgssdk-picoで実装済みのものを移植するだけなので、すぐに完成しそうです。
今年(2023年)中の完成は無いと思って©を2024にしてしまいましたが、今年中の完成もワンチャンあるかも…と思いつつ、今回は焦らずジックリ作り込みつつドキュメントやexampleもシッカリ整備したいので、2024年のリリースを目指します。