メガドラ開発:VRAMについて

 メガドライブは今のハードに比べるといろんな面で非力です。開発に際してはCPU・メモリ・VRAM・ロム容量のそれぞれのリソースを上手に使っていく必要があります。この中では、ロム容量については当時とは事情が異なるため余裕があると言えます。メモリもゲーム内容によっては64KByteで充分でしょう。問題はCPUとVRAMです。というわけで、今回はメガドラ開発でとても重要になるVRAMについてまとめてみたいと思います。

VRAMの用途について

 メガドラのVRAMは64KByteあり、主な用途としてはグラフィックのパターンと、プレーンデータです。それ以外にも、スプライトアトリビュートテーブル、スクロールデータテーブルを配置します。ある程度は自由にレイアウトできます。それでは順番に説明していきます。

グラフィックパターン(セル)

 グラフィックパターンはキャラクターや背景の絵のことで、1ピクセル辺り4bit(16色)、8 * 8ピクセルが最小単位で、セルと呼称します(キャラと書くこともあります)。4bit * 8ピクセル * 8ピクセル = 32byteとなります。仮にVRAMを全てグラフィックパターンに使用した場合、2,048セル分となります(32byte * 2,048枚 = 65,535byte)。

プレーンデータ

 プレーンデータ(ネームテーブルと書くこともあります)は背景データのことで、どのセルをどのように配置するかをまとめたものです。メガドラでは1セルを2byteで指定し、32セル * 32セル(32セル=256ピクセル)を1画面としています(32 * 32 * 2byte = 2,048byte)。最大で4画面分を縦・横、自由に設定できます。現実的に考えると、横320ピクセルモードでは横2画面(512セル * 256セル)あれば全体をカバーできますので、このように指定しているゲームが多いようです。横256ピクセルモードで、横スクロールしないゲームなら1画面でも済みそうですね。
 メガドラは二重スクロールできますので、このプレーンデータを2枚分保持します。プレーンAとBで画面数を変えることはできません。また、ウィンドウ面というのがあり、使用する場合は同様にプレーンデータが必要となります。3面分のデータを指定することになりますが、ウィンドウ面は仕様上はプレーンAの一部となるため、3重スクロールはできません。
 また、プレーンA、Bは0x2000のアライメントの制約があります(ウィンドウ面のアライメントは0x1000のようです)。VRAMのレイアウトをする際には注意してください。
 ウィンドウ面については、使用しないのであればパターンで埋めてしまっても問題ありません。また、使う場合でも画面にでない領域はパターンで使っても問題ありません。例えば画面上4セル分をウィンドウ面として使うのであれば512byteで十分です(320ピクセルモード、横2画面想定、64セル x 4セル x 2byte = 512byte)。

スプライトアトリビュートテーブル

 メガドラでは80枚のスプライトが使用でき、1枚あたり8byteで管理しています。ですので8byte * 80枚 = 640byte分のテーブルとなります。配置の際には0x400のアライメント制限に注意してください。

スクロールデータテーブル

 メガドラでは横方向のスクロール方法を【画面全体・8ドット単位・ライン単位】のいずれかの方法でスクロール値を指定できます。ライン単位の場合は画面の解像度が縦224ラインですので、224ライン * 2画面分 * 2byte = 896byteのテーブルを用意します。8ドット単位の場合は8ラインおきにデータをセットしますので、8ドット単位しか使わない場合でもほぼ同サイズのテーブルが必要です。画面全体スクロールしか使わない場合のみ4byteで充分ということになりますね。また、アライメントはスプライトと同じで0x400です。
 ちなみに縦スクロールに関しては専用のメモリがあります。 

配置例

 下の画像はVRAMの配置例です。各プレーンは2画面分です。ウィンドウ面はどの範囲が必要になるかはゲーム内容によって異なります。実際に使う場所だけプレーンデータを配置して、それ以外の場所はCHRパターンを配置してしまいましょう。
 このエクセルシートは空白のマスが丁度1セル分となっています。このようなエクセルシートを作っておくと便利です。

 メガドラでゲームを作るにはVRAMをいかに上手に扱うかが重要です。1フレームあたり約7KByteのDMA転送が可能ですので、VRAMを上手に書き換えれば様々な表現が可能です。
 DMA転送について、具体的にいうとプレーンデータであれば画面全体を1フレームで書き換え可能です(2画面分で4,096byte)。パターンデータであれば仮に6KByte転送としても192パターンを毎フレーム転送できることになります。
 格闘ゲームであれば、背景のパターンはすべてVRAMに乗せておき、キャラクターはロムからパターンデータを適宜DMA転送します。この方法でもかなり大きいキャラクターを動かすことができます。しかもVRAMサイズの影響をうけずに、ロム容量が許す限りパターンデータを用意できます。
 このように柔軟に使用法を考えることで、8bit機ではできないような表現が可能です。

いいなと思ったら応援しよう!