今回は、メガドライブの画面表示について、画面モードとVRAMのマッピングについてまとめてみました。自分の思い通りに表示させるためには、メガドライブの画像表示の仕組みをある程度理解する必要があります。
<メガドライブの画面モード>
1. GRAPHIC IV モード : マスターシステムとの互換モード
2. GRAPHIC V モード : メガドライブの16ビットモード
の2種類がありますが、基本的にGRAPHIC V モードを使用します。
上図のように①スプライト面(SPRITE)、②ウィンドウ面(WINDOW)、③スクロールA面(SCROLL A)、④スクロールB面(SCROLL B)の4つの面があります。それぞれの面のこと(スプライト面以外)をプレーン(PLAN)と呼びます。
PRIORITY CONTROLLERが表示順序を管理していて、スプライト面はスプライト単位で、それ以外の背景面はCELL(セル)単位'(8x8ドットを1CELLとして扱います)で表示順序を任意に設定できます。PRIORITYの設定が同じ場合、上図の順序で表示されます。
ただし、ウィンドウ面(WINDOW)とスクロールA面(SCROLL A)は、共通のプレーンに表示されており、重ね合わせて表示することはできません。
①32x28 CELL (256x224 PIXEL)と②40x28 CELL (320x224 PIXEL)の2種類のモードがあります。特徴として40x28 CELLモードの時には、スプライトは80枚使用できるのに対し、32x28 CELLの時はスプライトは64枚になります。
--- SGDKの関数 ---
VDP_setScreenWidth320(); // 40x28 CELLモードに設定
VDP_setScreenWidth256(); // 32x28 CELLモードに設定
<スクロール面のサイズの設定>
スクロールA面(SCROLL A)とスクロールB面(SCROLL B)はサイズ変更可能で以下のサイズから選択できます。この範囲のサイズなら一度に画像を読み込むことができます。ただファンタジーゾーンのように背景面が広い場合(横256 CELL)は一度に読み込むことができないため、スクロールに応じて再度画像を読み込む必要があります。範囲が広くなれば当然VRAMの使用量が多くなります。
通常は64x32 CELLの設定で問題ないかと思われます。
①32x32 CELL 2K Bytes (32x32x2Bytes = 2048 Bytes使用)
②32x64 CELL 4K Bytes ③32x128 CELL 8K Bytes ④64x32 CELL 4K Bytes
⑤64x64 CELL 8K Bytes ⑥128x32 CELL 8K Bytes
--- SGDKの関数 ---
VDP_setPlanSize(64,32); // 64x32 CELLに設定
--- SGDKの関数 ---
VDP_setWindowVPos(FALSE, 5); // 上端の5CELLをウインドウ面として使用
②スクロールB面のパターンネームテーブル(SCROLL B PATTERN NAME TABLE)
最大で8K Bytes使用。
③スクロールA面とスクロールB面の水平スクロール量(H SCROLL DATA TABLE )
画面全体をまとめてスクロールするモードと、CELL単位でスクロールするモードと、ライン毎にスクロールするモードがあります。
ライン毎だと1 K Bytes(256 Lines x 2 Bytes x 2画面)使用。全画面だと4 Bytesのみです。
④スプライトアトリビュートテーブル(SPRITE ATTRIBUTE TABLE)
スプライトの座標・使用パターン・パレット・セルの反転・表示優先順位・次に描画されるスプライトの番号を定義したデータをスプライトアトリビュートテーブルと呼び、1スプライトで8 Bytes使用します。80個のスプライトで 640 Bytes使用します。
⑤パターンジェネレーター(PATTERN & SPRITE GENERATOR TABLE )
スプライト・スクロールA面・スクロールB面の表示に必要なビットマップ画像を一般的にパターン(patterns) と呼んでいます。 スプライトに使用されるものをスプライトジェネレーター、スクロール面に使用されるものをパターンジェネレーターと呼びます。パターンデータは両者で共有されます。先頭アドレスは0x0000固定です。がデータサイズは任意です。
データはセル単位の配置になります。 1CELLは16色(4bit)の8x8pixelで1CELLは 4 x 8 x 8 = 32 bytesのデータになります。
--- SGDKの関数 ---
/* VRAMのアドレス設定の例 */
VDP_setWindowAddress(0xD000);
VDP_setAPlanAddress(0xC000);
VDP_setBPlanAddress(0xE000);
VDP_setSpriteListAddress(0xFC00);
VDP_setScrollingMode(HSCROLL_PLANE, VSCROLL_PLANE);