English
PROGRAMMER'S GUIDEVDP2ライブラリ
■   | 進む
VDP2ライブラリ

1.ガイド


1.1 目的

1.2 解説

 VDP2は、レジスタやカラーRAMのアクセスをV-BLANK期間中にしか許していません。また多くのレジスタは読み出し不可になっています。
 VDP2ライブラリではライブラリ内にレジスタバッファを持ち、通常のレジスタにする書き込み/読み出しは、このレジスタバッファに対して行い、次のV-BLANK期間中にレジスタにコピーされます。(レジスタバッファの詳細は、リファレンスを参照)
 本ライブラリは大きく分けて以下の関数群に分類されています。それぞれについて解説します。

 [初期化関数]
 VDP2ライブラリを使用する際に最初に実行しなければなりません。

 [テーブル作成&データセット関数]
 VDP2のユーザーズマニュアルおよびリファレンスを参考にして各種パラメータを設定してください。

 [表示画面の操作関連関数]
 スクロール画面の移動、拡大/縮小、回転を行うことができます。

 [ライン画面設定関数]
 ライン画面とバック画面のデータを設定します。

 [ウインドウ設定関数]
 ウインドウの設定を行います。

 [VDP1関連関数]
 VDP1(スプライト)のフレームバッファの内容を表示するために設定しなければならない関数です。

 [カラーRAM関連関数]
 パレットの設定やパレット書き換えなどを行います。

 [プライオリティ関連関数]
 プライオリティの設定と情報の取得を行います。

 [カラー演算関連関数]
 カラー演算処理を行います。用途としては、半透明の物体の表現や幽霊の出現、宇宙船のワープアウトなどのように段々現れてくる効果を付けることができます。

 [カラーオフセット関連関数]
 色にオフセットを付ける処理。用途としては、フェードイン、フェードアウト、ブラックアウト、ホワイトアウトなどです。また、青空から夕焼け空への変化を表現するとき等に有効です。

 [その他特殊効果関連関数]
 ぼかし演算、ラインカラー画面挿入、シャドウビットの設定ができます。(ラインカラー画面は、色演算にのみ使用可能)

 [レジスタバッファ書き込み読み出しマクロ]
 本ライブラリの使用しているプライオリティ関係のレジスタバッファへのビットアクセス用のマクロを提供します。マクロには書き込みと読み込みそれぞれ約90種類あります。

 [V-BLANK割り込み処理関連関数]
 スプライト(VDP1)、スクロール(VDP2)を表示するために、本ライブラリが提供するV-BLANKVDP割り込みルーチンによるフレームチェンジ処理について説明します。

 [フレームチェンジ処理]

 [V-BLANKVDP割り込み処理]
 ユーザーはスプライト(VDP1)、スクロール(VDP2)表示ライブラリを使用する場合、本ライブラリが提供する以下のルーチンを呼び出すV-BLANK割り込みルーチンを作成し、INT_SetScuFunc()にて設定する必要があります。また、以下のルーチンを使用せず独自の割り込み処理ルーチンを呼び出すこともできます。

1.3 基本的なライブラリの使い方

 VDP2ライブラリの基本的な使い方は、「VDP2ユーザーズマニュアル 第15章VDP2の使用方法 15.1 操作の流れ」に準じます。それに従って該当するライブラリを使用してください。
 ここでは、本ライブラリを使用いただく上で特に重要なVRAMのマッピング、設定の自由度が高く設定が複雑なサイクルパターンの設定とサンプルプログラムを使ってコーディングの方法を解説します。

 VRAMのマッピング

図1 VRAMとデータの大きさの比較

 VDP2を有効に使用するには、データをVRAM上にいかに配置するかが重要となります。
 例えば、1677万色のビットマップ画像を表示する場合にはVRAMをすべて使ってしまい他の絵は表示できなくなります。
 次にVRAMのマッピングの例をあげてそれぞれについて解説します。なお、画像データの例にはビットマップを用います。データサイズが固定であるためこの図が直接マッピングの参考になるからです。セル形式では、データの持たせ方によりデータサイズが変わり共通部品が多ければビットマップよりメモリ効率が良くなります。

[例1]VDP2の表示可能面を5面使用する場合
 NBG2とNBG3以外のデータがすべてビットマップで、回転面1面を256色に、ノーマル面4面をすべて16色に設定した場合は以下のようになります。回転面を動かすためには回転パラメータテーブルが必要です。さらにX軸、Y軸回転を行う場合には回転パラメータ係数テーブルも用意しなければなりません。
 本ライブラリでは回転パラメータ係数テーブルは、通常各バンク(VRAM A0,VRAM A1,VRAM B0,VRAM B1)の先頭から配置されます。ただし、本ライブラリのX軸、Y軸回転に使用するのは、2kWord(4kByte)のみです。よって、残りの領域(124kByte)に回転パラメータテーブル、ラインスクロールテーブル、ラインカラーテーブル、バック画面データなどを置くことができます。(1M bit = 128kByte)

図2 VDP2の表示可能画面を5面使用する場合
┏━━━━━━━━━━━━━┓ ┌────────────────┐RBG0
┃VRAM A0      ┃ │256色ビットマップデータ   │    
┃             ┃ │(512×256)       │    
┃             ┃ │1M bit          │    
┃             ┃ │                │    
┃             ┃ │                │    
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥    
┃VRAM A1      ┃ │回転パラメータ係数テーブル   │    
┃             ┃ │(1word)         │    
┃             ┃ │                │    
┃             ┃ ├────────────────┤    
┃             ┃ │回転パラメータテーブル     │    
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥NBG0
┃VRAM B0      ┃ │16色ビットマップデータ    │    
┃             ┃ │(512×256)0.5Mbit│    
┃             ┃ ├────────────────┤NBG2
┃             ┃ │キャラクターパターンデータ   │    
┃             ┃ │パターンネームデータ      │    
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥NBG1
┃VRAM B1      ┃ │16色ビットマップデータ    │    
┃             ┃ │(512×256)0.5Mbit│    
┃             ┃ ├────────────────┤NBG3
┃             ┃ │キャラクターパターンデータ   │    
┃             ┃ │パターンネームデータ      │    
┗━━━━━━━━━━━━━┛ └────────────────┘    

[例2]回転面を2面使用する場合
 キャラクタデータ(ビットマップデータ)、パターンネームデータなどの回転面の各データは、1つのバンクに1つずつしか置くことができません。さらに、RGB1の配置は、VRAMB0にキャラクターパターンデータ、VRAMB1にパターンネームデータに固定されます。

図3 回転面を2面使用する場合
┏━━━━━━━━━━━━━┓ ┌────────────────┐RBG0
┃VRAM A0      ┃ │256色ビットマップデータ   │    
┃             ┃ │(512×256)       │    
┃             ┃ │1M bit          │    
┃             ┃ │                │    
┃             ┃ │                │    
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥    
┃VRAM A1      ┃ │回転パラメータ係数テーブル   │    
┃             ┃ │(1word)         │    
┃             ┃ │                │    
┃             ┃ ├────────────────┤    
┃             ┃ │回転パラメータテーブル     │    
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥RBG1
┃VRAM B0      ┃ │キャラクターパターンデータ   │    
┃             ┃ │1Mbit           │    
┃             ┃ │                │    
┃             ┃ │                │    
┃             ┃ │                │    
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥    
┃VRAM B1      ┃ │パターンネームデータ      │    
┃             ┃ │1Mbit           │    
┃             ┃ │                │    
┃             ┃ │                │    
┃             ┃ │                │    
┗━━━━━━━━━━━━━┛ └────────────────┘    

 VRAMの分割とサイクルパターンの設定
 VDP2は、スクロール画面のデータをTV走査に同期してVRAMから読み出しながら表示しています。表示期間中のVRAMのアクセスは、4回(ハイレゾ画面)または8回(ノーマル画面)をアクセス動作単位(1サイクル)としてそのサイクルを繰り返しています。
 VRAM A(VRAM A0,VRAM A1),VRAM B(VRAM B0,VRAM B1)それぞれのVRAMやバンクごとにサイクルパターンレジスタが用意されています。アクセスは、1コマンド4bitで表されています。
 (「VDP2ユーザーズマニュアル 3.4表示期間中VRAMアクセス方法」を参照してください。)
 サイクルパターンに設定するアクセス回数はデータのタイプや使用方法により異なります。これらをサイクルパターンテーブルに割り当てる必要があります。

表1 1サイクルに必要なパターンネームテーブルデータのアクセス回数
項     目
NBG0 〜 NBG3
RBG0 , RBG1
縮小設定
1倍
1/2倍
1/4倍
1サイクルに必要なVRAMアクセス回数
1
2
4
8

表2 キャラクタパターンデータ(ビットマップパターンデータ)データのアクセス回数
項     目
NBG0 〜 NBG3
RBG0 , RBG1
TV画面モード
 
 
 
 
 
ノーマル
ハイレゾ
専用
キャラクタ色数
16
256
2048
32768
1677万
縮小設定(倍)
1
1/2
1/4
1
1/2
1
1
1
1サイクルに必要なVRAMアクセス回数
1
2
4
2
4
4
4
8
8
4
4

 たとえば、16色のビットマップデータ(キャラクターパターンデータ扱い)の場合は、VRAM A またはVRAM B のいずれか一方だけでも512x256のデータを4つ置くことができます。これをそれぞれのノーマルスクロール面に割り当てるとアクセス回数の合計は4回となります。しかし、ノーマルスクロール面のNBG0とNBG1は縮小機能があります。この機能を使用してそれぞれ1/4倍縮小設定を行う場合は、アクセス回数の合計が10回になり8回をオーバーしてしまい画面に正しく表示されなくなります。その場合にVRAMの分割を行うとアクセス回数が分散されるので正しく画面に表示されるようになります。

図4 16色のビットマップデータの場合
┏━━━━━━━━━━━━━┓ ┌────────────────┐NBG0 1倍
┃VRAM A       ┃ │16色ビットマップデータ    │     
┃             ┃ │                │     
┃             ┃ ├────────────────┤NBG1 1倍
┃             ┃ │16色ビットマップデータ    │     
┃             ┃ │                │     
┃             ┃ ├────────────────┤NBG2 1倍
┃             ┃ │キャラクターパターンデータ   │     
┃             ┃ │パターンネームデータ      │     
┃             ┃ ├────────────────┤NBG3 1倍
┃             ┃ │キャラクターパターンデータ   │     
┃             ┃ │パターンネームデータ      │     
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥NBG0 1/4倍
┃VRAM B0      ┃ │16色ビットマップデータ    │     
┃             ┃ │                │     
┃             ┃ ├────────────────┤NBG1 1/4倍
┃             ┃ │16色ビットマップデータ    │     
┃             ┃ │                │     
┣━━━━━━━━━━━━━┫ ┝━━━━━━━━━━━━━━━━┥NBG2 1倍
┃VRAM B1      ┃ │キャラクターパターンデータ   │     
┃             ┃ │パターンネームデータ      │     
┃             ┃ ├────────────────┤NBG3 1倍
┃             ┃ │キャラクターパターンデータ   │     
┃             ┃ │パターンネームデータ      │     
┗━━━━━━━━━━━━━┛ └────────────────┘     

 プログラム記述例
C言語による実際のプログラム例を以下に示します。

#include <machine.h>
#include "sega_scl.h"

                                     /*     サイクルパターンテーブルの設定        */
Uint16  n0_cycle[]={0x44ff, 0x0fff,  /*     VRAM A(A0)NBG0のキャラクタパターン
                                             とパターンネームテーブル有           */
                    0xffff, 0xffff,  /* VRAM A1 VRAM Aは分割していないので      */
                                     /*     未使用     */
                    0xffff, 0xffff,  /* VRAM B(B0) データなし                 */
                    0xffff, 0xffff}; /* VRAM B1     VRAM Bは分割していないので    */
                                     /*     未使用     */

extern   Uint16  ColData[];                      /* パレットのデータのポインタ   */

SclConfig     scfg;
main()
{
     SCL_Vdp2Init();                             /* VDP2ライブラリの初期化        */

     SCL_SetDisplayMode(SCL_NON_INTER,SCL_224LINE,SCL_NOMAL_A);
                                                 /* 画面モードの設定              */

     SCL_SetColRamMode(SCL_CRM_2048);
                                                 /* カラーRAMモードの設定         */
     SCL_AllocColRam(SCL_NBG0,256,ON);
                                                 /* パレット領域確保              */
     SCL_SetColRam(SCL_NBG0,0,265,ColData);
                                                 /* パレットデータの設定          */

     ..................              /* スクロールデータをVDP2のVRAMに格納します。 */
     SCL_InitConfigTb(&scfg);        /* スクロールNBG0コンフィグレーション初期化   */


     scfg.dispenbl = ON;                         /*     NBG0を画面表示する        */
     scfg.charsize = SCL_CHAR_SIZE_1X1;
     scfg.pnamesize = SCL_PN1WORD;
     scfg.platesize = SCL_PL_SIZE_1X1;
     scfg.coltype = SCL_COL_TYPE_256;
     scfg.flip = SCL_PN_12BIT;
     scfg.datatype = SCL_CELL;
     scfg.plate_addr[0] = SCL_VDP2_VRAM_A+0x0000;
     scfg.plate_addr[1] = SCL_VDP2_VRAM_A+0x2000;
     scfg.plate_addr[2] = SCL_VDP2_VRAM_A+0x4000;
     scfg.plate_addr[3] = SCL_VDP2_VRAM_A+0x6000;
     SCL_SetConfig(SCL_NBG0, &scfg);

     SCL_SetPriority(SCL_NBG0,7);          /*     プライオリティを最大に設定      */

     SCL_SetCycleTable(n0_cycle);          /*     サイクルパターンの設定          */

     INT_SetScuFunc(.....);                /*     V-Blankルーチンの登録         */

     set_imask(0);                         /*     割り込みを有効にする。          */

     SCL_Open(SCL_NBG0);                   /*     NBG0オープン処理               */
     SCL_Move(FIXED(1), FIXED(1), 0);      /*     各種スクロール動作関数         */
          .
          .
          .
     SCL_Close(SCL_NBG0);                  /*     スクロール処理終了            */

     SCL_DisplayFrame();                   /*     V_BLANKを待ちスクロール表示を行 */
}


■   | 進む
PROGRAMMER'S GUIDEVDP2ライブラリ
Copyright SEGA ENTERPRISES, LTD., 1997