80年代の画面表示技術
目次
PCG
テキスト画面の仕組みで、フォントデータが RAM だったらどうなるでしょう?
MSX や SG-1000 では、この方法で画面を作っていました。
…というか、この2機種は画面用の LSI が同じものです。当時よく使われていた、テキサスインスツルメンツ社製の TMS9918 です。
以下は SG-1000 を省略して「MSX」と記述します。
SG-1000 に恨みがあるわけではなく、単に MSX の方が文字数が少ないためです。
さて、話を戻して、MSX ではフォントデータは RAM になっています。
そのため、フォントを変更することも可能でしたし、ゲームなどで使用する「絵」にしておくこともできました。
これで、少ない RAM で高速に画面を作ることが可能になります。
このような仕組みを、Programmable Character Generator 、略して PCG と呼びます。
「文字コード」に対し、どのようなフォント(画像)を表示するかを変更できる仕組みをこう呼ぶ。
…ところで、この方法は「フォントデータ」なので、モノクロです。
ただし、MSX では、8文字毎に 32のグループに分けて、文字色と背景色を指定できました。
これで、少し「色のついた画面」にできます。
MSX の PCG の真骨頂は「グラフィックモード」と呼ばれる画面モードにありました。
詳細は後で書きますが、グラフィックモードでは、横 8dot ごとに2色の色を使えました。
文字キャラクタは縦に 8dot ありますから、理論上は1キャラクタに 16色使えることになります。
スプライト
さて、ファミコンも MSX も、これなしにはゲームが作れません。スプライトの描画方法です。
先に、テキスト画面の出力方法で「走査線よりも少し先のデータを作っておく」と書いたことを思い出してみてください。
スプライトは、これを応用して描かれています。
横2ライン分の「バッファ」を持っておきます。
1ライン分は、現在出力中のバッファです。
もう1ラインは、次に出力するために作業中のバッファです。
つまり、作業は1ラインを出力する時間内に終わればよいことになります。
まず、1ライン分の「テキスト画面」の表示データを、ラインバッファ上に用意します。
この方法は、テキスト画面の出力方法と同じです。
終わったら、「スプライト」用のメモリを調べます。
スプライトは複数枚持つことが出来ますが、先頭から順に調べます。
(以下、話を簡略化するために、スプライトは 16x16 ドットとします)
1)走査線番号 n から、スプライトの縦座標 Y を引いたものを、m とする。
答えが 0 以上 16 以下なら、この走査線で表示されるスプライトです。
2)スプライトの X 座標を取り出す。
3)ラインバッファの位置 X から、スプライト画像データの m ライン目をコピーする。
この際、スプライトの透明部分は書き変えないようにする。
4)現在のバッファが出力される「次の走査線」がくるまで、1 に戻って続ける。
走査線はあっという間に1ラインの出力が終わってしまいます。
そのため、4 の条件を考えると、スプライト4枚を転送するのがやっとです。
これが、「横に4枚以上並ぶと消える(ちらつく)」という現象の原因です。
改めて簡単に言うと、スプライトは次のように描かれます。
・背景データを、一時的なバッファにコピー。
・スプライトを、座標に従って一時的なバッファに上書き。
この一時的なバッファは、画面出力ごとにつくりかえられます。
このため、背景とは独立してスプライトを動かすことができるのです。
この記事の最初の方で紹介した、グラフィック画面しかないパソコンでキャラクターを動かす方法を覚えてますでしょうか?
あの方法では、動くたびに 192 byte の書き換えが必要でした。これは、透明色などは考慮していない値です。
スプライトでは、スプライトの座標 2byte を書き変えれば目的を達成できます。
しかも、透明部分は背景や他のスプライトが見えているのです。
ファミコンや MSX など、スプライトはゲームを作るうえでの最大の武器でした。
追記:2015.7.6
9か月も前に、ページ下のコメント欄に間違い指摘いただいているのに気付いてませんでした。
ラインバッファに「コピー」と書いてありますが、それは無駄も多いので、直接走査線出力を行いながらスプライトの重ね合わせも処理する回路があったようです。
記述とかなり違います。申し訳ありません。時間があったら上記内容書きなおします。
実際に上記のようにスプライトを処理していたシステムも存在したようで、僕の知識はどうもそのシステムで仕入れたもののようです。