Z80 ゲーム機を作ろう(その5)
さて,なんとか(その5)まで来ました。前回は,アナログ RGB での画面出力と,DCSG 音源の再生までを作成しました。
画面は出力できましたが,固定のカラーバーしか表示できないので,これではまだゲーム機とは言えません。
そこで今回は,BG 画面の製作に入りたいと思います。
BG 画面って何だ?
背景画面のことで,おそらくバックグラウンドの略だと思います。多分…。
プレイステーションより前の世代のゲーム機には一般的に搭載されていた機能だと思います。
機能を簡単に説明すると,8 * 8 ドットの大きさのキャラクターパターンを複数用意しておき,それに一意の番号を割り当ててメモリに置いておきます。
今回はこのキャラクターのドットパターンは ROM に入れますので,実行中に書き換えることはできません。
ここでは,これをキャラクタージェネレータ ROM と呼ぶことにします。(略してキャラジェネ ROM)
この 8 * 8 ドットのキャラクターパターンを画面一杯に敷き詰めたものが BG画面です。敷き詰めますので,キャラクターパターン同士は重なり合うことはありませんし,穴が開くこともありません。
この敷き詰めるキャラクターパターンは,好きなものを好きな位置に置くことができないと意味がありませんよね。
それぞれどこの位置に置くかを設定するメモリが必要です。
ここでは,それをネームテーブルと呼ぶことにします。
当然このネームテーブルは,ROM にすると固定画面しか表示できなくなりますので,RAM に割り当てる必要があります。
この 2 つの組み合わせで,画面を構成することができますが,これでは,色違いのキャラクターを表示しようとすると,別のパターンとして定義する必要があり,ちょっと不便だし,容量が勿体無いですよね。
そこでネームテーブルとちょうど対になるカラーを指定するメモリがあると,キャラごとに色変更ができて便利です。
スライム,スライムベス,メタルスライムみたいなもんですね。このメモリをカラーテーブルと呼ぶことにします。
BG 画面のメリット
まず,画面表示用のメモリの削減になります。
すべて異なったキャラクターパターンを表示する場合(フルビットマップ)は,逆に使用メモリ量が少し増えてしまいますが,この時代のゲームの背景には,同じキャラクターパターンが並んでいることが多いですから,使えるキャラクター数を絞れば,この方式のほうがコストダウンになります。
次に画面書き換えのコストが安いです。
ここでいうコストとは処理負荷のことで,8 * 8 ドット単位なら,ネームテーブルの 1 バイト書き換えるだけで別のパターンにすることができます。
昔のフルビットマップのパソコンとかは,8 * 8 ドットのパターンを書き換えるにもそのドット数分のデータを書き換えなくてはならないので,なかなかアーケードゲームのようにスムーズに動かすのが困難だったような気がします。
ビデオ RAM の排他制御
ネームテーブルとカラーテーブルに必要なデータを書き込むと,BG を表示させることができる…ということはわかりました。
この表示用の RAM は,一般にビデオ RAM と言われています(略して VRAM)。
今回,キャラジェネは ROM に入れましたが,これを VRAM に持つと,キャラクターパターンも書き換えることができます。
昔のパソコンの「プログラマブルキャラクタージェネレータ」(PCG) とか,MSX の SCREEN 2 とかは,そうでしたよね。
この VRAM,Z80 からの書き込み,表示ロジック回路の読み出しが,非同期(…のように)に行われます。
表示ロジック回路が情報を読み出している間は,表示ロジック回路がバスを使うので,Z80 がアクセスすることはできません。
バスの競合が発生するためです。(この辺りは,今まで何回か説明しましたよね)
これに対して,VRAM が CPU のバスに接続されていなくて,専用の画像表示チップに接続されている場合,画像表示チップがアクセスタイミングをうまく調整してくれます。
MSX の VDP なんかは,VRAM にデータを書き込む場合,VDP のI/O ポートに対してアドレスとデータを指定すると VDP が VRAM に書き込んでくれます。
今回作成するゲーム機は,VRAM が CPU のアドレス空間にマッピングされますので,うまくバスの競合を回避しなくてはなりません。
BG の表示ロジック回路は,画面の走査クロックに合わせて一定のタイミングで VRAM を読み出しますので,Z80 には,この読み出していない期間をアクセスタイミングの期間として与え,表示ロジック回路と交互に使います。
しかし,Z80 が,このシビアなタイミングを見計らってアクセスするのはちょっと困難です。
どうするのかというと,Z80 が書き込もうとした時に,アクセスタイミングが合っていなかったら,次のアクセスタイミングが来るまで,Z80 に待ってもらうのです。
Z80 には,このための機能として /WAIT という信号ピンがあります。これをアクティブにしてやると,Z80 は,メモリアクセスの直前で,それを保留するので,表示ロジック回路がバスを使っている期間に /WAIT 信号を送ってやればよいというわけです。
/WAIT 信号については,Z80 の本に詳しく書かれていると思いますので,そちらを参照して下さい。(オイ)
BG 画面の制御基板
…んで,この排他制御を行う基板を作りました。実際に表示する回路は,また別の基板に作りますので,次回紹介する予定です。
ロジック IC だけなので,シンプルですね。
基板に空きができるので,排他制御の他に,BG のスクロールレジスタも付けました。
いわゆるハードウェアスクロールという機能です。
今回 BG は二画面分作成する予定ですが,そのうちの一面は上下左右にスクロールする機能を付けます。
前回までの基板に載っけて4階建て
4 階建てになりました。
やっぱり,ひとつずつ増えていくと楽しいですよね。
さて,今回は,BG の制御基板を作成しましたが,目に見える変化はありませんので,ちょっとつまらなかったかもしれませんね…。
次回は,実際にキャラクタージェネレータ ROM と,ネームテーブル,カラーテーブルから BG を表示する基板を作りたいと思います。
今年もあと少しですが,まぁ,のんびりやっていきたいと思います…。