
パレットテーブルはVRAMとRAMのどちらにも配置できます。が、DMシステム2のパレット機能を有効に活用するにはデータをRAMに配置する必要があります。
※ DMシステム2本体のアドレスにパレットデータは置かないで下さい。
通常はパレット番号と同時に各種モード(後述説明)を設定して、この命令を利用します。
ちなみに特にモードを指定しない場合は、この命令を実行した時点のパレットと、指定したパレットとの輝度(赤、青、緑)を比較して、全パレットの輝度を各1段階ずつ変化させて終了します。これを7回繰り返せば、結果的に目的のパレットになります。
VRAMのパレットテーブルにパレットデータが入っている場合は、まずこのモードでDMシステム2のパレットテーブルへデータをコピーしてください。スクリーンモードは自動判定しますので、スクリーンモードに関係なくこの命令を利用できます。
※VRAMモードではマクロ操作(後述)をサポートしません。
フェード・インは、現在見ている画面のパレットから次のパレットへ移行するまでの「中間色」が肝心です。BASICでこれを実現するのはかなり面倒なのですが、DMシステム2なら簡単なプログラムで実現できます。
パレットは最低2セット必要です。そしてパレットテーブルはRAMの任意のアドレスへ事前にロードしておきます。ここでは現在見えているパレットを#0、目的のパレットを#1と決めてサンプルプログラムを紹介します。
turboR専用でcall pauseなんて命令もありますが、せっかくDMシステム2があるのですから、ここは call wait を利用したウェイトを使うように心がけてみてはいかがでしょうか。
ある色だけ点滅させたり、高速に色を変えたりするテクニックもありますし、16色中の何色かをアニメーション用に割り当て、色を隣の色コードへ移動させることを繰り返す「回し」というテクニックなんてのもあります。
DMシステム2ではパレットアニメも簡単に実現します。要は「一気モード」でフェード・インと同じことをやれば良いのです。
事前にマクロデータを用意してこれを実行すると、バックグラウンド処理でパレット操作を行いつつ、BASICは次の命令を処理できるという「並列処理」が可能です。
今までの説明ではBASICプログラムを組んでそのつど実行してきましたが、VDPマクロを利用するとパレットアニメーションは自動運転で、その間に他のプログラムが実行できるわけです。
プログラムの内部処理に時間がかかっていたりすると画面表示が止まりがちでプレイヤーにストレスを与えかねませんが、パレットアニメーションしている間に裏で計算したり、裏のVRAMへCG等の圧縮データを展開させたりすれば、パレットアニメーションである程度はごまかせますよね(笑)。用途はいろいろあるでしょう。
詳しくは「VDPマクロ(ds2vm.txt)」をご覧ください。
第1章 概要
1.1 パレット機能とは
MSX-BASICでは困難とされた画面のフェードイン・アウト等、パレットを利用した視覚的効果を実現します。
1.2 パレット機能のルール
パレットデータはMSX2のパレットテーブルと互換でカラー1色につき2バイト、計32バイトが必要です。
※ 16進数での表示
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 (赤の輝度)
1バイト目はRとBが混合しますが、2バイト目はGのみです。数値は0〜7の3ビットを使用します。
1バイト目
-----------------------
b7 b6 b5 b4 b3 b2 b1 b0
0 R R R 0 B 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)
パレットテーブルはパレットの羅列です。先頭の32バイトはパレット#0とし、以後32バイトごとにパレット番号がカウントされます。
第2章 DMシステム2からの利用方法
2.1 パレットテーブルの設定
RAM上に配置したパレットテーブルの先頭アドレスを宣言します。DMシステム2の出荷時では C000h になってます。宣言できるアドレスは自由です。
CALL SETPLT (address)
パレットデータはpoke文で直接作っても良いですし、事前にファイル化してからbloadや_loadでメモリへ転送しても構いません。
ex.)
call setplt (&HD000) ← D000hを宣言
2.2 パレットを変更する
パレットを変更します。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で宣言したアドレスから順に0〜63となります。

ex.)
call chgplt (1) ← 現在のパレットとパレット#1を比較してRGBの各輝度を1段階変化させる
2.3 写しモード
MSX2のVRAMのパレットテーブル32バイトを、指定されたパレット番号のRAMへコピーします。
CALL CHGPLT (64+パレット番号)
「DD倶楽部」など、MSXで作成したCGファイルのパレットデータは大抵CGと一緒に格納されていますが(パレットデータはVRAMのパレットテーブルに格納されています)、DMシステム2では常にcall setpltで宣言したアドレスからのパレットテーブルを使用するのでこの機能があります。
ex.)
call chgplt (64+4) ← VRAMのパレットをパレット#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テーブルは以下の通りでアドレス固定になっています。
screen 0(width 40) 1000h〜17FFh
screen 0(width 80) 1800h〜1FFFh
screen 1 0800h〜0FFFh
screen 2/4 4000h〜47FFh
screen 3 0C00h〜13FFh
screen 5/6 6A00h〜71FFh
screen 7/10/11 D400h〜DBFFh
ex.)
call chgplt (256+128+3) ← DM-PALET #3の一気モード指定
第3章 ちょっと高度な活用方法
3.1 BASICでフェード・イン
画面を「ふわぁ〜っ」と表示するような、フェード・インという映像表現をやってみましょう。

よく「時間稼ぎ」に for〜next文 の空ループを使うプログラムがありますが、MSX2/2+で計算されたウェイトはR800では時間稼ぎにならないくらい速すぎたり、逆にturboRで計算されたウェイトはZ80では重すぎるなど、CPUの速度が変わるととたんにウェイトが破綻してしまいます。ギガミックスとしてはあまり薦められません。
call setplt (&Hnnnn)
→ パレットテーブルを配置したアドレスを指定
call chgplt (128+0)
→ パレット#0(基のパレット)にしておく
for i=1 to 7
→ 7回ループ
call chgplt (1)
→ #1(目的のパレット)へRGB各輝度を1段階ずつ変化
call wait (10)
→ 10/60秒の時間稼ぎ (この値を変えてお好みで)
next i
→ ループ終了
3.2 パレットアニメーション
「パレットアニメーション」とは、パレットの変化であたかも画面が動いているように見せる表現法です。MSX-FAN誌の「AVフォーラム」等で多用されたので、有名ですよね。


フェード・インにしてもパレットアニメーションにしても、やろうと思えばMSX-BASICだけで実現できます。しかしBASICでパレットを変更する、color=(c,r,g,b)文では1色しか変更できない上、RGBすべての輝度を計算しなければならないので、16色分やろうと思うとその処理に時間がかかってしまいます。やはりパレットが一瞬で全部変化してくれないと、作業状態がまる見えなのでカッコ悪いのです。
call setplt (&Hnnnn)
→ パレットテーブルを配置したアドレスを指定
for i=1 to 7
→ パレット#1〜#7をループ
call chgplt (128+i)
→ パレット#iそのものにする
call wait (4)
→ 4/60秒の時間稼ぎ (この値を変えてお好みで)
next i
→ ループ終了

![]()
sample program
CHGPLT.LZH (14KB)
3.3 VDPマクロでさらに面白く
DMシステム2には「VDPマクロ」と呼ばれる、タイマー割り込み内でVDPのレジスタを操作できる機能が搭載されています。
第4章 補足
4.1 使用上の注意
4.2 パレットデータの作成法について
CALL POKES ( address, STRING$(32,0) )