Z80 ゲーム機を作ろう(その8)
前回はスプライトメモリの基板を作りました。
今回はその続きとして,スプライトのキャラジェネ ROM の基板を作ります。
この基板を追加すると,表示しようとしている走査線に入っているスプライトを,スプライトメモリから判定し,ラインバッファへ書き込むドットデータを決定することができます。
前回は,スプライトの概要を説明したので,今回はこのドットデータの出力までの流れを書いてみようかなと思います。
水平ブランク中の処理
水平ブランク期間は,結構短いです。この限られた時間内に,スプライトメモリ(全スプライトの位置やパターン番号が設定されているメモリ)を上から順になめていきます。
ドットクロックによるカウンタによって,スプライトメモリにある Y 位置を順次アドレッシングし,取得した Y 位置と現在の走査線を比較します。
マシン語をやっていた人にはお馴染みですが,比較は引き算によって行いますよね。結果がゼロだったら一致とか,ボローが出たら小さいとか…。
この引き算,「引く値の 2 の補数」を足し算することによっても同じことができますよね。
ということは,現在の走査線と,スプライトの Y 位置の補数を,加算器に入力すると判定できるというわけです。
その結果,表示する走査線に重なっていると判定されたスプライトは,その番号をスタック構造のメモリに格納し,覚えておきます。
このスタック構造のメモリは,16 個まで格納しておくことができます(容量が 16 個分しかないのではなく,水平ブランク中の期間に最大で 16 個入れるだけの処理しかできないのです)。
即ち,1 ラインで 16 個までスプライトを表示することができるということですね。
走査線表示中の処理
表示中(水平ブランクじゃない期間)は,二つの処理を平行して行います。
一つは,ラインバッファへのドットパターンの書き込み。もう一つはラインバッファの内容の画面への出力です。
前回も書きましたが,ラインバッファを画面に出力するには,ラインバッファへドットパターンが事前に書き込まれている必要がありますよね。
このため,ラインバッファは書き込み用と読み出し用の二つを用意します。
書き込んだバッファは次のラインで読み出し用に,読み出したバッファは次のラインでは書き込み用になるわけです。
水平ブランク期間に,表示すべきスプライトを特定し,スタック構造のメモリに格納しましたので,今度はそれを順番に取り出します。
スタック構造は後入れ先出し(Last In First Out,略して LIFO と言います)なので,最後に入れたものから処理します。(Z80 で言うところの PUSH と POP ですね)
取り出したスプライト番号をアドレスにして,スプライトメモリからクロックに従って,パターン番号,位置,カラー番号を取り出します。
改めて走査線とスプライトの Y 位置を比較し,スプライトパターン内の Y 方向 16 ドットのうち,走査線に表示するラインを決定します。
スプライトのパターン番号と,パターン内の表示するラインが決まると,それを元にキャラジェネ ROM のアドレスを決めることができます。
キャラジェネ ROM から横 16 ドット分のパターンデータを読み出し,シフトレジスタで 2bit ずつ取り出します。
実は,スプライトメモリ内のカラー番号には,フリップ情報のビットが含まれていて,左右,または上下に反転して表示することができます。
上下反転時は,スプライトパターン内の表示するラインを決定するときに反転し,左右反転時は,シフトレジスタでシフトする方向を変えることで,それぞれ逆方向から表示することができるんですね。
この機能のおかけで,反転したパターンを用意しなくてもいいので,パターンデータの節約になるんです。
シフトレジスタから順次出力される 2bit のデータ(スプライトあたり 4 色表示できることになります)とカラー番号から最終的な RGB 値が決まり,モニターに出力されますが,今回の基板はこの 2bit のデータを出力するところまでになります。
スプライトキャラジェネ ROM 基板
…んで,作った基板がこちらです。
UV-EPROM の遮光シールがお気に入りです(笑)。
Z80 と接続
そして,7 階建てになりました。
スプライト機能は,ラインバッファへの書き込みが残っていますので,もう 1 枚作ります。
それでやっと画面にスプライトを表示することができます。
BG もあと 1 面分残っていますので,もう 1 枚作ります。
そして,最終的に BG 出力と スプライト出力をミックスして,アナログ RGB 信号として出力しなくてはいけないので,このプライオリティコントロールをする基板で 1 枚。…と言うことは,あと最低 3 枚は作らなくてはいけないですね…。
そうなると,10 階建てにはなるということか…。
そんなに枚数を多くして,期待通りに動くんだろうか…。ちょっと心配になってきました。
というわけで…,まだもう少し先はありますが,次回は「ラインバッファ書き込み基板」を作る予定です。
これでやっとスプライトが表示できるようになる予定ですが,うまくいくといいなぁ…。
そういえば,コメント欄に書き込んだ内容の確認って一度もやっていませんでした…。
ちゃんと書き込めているようですので,ご意見,ご感想,ご質問などありましたら,よろしくお願いします。