メガドライブのゲームの作り方 その2 - 画面モードとVRAMのマッピング | Arcade Cabinet

Arcade Cabinet

自作したゲームコントローラを紹介します

今回は、メガドライブの画面表示について、画面モードと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に設定

 

<ウインドウ面の設定>
例えば、ファンタジーゾーンの上部のスコアパネルの表示などに使用します。スクロールはしません。設定できるのは四角形の範囲で、1か所のみです。
画面に対して、上端、下端、右端、左端や、左上端、右上端のような設定もできます。
最大40x28CELLの範囲を使用します。VRAMを横一行に40CELLではなく64CELL使用していため、縦28CELL全部使用する設定だと、ウインドウ面用に3584(64x28x2) BytesのVRAMを確保する必要があります。

--- SGDKの関数 ---

VDP_setWindowVPos(FALSE, 5);  // 上端の5CELLをウインドウ面として使用

 
<VRAMのマッピングの設定>
メガドライブのVRAMには64K Bytesの容量があります。マッピングは自由に変更可能で、以下の内容がVRAMに使用されています。
①スクロールA面のパターンネームテーブル(SCROLL A PATTERN NAME TABLE) 各プレーンのセルの使用パターン・パレット・セルの反転・表示優先順位を定義したデータをパターンネームテーブルと呼び、1 CELLで2 Bytes使用します。最大で8K Bytes(128 x 32 CELL x 2 Bytes)使用。

②スクロール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_setHScrollTableAddress(0xF000);
VDP_setSpriteListAddress(0xFC00);
上記設定で下表のようなMappingになります。
/* スクロールモード設定の例 */
VDP_setScrollingMode(HSCROLL_PLANE, VSCROLL_PLANE);  
縦も横もPLANE全体でスクロールする設定です。