Gigamix DM-SYSTEM2

パレット機能

第1章 概要

パレット機能とは

 MSX-BASICでは困難とされた画面のフェードイン・アウト等、パレットを利用した視覚的効果を実現します。

  • BASIC上で画面のフェードイン、フェードアウトが簡単に実現します。
  • 最大64種類のパレットデータを操作できます。
  • VDPマクロ機能でパレットアニメーションがラクラク実現できます。

パレット機能のルール

 パレットデータはカラー1色につき2バイトで、16色分の計32バイトを1単位とします。

col.0 col.1 col.2 col.3 col.4 col.5 col.6 col.7 (色番号)
----- ----- ----- ----- ----- ----- ----- -----
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ……
||  |
||  +-- G (緑の輝度)
|+----- B (青の経度)
+------ R (赤の輝度)

 データフォーマットはMSX2のパレットテーブルと全く同じものです。輝度は0~7の3ビットです。1バイト目はR(赤)とB(青)が混合しますが、2バイト目はG(緑)のみです。

1バイト目
-----------------------
b7 b6 b5 b4 b3 b2 b1 b0
0 R R RB B B
  ~~~~~~~~   ~~~~~~~~
      |           +---- bit2~0 青の輝度 (0~7)
      |
      +---------------- bit6~5 赤の輝度 (0~7)

2バイト目
-----------------------
b7 b6 b5 b4 b3 b2 b1 b0
0 0 0 0 0 G G G
               ~~~~~~~~
                  +---- bit2~0 緑の輝度 (0~7)
【参考】スクリーンモード毎のVRAMパレットテーブル
スクリーンモードパレットテーブルのアドレスバイト数
SCREEN 0(WIDTH 40) 0400h~041Fh32
SCREEN 0(WIDTH 80) 0F00h~0F1Fh32
SCREEN 12020h~203Fh32
SCREEN 2/41B80h~1B9Fh32
SCREEN 32020h~203Fh32
SCREEN 5/67680h~769Fh32
SCREEN 7/10/11FA80h~FA9Fh32

 DMシステム2で用いるパレットテーブルは、パレットデータ1単位(32バイト)の連結です。先頭の32バイトはパレット#0(0番)とし、以後32バイトごとにパレット番号がカウントされます(0~63)。

 MSX2以降の機種で COLOR=(15,7,6,5) や COLOR=RESTORE などの命令でパレットを定義すると、上記のVRAMパレットテーブルへその都度データが書き込まれます。しかし、DMシステム2ではパレットデータの設置場所としてRAMを使用します。COLOR= など既存のパレット関連命令をDMシステム2上で利用することは可能ですが、DMシステム2のパレット制御機能はあくまでRAMを参照します。

 従って、VRAMのパレットテーブルに配置されているパレットデータをDMシステム2で利用する場合は、VRAMからRAMの任意のアドレスへ再配置(コピー)してください。

ex.) CALL BLOCK(@&H7680,&HC000,32) ← SCREEN5の画面でVRAMのパレットテーブル(32バイト)をRAMのC000hへ複製する
ex.) CALL POKES(&HC000,STRING$(32,CHR$(0)))) ← フェードアウトなどで用いる全色真っ黒のパレットデータをRAMのC000hへ作成する

第2章 DMシステム2からの利用方法

初期化①パレットテーブルの設定

 RAM上に配置したパレットテーブルの先頭アドレスを宣言します。DMシステム2の出荷時では C000h になっています。宣言できるアドレスは自由です。

CALL SETPLT (address)
ex.) CALL SETPLT (&HD000) ← D000hを宣言

 パレットデータはPOKE命令で直接作っても良いですし、事前にファイル化してからBLOAD命令や CALL LOAD でメモリへ転送しても構いません。

※ DMシステム2本体のアドレスへパレットデータを配置しないように注意してください。

初期化②スタート時のパレットの設定

 DMシステム2のパレット制御機能を利用するにあたり、「画面の色が最初にどうなっているのか」を決めておく必要があります。例えば、画面が真っ暗な状態からゆっくりとモノが明るく見える状態にする「フェード・イン」という視覚効果を実現したいと考えたとき、まず最初に画面が真っ暗になるパレットデータで画面が表示されている必要があります。


画面のフェード・イン

 最初のパレットを設定するには、以下の命令を実行してください。

CALL CHGPLT (128+パレット番号)
ex.) CALL CHGPLT(128+3) ← 画面をパレット#3にする

パレットを変更する

 パレットを変更します。1バイトの整数を代入しますが、これには3種類の重要な意味があります。

CALL CHGPLT (モード+パレット番号)
  b7 b6 b5 b4 b3 b2 b1 b0
  A C n n n n n n
  ~~ ~~ ~~~~~~~~~~~~~~~~~ bit5~0 パレット番号(0~63)
   |  |
   |  +------------------ bit6    写しモード (0:off 1:on)
   |
   +--------------------- bit7    一気モード (0:off 1:on)

 パレット番号は、CALL SETPLT で宣言したアドレスから32バイトごとに、順に 0~63 となります。

 通常はパレット番号と同時に各種モード(後述説明)を設定して、この命令を利用します。

 ちなみに特にモードを指定しない場合は、この命令を実行した時点のパレットと、指定したパレットとの輝度(R、G、B)を比較して、全パレットの輝度を各1段階ずつ変化させて処理を終了します。これを7回繰り返せば、結果的に目的のパレットになります。


(パレットが段階的に変化してゆく様子)
ex.) CALL CHGPLT(1) ← 現在のパレットとパレット#1を比較してRGBの各輝度を1段階変化させる

写しモード

 MSX2のVRAMのパレットテーブル32バイトを、指定されたパレット番号のRAMへコピーします。

CALL CHGPLT (64+パレット番号)

 「DD倶楽部」など、MSXで作成したCGファイルのパレットデータは多くの場合VRAMのパレットテーブルに格納されていますが、DMシステム2では常にCALL SETPLTで宣言したアドレスからのパレットテーブルを使用するので、VRAMのパレットテーブルをDMシステム2のパレットテーブルへ情報をコピーするのがこの機能です。

 パレットデータを別立てで用意せずにVRAMのパレットテーブルを転用する場合は、まずこのモードでDMシステム2のパレットテーブルへパレットデータをコピーしてください。スクリーンモードは自動判定しますので、スクリーンモードに関係なくこの命令を利用できます。

ex.) CALL CHGPLT(64+4) ← VRAMのパレットテーブルをDMシステム2のパレット#4へコピー

2.4 一気モード

 指定したパレットを基に、全パレットの輝度を一度で目的の輝度にして処理を終了します。COLOR=RESTORE命令 と同等の機能です。

CALL CHGPLT (128+パレット番号)
ex.) CALL CHGPLT(128+3) ← パレット#3そのものにする

2.5 オマケ・VRAMモード

 旧DMシステム(DM-SYSTEM ver.1.50)で搭載した「DM-PALET」と互換のモードで、VRAM上のDM-PALETテーブルからパレットを変更します。

CALL CHGPLT (256+パレット番号)

 DM-PALETテーブルは以下の通りでアドレスが固定されています。

 DM-PALETテーブル アドレス一覧表
SCREEN 0(WIDTH40) 1000h~17FFh
SCREEN 0(WIDTH80) 1800h~1FFFh
SCREEN 10800h~0FFFh
SCREEN 2/44000h~47FFh
SCREEN 30C00h~13FFh
SCREEN 5/66A00h~71FFh
SCREEN 7/10/11D400h~DBFFh
ex.) CALL CHGPLT(256+128+3) ← DM-PALET #3の一気モード指定

※VRAMモードではマクロ操作(後述)をサポートしません。

第3章 ちょっと高度な活用方法

BASICでフェード・イン

 画面を「ふわぁ~っ」と表示するような、フェード・インという映像表現をやってみましょう。

 フェード・インは、現在見ている画面のパレットから次のパレットへ移行するまでの「中間色」が肝心です。BASICでこれを実現するのはかなり面倒なのですが、DMシステム2なら簡単なプログラムで実現できます。


画面のフェード・イン

 パレットは最低2セット必要です。そしてパレットテーブルはRAMの任意のアドレスへ事前に配置しておきます。ここでは現在見えているパレットを#0、目的のパレットを#1と決めてサンプルプログラムを紹介します。

100 CALL SETPLT(&Hnnnn)  ← パレットテーブルのアドレスを指定
110 CALL CHGPLT(128+0)  ← 「写しモード」でパレット#0(基のパレット)そのものにしておく
120 FOR I=1 TO 7
130  CALL CHGPLT(1)  ← パレット#1(目的のパレット)へRGB各輝度を1段階ずつ変化させる
140  CALL WAIT(10)  ← 10/60秒のウェイトを稼ぐ(この値はお好みでどうぞ)
150 NEXT

 BASICではウェイト(時間稼ぎ)の実装に FOR~NEXT 命令の空ループを使う場面がしばしば見受けられますが、MSX2/2+で計算されたウェイトはR800では時間稼ぎにならないくらい速すぎたり、逆にturboRで計算されたウェイトはZ80では重すぎるなど、CPUの速度が変わるとウェイトが破綻してしまいますので、当クラブではDMシステム2の CALL WAIT をおすすめします。

パレットアニメーション

 「パレットアニメーション」とは、パレットの変化であたかも画面が動いているように見せる表現法です。MSX-FAN誌の「AVフォーラム」等で多用されたので、有名ですよね。

 ある色だけ点滅させたり、高速に色を変えたりするテクニックもありますし、16色中の何色かをアニメーション用に割り当て、色を隣の色コードへ移動させることを繰り返す「回し」というテクニックもあります。


カラー1~8の連続で描かれたCG


カラー1~8を「回し」で表現したアニメーション

 フェード・インにしてもパレットアニメーションにしても、やろうと思えばMSX-BASICだけで実現できます。しかしBASICでパレットを変更する COLOR=(c,r,g,b)命令では1色しか変更できない上、RGBすべての輝度を計算しなければならないので、16色分やろうと思うとその処理に時間がかかってしまいます。やはりパレットが一瞬で全部変化してくれないと作業状態がまる見えなのでカッコ悪いのです。

 DMシステム2ではパレットアニメも簡単に実現します。要は「一気モード」でフェード・インと同じことをやれば良いのです。

100 CALL SETPLT(&Hnnnn)  ← パレットテーブルのアドレスを指定
110 FOR I=1 TO 8  ← アニメーションするテーブル数を代入する
120  CALL CHGPLT(128+I)  ← パレット#iそのものにする
130  CALL WAIT(4)  ← 4/60秒の時間稼ぎ (この値を変えてお好みで)
140 NEXT
150 GOTO 110

画面のフェード・イン

Download CHGPLT.LZH (14KB)

VDPマクロでさらに面白く

 DMシステム2には「VDPマクロ」と呼ばれる、タイマー割り込み内でVDPのレジスタを操作できる機能が搭載されています。

 事前にマクロデータを用意してこれを実行すると、バックグラウンド処理でパレット操作を行いつつ、BASICは次の命令を処理できるという「並列処理」が可能です。今までの説明ではBASICプログラムを組んでそのつど実行してきましたが、VDPマクロを利用するとパレットアニメーションは自動運転で、その間にBASICプログラムが実行できるわけです。

 プログラムの内部処理に時間がかかっていたりすると画面表示が止まりがちでプレイヤーにストレスを与えかねませんが、パレットアニメーションしている間に裏で計算したり、裏のVRAMへCG等の圧縮データを展開させたりすれば、パレットアニメーションである程度は間を持たせられますよね(笑)。用途はいろいろあるでしょう。

 詳しくは「VDPマクロ」をご覧ください。

第4章 補足

使用上の注意

 当然ながら、パレット機能が働くスクリーンモードでしか使えません。よって、SCREEN 8ではご利用いただけません。SCREEN 12ではスプライト部分のカラーパレットしか有効になりません。

 CALL CHGPLTで変更したパレットは常にVRAMのパレットテーブルにも書き出しますが、VDPマクロにて変更したパレットはVRAMへ書き出しません(重要)。VDPマクロで変更したパレットを期待して画面のVRAMをセーブするような場合は注意してください。

パレットデータの作成法について

 パレットテーブルには、「グラフサウルス」のパレットファイル(.PL*)をそのままご利用いただけます。この場合、合計8パレット分のデータを「グラフサウルス」で作成できます。

 パレット#0は「フェードアウト専用(画面が消えてゆく用途)」を推奨しています。データ的には黒(00h)を32バイト埋めることをおすすめします。

CALL POKES(address, STRING$(32,0))
ex.) CALL POKES(&HC000, STRING$(32,0)) ← C000hから32バイトを0で埋める
[Back]トップページへ