オレ仕様のゲーム機を作ろう(その9)
前回の更新が,3月末ですか…。間隔開きすぎですね(笑)。
途中,新型コロナウイルスとか,勤務形態の変化とかいろいろあってほとんど手付かず状態でした。スミマセン…。
さて,前回は YMZ294 という音源チップでサウンド回路を作成し,音楽を再生できるようになりました。
オレ仕様のゲーム機を作ろう(その8)
今回は,予定していたスプライト表示回路を作成し,多数のキャラクターを表示できるようにしたいと思います。
これで,動きのあるゲームも作成することができ,当初予定していた機能がすべて実装できることになります。
主な機能
以下,今回実装するスプライト機能になります。
- 一つのスプライトの大きさは 16×16ドットで,16 色中 1 色を指定できる
- 一画面に表示できる枚数は,128 枚までで,水平ラインに 16 枚まで表示可能
- スプライトに定義できるパターン数は,256 種類
まずは,FPGA でテスト
スプライト表示回路は,回路規模も今までと比較すると大きく,まず一発で動作はしないと思います。
…と言うことで,まずは,設計自体が問題ないことを確認してから,ロジック IC を使った設計をした方が手戻りが少ないような気がするので,FPGA 上で動くものを VHDL で作ることにしました。
既にロジックは頭の中でおおよそ構築できているので,VHDL は一日で作成することができ,動作も想定通りの動きをさせることができました。
この辺りは,さすがハードウェア記述言語のメリットだなぁ…と思います。
想定通りの動きをするものができたので,これでいいじゃん…と言いたいところですが,やりたいことはこういうことではありません…(笑)。
スプライトを 128 枚表示して,同時に PSG で音楽を再生しています。
スプライトパターンを定義できるようにする
80 年代中盤までの Z80 を使ったアーケード基板は,そのゲーム専用基板ですので,ほとんどがプログラムやグラフィックデータを ROM に入れています。決まったデータしか扱わないので,当然ですよね。
ROM はその文字通り,読み出し専用ですので,スプライトを表示する際も読み出す回路のみで済むのですが,今回は,自分の好きなパターンデータをソフトウェアから定義できるようにしたいので,書き込みも可能にします。
キャラジェネ ROM をプログラマブルにするので,プログラマブルキャラクタジェネレータ,いわゆる PCG というやつですね。
そうなると,メモリは RAM を使い,そのアドレスバスとデータバスは,表示側と CPU 側とで排他制御しなくてはなりません。
前々回の BG 基板もそうですが,この切り替え回路のための IC が必要になり,思ったよりも面積が大きくなってしまいました。
ピクセルデータの出力
このスプライト機能は,少ない情報(4 バイト)を書き込むだけで表示することができますが,この情報を設定するメモリが必要です。
今回は,128 枚のスプライトを表示することにしていたので,この設定メモリは,4×128 で 512 バイトです。
4 バイトの内訳は,パターン番号,パレット番号とフリップ情報,Y 座標,X 座標です。
以前も説明したことがありますが,H ブランク期間(水平帰線期間)に,このメモリのうち,Y 座標を順番にチェックしていき,現在の走査線で表示されるべきスプライト番号を 16 個まで覚えておきます。
H ブランク期間終了後,表示期間になったら,その覚えた番号を元にパターン番号,パレット番号とフリップ情報を取り出し,パターンが定義されている RAM のアドレスを決定し,横一列分のピクセルデータを取り出します。
またその際に,フリップ情報から,上限反転,左右反転できるように,取り出すアドレスと,横一列のピクセルデータをシフトする方向を決めてやります。
ここまでの機能をロジック IC とメモリで実装しましたが,基板いっぱいになってしまいました。
コネクタのピンも足りなくなってしまったので,左下に追加しました。
ここまでの機能を実装した基板です。
ラインバッファへのレンダリング
表示期間中(H ブランクではない期間)は,上記のように 1 ライン分のスプライトピクセル情報が出力されてきます。
この 1 ラインに 1 個のスプライトが入っていれば,1 個分,最大の 16 個のスプライトが入っていれば,16 個分のピクセルデータが出力されてくるわけです。
そのピクセルデータを取得する直前に,スプライト設定メモリから X 座標を取得してカウンタにロードします。これがラインバッファ書き込みアドレスになります。
あとは,送られてくるピクセルデータをラインバッファメモリに書き込み,アドレスとなるカウンタをインクリメントすることを 16 ドット分繰り返すと,1 個分のスプライトをラインバッファに書き込むことができます。
これをライン上のスプライト個数分繰り返し,1 ライン分のスプライトのレンダリングが完了したら次のラインでこれを BG のピクセルと重ね合わせて最終ピクセルデータを決定します。
パレット機能
あとは,アナログ RGB 信号として,モニターに出力してやればよいのですが,当初は,デジタル固定 8 色にする予定でした。R,G,B それぞれ ON か OFFの情報ですね。
2 枚目の基板に空き面積があるし,せっかくなので,パレット機能を実装してみることにしました。
パレット機能と言っても,そんなに大げさな機能ではなく,最終ピクセルデータが 16色の 4 ビットのデータなので,それに対応する R,G,B のデータをメモリから引いてくればよいわけです。
このパレットデータを入れておくメモリも,CPU から自由に書き込みできるようにしたいので,バスの排他制御が必要なのですが,容量も小さいので,垂直帰線期間のみ CPU からアクセスできるようにしました。(垂直帰線期間は画面表示回路のアクセスが無いので排他制御が単純になります)
次の写真が,ラインバッファとパレット機能を実装した基板です。
動作確認をするも…
予定していた機能をすべて実装しましたので,それぞれの基板を接続して,動作確認してみました。
スプライトの機能は,2 つの基板に分かれてしまいましたので,1 枚目の基板の動作は,ある程度出力波形をチェックしていましたが,案の定と言うか,うまく動いてくれません(笑)。
予め FPGA で同等回路を作ってはいたので,同様にロジック IC で組み立てれば動きそうな感じもするのですが,VHDL で ロジック IC 一つ一つの動作を書いているわけではなく,あくまでも全体の動作ロジックを VHDL で書いているわけで,動作結果は同じでも実装内容は結構異なっているんですね。
まぁ,動作しないのはいつものことで,ロジックアナライザで,原因となる部分を調べていくと,結構単純なミスが見つかり,修正するわけですが,VHDL コードと違い,追加修正となると,ロジック IC の実装する面積が限られていたりするわけです。
幸い,今回は端っこの方にスペースがありましたので,なんとかなりましたが,この状況で結構詰んでしまう場合もあるので,注意が必要です。何事も余裕を持って取り組むことが大切…ということですね(笑)。
また,ご覧のとおり,ユニバーサル基板にメッキ線で電源ラインを引き,IC の隙間で配線しています。小規模な工作なら,あまり問題は発生しないと思いますが,コネクタピンの節約をしたかったこともあって,電源ラインを結構いい加減にした結果,ただでさえ配線ノイズが多いのに,電源がかなり不安定になってしまいました。
このくらいの規模になると,この辺りきちんと対策しないと駄目なんだなぁ…と感じました。
そんなこんなで,既に作成した CPU 基板と,BG 基板にも結構修正を入れることになってしまいました。
改めて,これら 2 枚の基板です。
そして,4 枚の基板を接続したものがこちらです。
基板面積が大きいので,アーケード基板っぽくて,なんかかっこよくないですか?(笑)
そして動作確認
スプライトの動作確認用コードは,FPGA でテストした時のプログラムをそのまま使います。ハードウェア互換があるので,動いて当然ですよね。
画面に縦縞ノイズが出ていますが,気にしないでください(笑)。
スプライトは一画面に 128 枚表示できるのですが,このくらいの枚数になるとアーケードゲーム基板でも専用チップにしたものが多かったような気がします。
ロジック IC の速度的に結構厳しい感じでしたが,理論的には可能なはずだと思っていましたので,個人的には満足しています。
今後の予定
予定を立てても,性格的にあまり実行に移せないのですが…(笑)
「ソフト無ければただの箱」と宮永先生もおっしゃっていたように,せっかくハードウェアを作ったので,なにか動くプログラムを作ってみたいと思います。アセンブリ言語での開発になるので,時間はかかると思いますが…。
このゲーム機は,「オレのオレによるオレのためのゲーム機」として作成しましたが,実は,元々「Z80 を搭載したオレの理想のゲーム機」という野望がありました。
今回,かなり簡略化して作ってみましたが,概ねタイミング周りは問題ないことがわかったので,今後は,以下の機能を追加した「オレ仕様ゲーム機 mkII」的なものを作れたらいいなぁ…と思っています。
- マルチ CPU
- 複数枚の BG 画面
- スプライトの横並び枚数増加
- カラーパレットの色数増加
- 複数音源
まぁ,予定は未定です(笑)。やるとしてもプリント基板を作ることになりそうな気がします。
昨今の世の中的に,お披露目する機会がないのがちょっと残念ですね…。
…と言うことで,「オレ仕様のゲーム機を作ろう」はまだ続きます(笑)。
元玉屋店員です(笑)
検索で辿り着いたのですが、凄いですね・・・感動しました!
需要がどれくらいあるのか判りませんが、是非どこかで(youtubeとか?)
お披露目してください。
TakaPさん
コメントありがとうございます。
以前は,作ったものを小規模なイベントなどに持っていって披露していたのですが
現在は,なかなかそれも難しくて…。
早く,気軽に集まってワイワイできる日が来るといいです。