English
HARDWARE ManualVDP2ユーザーズマニュアル第15章 VDP2の使用方法
戻る進む
VDP2ユーザーズマニュアル/第15章 VDP2の使用方法

■15.4 使用上のテクニック

 VDP2を使用する上で役に立つテクニックや、各機能の具体的な使用案などを紹介します。

 ■ビットマップを任意サイズにするテクニック

 VDP2のビットマップの水平方向サイズは512ドットまたは1024ドットの2つから選択することしかできないので、 動画などの任意サイズの画像データをDMA転送する際にVRAMアドレスが連続しないという欠点があります。 この欠点を解決して、任意サイズのビットマップでVRAMアドレスが連続するテクニックについて説明します。

 ●原理
 VRAMアドレスが連続する任意サイズのビットマップを実現させるテクニックの原理を説明します。
例えば、横512ドットのビットマップのVRAMアドレスは座標(0,0)から(511,0)まで連続し、 (511,0)の次のアドレスは(0,1)のドットになります。 このときに横320ドットのビットマップのVRAMアドレスを連続にするためには、 画面に表示するときの表示座標を図15.1のように変更すれば良いことになります。

図15.1 ビットマップの表示イメージ

 図15.1に示したようなビットマップのサイズに合わせた表示座標を実現させるためには、 ラインスクロール機能と縦セルスクロール機能を組み合わせれば良いのです。

 以降、VDP2のビットマップサイズを横512ドット×縦256ドットと設定したものとして説明します。 また、表示させるビットマップの水平方向サイズは8の整数倍とし、 表示開始ラインをn=0、表示開始セルをw=0とします。

  1)水平方向座標
 ラインごとに変化する水平方向表示座標は、ラインスクロール機能を使って左端の水平方向表示座標値をそのまま水平方向ラインスクロール値として設定します。 nライン目の水平方向ラインスクロール値の計算式は、次のようになります。

(nライン目の水平方向ラインスクロール値)
           ={00010000H×(水平方向サイズ)×n}&01ff0000H

  2)垂直方向座標
 ラインごとやライン途中で変化する垂直方向表示座標は、ラインスクロール機能と縦セルスクロール機能を組み合わせて実現します。 まず、VDP2の表示座標値が各スクロール値を使った計算値の小数部を切り捨てることを利用して、 ライン途中で垂直方向表示座標を1つ大きくなるようにするために、縦セルスクロール値を設定します。 wセル目の縦セルスクロール値の計算式は、次のようになります。

(wセル目の縦セルスクロール値)=00000400H×w

 そして、その縦セルスクロール値を考慮しながら垂直方向ラインスクロール値を設定します。 垂直方向ラインスクロール値は、次のような手順で計算します。

手順①:
 nライン目の垂直方向表示座標値の整数部I(n)を求めます。

手順②:
 nライン目において、垂直方向表示座標値が1つ大きくなるときのセル番号mを求めます。

手順③:
 nライン目の垂直方向ラインスクロール値を求めます。

  3)設定例
 フルスクリーン&フルカラーのビットマップ(NBG0、横320ドット×縦224ドット、1677万色)を表示し、 そのVRAMアドレスが連続となる設定例を詳しく説明します。

(1)VDP2のレジスタを次のように設定します。
  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F80000H  8000 0000 0000 0000 0000 0000 0000 0200 ←縦セルスクロールテーブルのため、
 25F80010H  4444 4444 ffff ffff 4444 4444 cfff ffff  VRAM-Bのみ分割する
 25F80020H  0001 0000 0000 0000 0042 0000 0000 0000 ←1677万色ビットマップで、サイズを
 25F80030H  0000 0000 0000 0000 0000 0000 0000 0000  横512ドット×縦256ドットにする
 25F80040H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F80050H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F80060H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F80070H  0000 0000 0000 0000 0001 0000 0001 0000  
 25F80080H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F80090H  0000 0000 0000 0000 0000 0007 0003 8000 ←ラインスクロール(水平、垂直方向画面
 25F800A0H  0003 0000 0000 0000 0000 0000 0000 0000  スクロール値)と縦セルスクロールを有
 25F800B0H  0000 0000 0000 0000 0000 0000 0000 0000  効にする
 25F800C0H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F800D0H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F800E0H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F800F0H  0000 0000 0000 0000 0007 0000 0000 0000 ←NBG0だけ表示する
 25F80100H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F80110H  0000 0000 0000 0000 0000 0000 0000 0000  

(2)縦セルスクロールテーブルに、計算式で求めた値を設定します。
  address      +0       +4       +8       +C   
 25E70000H  00000000 00000400 00000800 00000c00
 25E70010H  00001000 00001400 00001800 00001c00
 25E70020H  00002000 00002400 00002800 00002c00
 25E70030H  00003000 00003400 00003800 00003c00
 25E70040H  00004000 00004400 00004800 00004c00
 25E70050H  00005000 00005400 00005800 00005c00
 25E70060H  00006000 00006400 00006800 00006c00
 25E70070H  00007000 00007400 00007800 00007c00
 25E70080H  00008000 00008400 00008800 00008c00
 25E70090H  00009000 00009400 00009800 00009c00
 25E700A0H  0000a000 0000a400 0000a800 0000ac00 ←この例の場合、41セル目以上
                                                 のデータは使用されない

(3)ラインスクロールテーブルに、計算式で求めた値を設定します。
  address      +0       +4       +8       +C   
 25E60000H  00000000 00000000 01400000 0000a000
 25E60010H  00800000 00010000 01c00000 0001e000
 25E60020H  01000000 00028000 00400000 00030000
 25E60030H  01800000 0003c000 00c00000 00040000
 25E60040H  00000000 00050000 01400000 0005a000
 25E60050H  00800000 00060000 01c00000 0006e000
 25E60060H  01000000 00078000 00400000 00080000
 25E60070H  01800000 0008c000 00c00000 00090000
 25E60080H  00000000 000a0000 01400000 000aa000
 25E60090H  00800000 000b0000 01c00000 000be000
 25E600A0H  01000000 000c8000 00400000 000d0000
 25E600B0H  01800000 000dc000 00c00000 000e0000
 25E600C0H  00000000 000f0000 01400000 000fa000
 25E600D0H  00800000 00100000 01c00000 0010e000
 25E600E0H  01000000 00118000 00400000 00120000
 25E600F0H  01800000 0012c000 00c00000 00130000

 25E60100H  00000000 00140000 01400000 0014a000
 25E60110H  00800000 00150000 01c00000 0015e000
 25E60120H  01000000 00168000 00400000 00170000
 25E60130H  01800000 0017c000 00c00000 00180000
 25E60140H  00000000 00190000 01400000 0019a000
 25E60150H  00800000 001a0000 01c00000 001ae000
 25E60160H  01000000 001b8000 00400000 001c0000
 25E60170H  01800000 001cc000 00c00000 001d0000
 25E60180H  00000000 001e0000 01400000 001ea000
 25E60190H  00800000 001f0000 01c00000 001fe000
 25E601A0H  01000000 00208000 00400000 00210000
 25E601B0H  01800000 0021c000 00c00000 00220000
 25E601C0H  00000000 00230000 01400000 0023a000
 25E601D0H  00800000 00240000 01c00000 0024e000
 25E601E0H  01000000 00258000 00400000 00260000
 25E601F0H  01800000 0026c000 00c00000 00270000

 25E60200H  00000000 00280000 01400000 0028a000
 25E60210H  00800000 00290000 01c00000 0029e000
 25E60220H  01000000 002a8000 00400000 002b0000
 25E60230H  01800000 002bc000 00c00000 002c0000
 25E60240H  00000000 002d0000 01400000 002da000
 25E60250H  00800000 002e0000 01c00000 002ee000
 25E60260H  01000000 002f8000 00400000 00300000
 25E60270H  01800000 0030c000 00c00000 00310000
 25E60280H  00000000 00320000 01400000 0032a000
 25E60290H  00800000 00330000 01c00000 0033e000
 25E602A0H  01000000 00348000 00400000 00350000
 25E602B0H  01800000 0035c000 00c00000 00360000
 25E602C0H  00000000 00370000 01400000 0037a000
 25E602D0H  00800000 00380000 01c00000 0038e000
 25E602E0H  01000000 00398000 00400000 003a0000
 25E602F0H  01800000 003ac000 00c00000 003b0000

  address      +0       +4       +8       +C   
 25E60300H  00000000 003c0000 01400000 003ca000
 25E60310H  00800000 003d0000 01c00000 003de000
 25E60320H  01000000 003e8000 00400000 003f0000
 25E60330H  01800000 003fc000 00c00000 00400000
 25E60340H  00000000 00410000 01400000 0041a000
 25E60350H  00800000 00420000 01c00000 0042e000
 25E60360H  01000000 00438000 00400000 00440000
 25E60370H  01800000 0044c000 00c00000 00450000
 25E60380H  00000000 00460000 01400000 0046a000
 25E60390H  00800000 00470000 01c00000 0047e000
 25E603A0H  01000000 00488000 00400000 00490000
 25E603B0H  01800000 0049c000 00c00000 004a0000
 25E603C0H  00000000 004b0000 01400000 004ba000
 25E603D0H  00800000 004c0000 01c00000 004ce000
 25E603E0H  01000000 004d8000 00400000 004e0000
 25E603F0H  01800000 004ec000 00c00000 004f0000

 25E60400H  00000000 00500000 01400000 0050a000
 25E60410H  00800000 00510000 01c00000 0051e000
 25E60420H  01000000 00528000 00400000 00530000
 25E60430H  01800000 0053c000 00c00000 00540000
 25E60440H  00000000 00550000 01400000 0055a000
 25E60450H  00800000 00560000 01c00000 0056e000
 25E60460H  01000000 00578000 00400000 00580000
 25E60470H  01800000 0058c000 00c00000 00590000
 25E60480H  00000000 005a0000 01400000 005aa000
 25E60490H  00800000 005b0000 01c00000 005be000
 25E604A0H  01000000 005c8000 00400000 005d0000
 25E604B0H  01800000 005dc000 00c00000 005e0000
 25E604C0H  00000000 005f0000 01400000 005fa000
 25E604D0H  00800000 00600000 01c00000 0060e000
 25E604E0H  01000000 00618000 00400000 00620000
 25E604F0H  01800000 0062c000 00c00000 00630000

 25E60500H  00000000 00640000 01400000 0064a000
 25E60510H  00800000 00650000 01c00000 0065e000
 25E60520H  01000000 00668000 00400000 00670000
 25E60530H  01800000 0067c000 00c00000 00680000
 25E60540H  00000000 00690000 01400000 0069a000
 25E60550H  00800000 006a0000 01c00000 006ae000
 25E60560H  01000000 006b8000 00400000 006c0000
 25E60570H  01800000 006cc000 00c00000 006d0000
 25E60580H  00000000 006e0000 01400000 006ea000
 25E60590H  00800000 006f0000 01c00000 006fe000
 25E605A0H  01000000 00708000 00400000 00710000
 25E605B0H  01800000 0071c000 00c00000 00720000
 25E605C0H  00000000 00730000 01400000 0073a000
 25E605D0H  00800000 00740000 01c00000 0074e000
 25E605E0H  01000000 00758000 00400000 00760000
 25E605F0H  01800000 0076c000 00c00000 00770000

  address      +0       +4       +8       +C   
 25E60600H  00000000 00780000 01400000 0078a000
 25E60610H  00800000 00790000 01c00000 0079e000
 25E60620H  01000000 007a8000 00400000 007b0000
 25E60630H  01800000 007bc000 00c00000 007c0000
 25E60640H  00000000 007d0000 01400000 007da000
 25E60650H  00800000 007e0000 01c00000 007ee000
 25E60660H  01000000 007f8000 00400000 00800000
 25E60670H  01800000 0080c000 00c00000 00810000
 25E60680H  00000000 00820000 01400000 0082a000
 25E60690H  00800000 00830000 01c00000 0083e000
 25E606A0H  01000000 00848000 00400000 00850000
 25E606B0H  01800000 0085c000 00c00000 00860000
 25E606C0H  00000000 00870000 01400000 0087a000
 25E606D0H  00800000 00880000 01c00000 0088e000
 25E606E0H  01000000 00898000 00400000 008a0000
 25E606F0H  01800000 008ac000 00c00000 008b0000

 これで、横320ドット×縦224ドットのビットマップのVRAMアドレスが連続になります。

  ●応用
 前述の原理を応用して、図15.2のようにTV画面の任意の位置にTV画面より小さいサイズのビットマップを配置させるテクニックを説明します。

図15.2 ビットマップの表示位置

 ビットマップをTV画面の任意の位置に配置するには、画面スクロール機能を使用するのが最も簡単です。 しかし、単純に画面スクロールさせただけでは次のような問題があり、うまくいきません。

 この2つの問題は、ウィンドウ機能とラインスクロール値の計算式を変更することで解決できます。

1)ウィンドウ機能
(a)の問題は、ウィンドウ機能を使えば簡単に解決できます。 ビットマップを表示する位置に同じ大きさの透明処理ウィンドウを設定し、そのウィンドウ外側を有効にすれば良いのです。

2)ラインスクロール値
(b)の問題は、前述した原理のラインスクロール値の計算を次のような手順で計算することで解決できます。 ただし、ビットマップの表示開始ラインはn=0とし、ビットマップの表示開始座標を(Mx,My)とします。
 また、ビットマップを表示しないラインのラインスクロール値は関係ないので0にしておきます。

手順1:
 My+nライン目の水平方向ラインスクロール値を求めます。

(水平方向ラインスクロール値)
={00010000H×(水平方向サイズ)×n}&01ff0000H

 手順2:
 My+nライン目の垂直方向表示座標値の整数部I(n)を求めます。

I(n)={00000080H×(水平方向サイズ)×n}&01ff0000H

手順3:
 表示ビットマップのnライン目において、垂直方向座標値が1つ大きくなるときのセル番号mを求めます。

手順4:
 My+nライン目の垂直方向ラインスクロール値を求めます。

  3)設定例
 横192ドット×縦144ドットのビットマップ(NBG0、1677万色)をTV画面の中央になるように表示し、 そのVRAMアドレスが連続となる設定例を詳しく説明します。

(1)VDP2のレジスタを次のように設定します。

  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F80000H  8000 0000 0000 0000 0000 0000 0000 0100 ←ビットマップデータが1バンク内に入るので、
 25F80010H  4444 4444 cfff ffff ffff ffff ffff ffff  ダブルバッファ用に一方だけ分割
 25F80020H  0001 0000 0000 0000 0042 0000 0000 0000 ←1677万色ビットマップで、サイズを
 25F80030H  0000 0000 0000 0000 0000 0000 0000 0000  横512×縦256ドットにする
 25F80040H  0000 0000 0000 0000 0000 0000 0000 0000
 25F80050H  0000 0000 0000 0000 0000 0000 0000 0000
 25F80060H  0000 0000 0000 0000 0000 0000 0000 0000
 25F80070H  07c0 0000 0000 0000 0001 0000 0001 0000 ←表示開始座標に合わせて、水平方向画面
 25F80080H  0000 0000 0000 0000 0000 0000 0000 0000  スクロール値を設定する
 25F80090H  0000 0000 0000 0000 0000 0007 0001 8000 ←ラインスクロール(水平、垂直方向画面
 25F800A0H  0001 0000 0000 0000 0000 0000 0003 ffff  スクロール値)と縦セルスクロールを有効にする
 25F800B0H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F800C0H  0080 0028 01fe 00b7 0000 0000 0000 0000 ←ウィンドウを設定する
 25F800D0H  0003 0000 0000 0000 0000 0000 0000 0000
 25F800E0H  0000 0000 0000 0000 0000 0000 0000 0000
 25F800F0H  0000 0000 0000 0000 0007 0000 0000 0000 ←NBG0だけを表示する
 25F80100H  0000 0000 0000 0000 0000 0000 0000 0000
 25F80110H  0000 0000 0000 0000 0000 0000 0000 0000

(2)縦セルスクロールテーブルに、計算式で求めた値を設定します。

  address      +0       +4       +8       +C   
 25E30000H  00000000 00000400 00000800 00000c00
 25E30010H  00001000 00001400 00001800 00001c00
 25E30020H  00002000 00002400 00002800 00002c00
 25E30030H  00003000 00003400 00003800 00003c00
 25E30040H  00004000 00004400 00004800 00004c00
 25E30050H  00005000 00005400 00005800 00005c00
 25E30060H  00006000 00006400 00006800 00006c00
 25E30070H  00007000 00007400 00007800 00007c00
 25E30080H  00008000 00008400 00008800 00008c00
 25E30090H  00009000 00009400 00009800 00009c00
 25E300A0H  0000a000 0000a400 0000a800 0000ac00 ←この例の場合、41セル目以上
                                                 のデータは使用されない

(3)ラインスクロールテーブルに、計算式で求めた値を設定します。

  address      +0       +4       +8       +C   
 25E20000H  00000000 00000000 00000000 00000000
 25E20010H  00000000 00000000 00000000 00000000
 25E20020H  00000000 00000000 00000000 00000000
 25E20030H  00000000 00000000 00000000 00000000
 25E20040H  00000000 00000000 00000000 00000000
 25E20050H  00000000 00000000 00000000 00000000
 25E20060H  00000000 00000000 00000000 00000000
 25E20070H  00000000 00000000 00000000 00000000
 25E20080H  00000000 00000000 00000000 00000000
 25E20090H  00000000 00000000 00000000 00000000
 25E200A0H  00000000 00000000 00000000 00000000
 25E200B0H  00000000 00000000 00000000 00000000
 25E200C0H  00000000 00000000 00000000 00000000
 25E200D0H  00000000 00000000 00000000 00000000
 25E200E0H  00000000 00000000 00000000 00000000
 25E200F0H  00000000 00000000 00000000 00000000

 25E20100H  00000000 00000000 00000000 00000000
 25E20110H  00000000 00000000 00000000 00000000
 25E20120H  00000000 00000000 00000000 00000000
 25E20130H  00000000 00000000 00000000 00000000
 25E20140H  00000000 00000000 00c00000 00000000 ←ビットマップ表示開始ライン
 25E20150H  01800000 0000a000 00400000 00010000
 25E20160H  01000000 00010000 01c00000 0001c000
 25E20170H  00800000 00020000 01400000 00020000
 25E20180H  00000000 00030000 00c00000 00030000
 25E20190H  01800000 0003a000 00400000 00040000
 25E201A0H  01000000 00040000 01c00000 0004c000
 25E201B0H  00800000 00050000 01400000 00050000
 25E201C0H  00000000 00060000 00c00000 00060000
 25E201D0H  01800000 0006a000 00400000 00070000
 25E201E0H  01000000 00070000 01c00000 0007c000
 25E201F0H  00800000 00080000 01400000 00080000

 25E20200H  00000000 00090000 00c00000 00090000
 25E20210H  01800000 0009a000 00400000 000a0000
 25E20220H  01000000 000a0000 01c00000 000ac000
 25E20230H  00800000 000b0000 01400000 000b0000
 25E20240H  00000000 000c0000 00c00000 000c0000
 25E20250H  01800000 000ca000 00400000 000d0000
 25E20260H  01000000 000d0000 01c00000 000dc000
 25E20270H  00800000 000e0000 01400000 000e0000
 25E20280H  00000000 000f0000 00c00000 000f0000
 25E20290H  01800000 000fa000 00400000 00100000
 25E202A0H  01000000 00100000 01c00000 0010c000
 25E202B0H  00800000 00110000 01400000 00110000
 25E202C0H  00000000 00120000 00c00000 00120000
 25E202D0H  01800000 0012a000 00400000 00130000
 25E202E0H  01000000 00130000 01c00000 0013c000
 25E202F0H  00800000 00140000 01400000 00140000

  address      +0       +4       +8       +C   
 25E20300H  00000000 00150000 00c00000 00150000
 25E20310H  01800000 0015a000 00400000 00160000
 25E20320H  01000000 00160000 01c00000 0016c000
 25E20330H  00800000 00170000 01400000 00170000
 25E20340H  00000000 00180000 00c00000 00180000
 25E20350H  01800000 0018a000 00400000 00190000
 25E20360H  01000000 00190000 01c00000 0019c000
 25E20370H  00800000 001a0000 01400000 001a0000
 25E20380H  00000000 001b0000 00c00000 001b0000
 25E20390H  01800000 001ba000 00400000 001c0000
 25E203A0H  01000000 001c0000 01c00000 001cc000
 25E203B0H  00800000 001d0000 01400000 001d0000
 25E203C0H  00000000 001e0000 00c00000 001e0000
 25E203D0H  01800000 001ea000 00400000 001f0000
 25E203E0H  01000000 001f0000 01c00000 001fc000
 25E203F0H  00800000 00200000 01400000 00200000

 25E20400H  00000000 00210000 00c00000 00210000
 25E20410H  01800000 0021a000 00400000 00220000
 25E20420H  01000000 00220000 01c00000 0022c000
 25E20430H  00800000 00230000 01400000 00230000
 25E20440H  00000000 00240000 00c00000 00240000
 25E20450H  01800000 0024a000 00400000 00250000
 25E20460H  01000000 00250000 01c00000 0025c000
 25E20470H  00800000 00260000 01400000 00260000
 25E20480H  00000000 00270000 00c00000 00270000
 25E20490H  01800000 0027a000 00400000 00280000
 25E204A0H  01000000 00280000 01c00000 0028c000
 25E204B0H  00800000 00290000 01400000 00290000
 25E204C0H  00000000 002a0000 00c00000 002a0000
 25E204D0H  01800000 002aa000 00400000 002b0000
 25E204E0H  01000000 002b0000 01c00000 002bc000
 25E204F0H  00800000 002c0000 01400000 002c0000

 25E20500H  00000000 002d0000 00c00000 002d0000
 25E20510H  01800000 002da000 00400000 002e0000
 25E20520H  01000000 002e0000 01c00000 002ec000
 25E20530H  00800000 002f0000 01400000 002f0000
 25E20540H  00000000 00300000 00c00000 00300000
 25E20550H  01800000 0030a000 00400000 00310000
 25E20560H  01000000 00310000 01c00000 0031c000
 25E20570H  00800000 00320000 01400000 00320000
 25E20580H  00000000 00330000 00c00000 00330000
 25E20590H  01800000 0033a000 00400000 00340000
 25E205A0H  01000000 00340000 01c00000 0034c000
 25E205B0H  00800000 00350000 01400000 00350000 ←ビットマップ表示終了ライン
 25E205C0H  00000000 00000000 00000000 00000000
 25E205D0H  00000000 00000000 00000000 00000000
 25E205E0H  00000000 00000000 00000000 00000000
 25E205F0H  00000000 00000000 00000000 00000000

  address      +0       +4       +8       +C   
 25E20600H  00000000 00000000 00000000 00000000
 25E20610H  00000000 00000000 00000000 00000000
 25E20620H  00000000 00000000 00000000 00000000
 25E20630H  00000000 00000000 00000000 00000000
 25E20640H  00000000 00000000 00000000 00000000
 25E20650H  00000000 00000000 00000000 00000000
 25E20660H  00000000 00000000 00000000 00000000
 25E20670H  00000000 00000000 00000000 00000000
 25E20680H  00000000 00000000 00000000 00000000
 25E20690H  00000000 00000000 00000000 00000000
 25E206A0H  00000000 00000000 00000000 00000000
 25E206B0H  00000000 00000000 00000000 00000000
 25E206C0H  00000000 00000000 00000000 00000000
 25E206D0H  00000000 00000000 00000000 00000000
 25E206E0H  00000000 00000000 00000000 00000000
 25E206F0H  00000000 00000000 00000000 00000000

(4)バック画面テーブル(25E7FFFEH)に、黒色(0000H)を設定します。

 これで、横192ドット×縦144ドットのビットマップのVRAMアドレスが連続になります。 この例の場合、ビットマップデータが1バンクに入ってしまうので、 VRAM-AとVRAM-Bでのダブルバッファ構成にすることができます。 ただし1677万色のビットマップなので、縦セルスクロールテーブルは表示側 VRAMでない側に設定しないとVDP2がテーブルを読み出すことができません。 したがって、全く同じ縦セルスクロールテーブルをVRAM-A側とVRAM-B側 の両方に格納しておく必要があります。

  ●まとめ
 TV画面の任意の位置に、指定サイズの連続アドレスビットマップを表示する方法は次のようになります。 ただし、表示ビットマップの水平方向サイズは8の整数倍でなければいけません。

1)画面スクロール値の設定
 水平方向画面スクロール値を設定します。ただし、ビットマップのTV画面上での水平方向表示開始位置をMxとします。

2)ウィンドウの設定
 ビットマップのTV画面表示位置に同じ大きさの透明処理ウィンドウを設定し、そのウィンドウ外側が有効になるようにします。 フルスクリーン表示する場合、ウィンドウの設定をする必要はありません。

3)縦セルスクロールテーブルの設定
 縦セルスクロールテーブルを設定します。ただし、左端のセルをw=0とします。 また、表示ビットマップの横サイズが8ドット,16ドット,32ドット,64ドット,128ドット, 256ドットの場合は、縦セルスクロール機能を使う必要はありません。

4)ラインスクロールテーブルの設定
 ラインスクロールテーブルを設定します。ただし、ビットマップのTV画面上での表示開始ラインをn=0とします。 また、ビットマップを表示しないラインのラインスクロール値は0にしておきます。

5)長所
 このテクニックには次のような長所があります。

 (a)ビットマップデータに割り当てるVRAM容量が、必要最小限で済みます。
 (b)ビットマップ色数の設定に関係なく、VRAMアドレスが連続になります。

■VRAMをダブルバッファにするテクニック

 VDP2にはVRAM-AとVRAM-Bの2つのVRAMがあります。 この2つのVRAMを、表示用と書き込み用のダブルバッファ構成にするテクニックについて説明します。

 1)原理
 VRAMサイクルパターンレジスタは、表示期間中におけるVRAMアクセスを制御します。 つまり、VRAM-AとVRAM-Bのそれぞれに対応したレジスタへの設定値で、 表示用と書き込み用に分けることができます。

 2)使用例
 32768色のビットマップ(NBG0、横512ドット×縦256ドット)をダブルバッファ構成で表示する設定例について説明します。

(1)

 VRAM-A先頭アドレス(25E00000H)からビットマップデータを格納し、VDP2のレジスタを次のように設定します。
  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F80000H  8000 0000 0000 0000 0000 0000 0000 0000 ←必要がないので、VRAMは2分割しない
 25F80010H  4444 ffff ffff ffff ffff ffff ffff ffff 
 25F80020H  0001 0000 0000 0000 0032 0000 0000 0000 ←32768万色ビットマップで、サイズを
 25F80030H  0000 0000 0000 0000 0000 0000 0000 0000  横512ドット×縦256ドットにする
 25F80040H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F80050H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F80060H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F80070H  0000 0000 0000 0000 0001 0000 0001 0000 
 25F80080H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F80090H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F800A0H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F800B0H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F800C0H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F800D0H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F800E0H  0000 0000 0000 0000 0000 0000 0000 0000 
 25F800F0H  0000 0000 0000 0000 0007 0000 0000 0000 ←NBG0だけを表示する
 25F80100H  0000 0000 0000 0000 0000 0000 0000 0000  
 25F80110H  0000 0000 0000 0000 0000 0000 0000 0000 

 この設定でVRAM-Aが表示用、VRAM-Bが書き込み用になっています。 書き込み用となったVRAM-Bに対するCPUからの書き込みは、表示期間中も常に行うことができます。

(2)

 VRAM-B先頭アドレス(25E40000H)から次の絵のビットマップデータを書き込んでおき、 切り替えたいフレーム直前のVブランク中にVDP2のレジスタを次のように変更します。
  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F80010H  ffff ffff ffff ffff 4444 ffff ffff ffff
 25F80030H  0000 0000 0000 0000 0000 0000 0002 0000

 この設定でVRAM-Bが表示用、VRAM-Aが書き込み用になります。 また、ビットマップパターンのバウンダリアドレス値をVRAM-Bの先頭にしています。

(3)

 VRAM-A先頭アドレス(25E00000H)から次の絵のビットマップデータを書き込んでおき、 切り替えたいフレーム直前のVブランク中にVDP2のレジスタを次のように変更します。

  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F80010H  4444 ffff ffff ffff ffff ffff ffff ffff
 25F80030H  0000 0000 0000 0000 0000 0000 0000 0000

 この設定でVRAM-Aが表示用、VRAM-Bが書き込み用になります。 また、ビットマップパターンのバウンダリアドレス値をVRAM-Aの先頭にしています。

(4)

 上記の②と③を繰り返すことで、ダブルバッファ構成で表示することができます。

  3)応用
 1677万色のビットマップのように容量的に2つのVRAMを使わなければ表示できないと思われるものも、 このテクニックを応用すればダブルバッファ構成にすることができます。VDP2の表示用画像データ読み出しが、 TVの走査線に同期してリアルタイムで行っていることを利用するのです。
 例えば、VRAM-Aのデータを表示している期間が表示画面上半分とし、VRAM-Bのデータを表示している期間が表示画面下半分だとします。 上半分を表示している間はVRAM-Bを表示用にする必要はありませんし、下半分を表示している間はVRAM-Aを表示用にする必要がありません。 すなわち、表示画面の中央ラインのHブランクで表示用と書き込み用の切り替えを行えば良いのです。

 ■回転パラメータモードの使用案
 回転スクロール面には2つの回転パラメータテーブルがあり、RBG0は1つの表示画面上でその2つの回転パラメータを切り替えることができます。 この回転パラメータの切り替え方には、モード2とモード3という2種類の方法があります。 図15.3はRBG0だけで表示できる画面例で、この2つの例はモード2とモード3のどちらでも表示できます。 この表示画面例を使って、それぞれのモードの特徴を説明します。

図15.3 RBG0の表示画面例

  ●モード2
 回転パラメータモード2は、回転パラメータA用の係数テーブルから読み込まれた係数データの最上位ビットの値で切り替えの判断をするため、 回転パラメータA用の係数テーブルからドットごとに読み込むときには回転パラメータB用の係数テーブルからドットごとに読み込むことはできません。 すなわち、回転パラメータAによる画面を2軸以上で回転させるときには、回転パラメータBによる画面をZ軸以外で回転させることができません。 図15.3の表示画面例の場合、画面例①の画面中央を中心にして回転させることはできますが、 画面例②を画面中央を中心にして回転させることはできないということになります。
 また、X軸やY軸での回転を行う際の係数データは画面のZ値から求められるので、 図15.3の画面例①での回転パラメータAによる画面と回転パラメータBによる画面の境界線の判断が係数データを求めるのと同時に行うことができるという利点があります。

  ●モード3
 回転パラメータモード3は、回転パラメータウィンドウで切り替えの判断をするため、 回転パラメータA用の係数テーブルと回転パラメータB用の係数テーブルのどちらからもドットごとに係数データを読み込むことができます。 すなわち、パラメータAによる画面と回転パラメータBによる画面を同時に2軸以上で回転させることができます。 図15.3の表示画面例の場合、画面例(1)も画面例(2)も画面中央を中心にして回転させることができるということになります。
 しかし、このモードでは回転パラメータウィンドウを設定する必要があり、図15.3の表示画面例を画面中央を中心にして回転させる場合は回転パラメータの切り替え境界線をラインウィンドウテーブルで設定しなければいけません。 したがって、画面例①のような画面を表示する場合には回転パラメータモード2の方が適していると思います。
 図15.3の画面例では回転パラメータの境界をラインとしましたが、この境界を回転パラメータBによる画面を切り取るような形にして動きを一致させれば、 独立した回転面が2面あるような画面も表示することができます。

図15.4 回転パラメータモード2、3の表示画面例

 ■スプライトウィンドウとカラー演算ウィンドウの使用案
 図15.5の左図ような絵の上にさらに半透明の光のようなスプライトを表示させたい場合、 VDP1においてスプライトどうしの半透明演算をするには、フレームバッファデータをRGBデータにしなければいけません。 しかし、フレームバッファデータをRGBデータにすると、RGBデータのスプライト全部とスクロール面を半透明にすることはできますが、 光のようなスプライトだけを半透明にするということができなくなってしまいます。 このような絵は、スプライトウィンドウとカラー演算ウィンドウを組み合わせて使用することで表示することができます。 ただし、スプライトデータは全てパレット形式である必要があります。

図15.5 半透明にするスプライト表示例

 スプライトウィンドウとカラー演算ウィンドウを使って、半透明スプライトを表示する手順は次の通りです。

1)

 VDP2のスプライトタイプをタイプ2~7にし、スプライトウィンドウをイネーブルにする。 また、カラー演算イネーブル条件を全てのスプライトがイネーブルになるように設定する。

2)

 カラー演算ウィンドウのスプライトウィンドウ用ビットをイネーブルにし、スプライトウィンドウの外側を有効にする。

3)

 スプライトとスクロール面に対してラインカラー画面をイネーブルにし、ラインカラー画面データに半透明スプライトの色を設定する。

4)

 スプライトとスクロール面のカラー演算イネーブルビットとカラー演算割合レジスタを設定する。

5)

 半透明にしたいスプライトをVDP1のMSBオン機能を使って描画させる。

 MSBオン機能を使ったスプライトはキャラクタの外形だけが描画されているので、 半透明にしたいスプライトの絵(カラーデータ)はVDP2側で指定してやる必要があります。 上記の手順ではその指定に単色のラインカラー画面を使用したので、半透明スプライトは単色のものでしかできません。 ただ、ラインカラー画面の代わりにスクロール面を使えば単色以外のものも不可能ではありません。

 ■スプライト用カラー演算割合の使用案
 3Dゲームなどにおいて奥の方に表示するポリゴン(スプライト)ほど暗くしたり明るくしたりする場合、 VDP1の色演算機能(グーローシェーディングモード)を使うと思われますが、VDP1の色演算機能を使うと描画時間が長くなってしまいます。 そこでVDP2のカラー演算機能を使って、VDP1の色演算機能を使わずにスプライト単位で擬似的に色演算させる案を紹介します。 今回の案は、VDP2のカラー演算機能においてスプライトのカラー演算割合がスプライト単位に8種類の中から選択できることを利用するので、 次のような制限があります。

 今回の使用案は、ポリゴン(スプライト)の奥行き方向の位置(Z値)によって、 VDP1のコマンドテーブル中のカラーバンクデータのカラー演算割合用に対応した3ビットを8種類に変化させ、 VDP2のラインカラー画面(単色)と指定された割合でカラー演算させるものです。 設定手順例は、次のようになります。

(1)

 スプライトタイプをカラー演算割合用ビットが3ビットあるもの(例えばタイプ0)にし、 色演算させたいスプライトだけカラー演算が行われるようにカラー演算イネーブル条件 (例えばプライオリティナンバーが4のときのみイネーブル)を設定します。 また、スプライトに対してラインカラー画面をイネーブルにし、スプライトのカラー演算をイネーブルにします。

  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F800E0H  1400 0000 0000 0000 0020 0000 0040 0000

(2)

 スプライト用プライオリティナンバーレジスタに、カラー演算イネーブル条件を満たす値と満たさない値 (例えばスプライト0用に4、スプライト1用に5)を設定します。

  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F800F0H  0504 0000 0000 0000 0203 0000 0000 0000

(3)

 スプライト用カラー演算割合レジスタに、8段階の割合(例えばスプライト0用からスプライト7用になるほどセカンド画面の割合が小さくなるようにする)を設定します。
  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F80100H  1c1f 1418 0c10 0408 0000 0000 0000 0000

(4)

 ラインカラー画面テーブルアドレスレジスタで指定(例えば単色でアドレスは7FFFC番地)されたVRAMアドレスに、 スプライトとカラー演算させたい色(例えば黒)が格納されたカラーRAMアドレス(例えば0番地)を設定します。

  address    +0   +2   +4   +6   +8   +A   +C   +E
 25F800A0H  0000 0000 0000 0000 0003 fffe 0003 ffff ←VDP2レジスタ
 25E7FFF0H  XXXX XXXX XXXX XXXX XXXX XXXX 0000 0000 ←VRAM 
 25F00000H  0000 XXXX XXXX XXXX XXXX XXXX XXXX XXXX ←カラーRAM

(5)

 VDP1のコマンドテーブル中のカラーバンクのカラー演算割合用に対応した3ビットと、 その上位になるプライオリティ用ビット中の1ビットの計4ビットの値を描画するポリゴンの奥行き方向の位置によって変化 (例えば奥に位置するほど小さい値にする)させる。
  カラーバンクデータ   奥行き方向の位置
  0100 0XXX XXXX 0000    最も手前側(カラー演算しない)
  0011 1XXX XXXX 0000    ↑
  0011 0XXX XXXX 0000
  0010 1XXX XXXX 0000
  0010 0XXX XXXX 0000
  0001 1XXX XXXX 0000
  0001 0XXX XXXX 0000
  0000 1XXX XXXX 0000    ↓
  0000 0XXX XXXX 0000     最も奥側(黒になる)

 VDP1の色演算(グーローシェーディングモード)が指定されたオフセット値を加減算するものに対して、 VDP2のカラー演算機能は指定された割合で指定された色(ラインカラー画面)と半透明にするものなので、 全く同じ画像を得ることはできません。しかし、見た目では同じような効果を得ることができると思われます。

 ■ノーマルシャドウとMSBシャドウの使用案
 シャドウ機能によって影となるスプライトには、ノーマルシャドウとMSBシャドウの2種類があります。 それぞれのシャドウ用スプライトには特徴があり、それぞれに適した使い方をする必要があります。

<ノーマルシャドウ>
  1. 決められたデータとなるための影用スプライトキャラクタが必要
  2. スクロール面に対してのみ影を付けることができる
  3. VDP1上では通常のスプライトとして描画される
  4. スプライトタイプに制限がない
  5. スプライトカラーモードに制限がない

<MSBシャドウ>
  1. 通常のスプライトキャラクタデータを流用できる
  2. スプライトとスクロール面の両方に対して影を付けることができる
  3. スプライトとスクロール面の両方に影を付ける場合は、VDP1のMSBオン機能を使う必要があるので描画時間が長くなってしまう
  4. スプライトタイプはタイプ2~7でなければいけない
  5. スプライトデータはパレット形式のみでなければいけない

 例えば、横から見た人(スプライト)の影が地面(スクロール面)に付くような場面にはノーマルシャドウを使い、 上から見た飛行機(スプライト)の影が地面(スクロール面)や建物(スプライト)に付く場面にはMSBシャドウを使います。
 MSBシャドウはパレット形式のスプライトキャラクタの輝度を半分にしたい場合にも使用することができ、 その際にはVDP1のMSBオン機能を使用する必要がありません。 VDP1によって描画されるパレット形式のスプライトデータのMSBは、コマンドテーブルのカラーバンクデータのMSBがそのまま書き込まれるので、 輝度を半分にしたいスプライトのカラーバンクデータのMSBを1にしてやれば良いのです。


戻る進む
HARDWARE ManualVDP2ユーザーズマニュアル第15章 VDP2の使用方法
Copyright SEGA ENTERPRISES, LTD., 1997