見出し画像

MSX2 で拡張された SCREEN モード

今まで MSX で使える画面モードの説明をしてきましたが、何かと制約がありますね。さらに困ったことには、規格をよく読むと、テレビ画面に表示することを考えると、画面の端は、うまく表示されないこともあり得るので、やや小さめな内側のみを使うことを推奨するようなことも書いてありました。

MSX2 では VDP が新しくなり、利用できる画面モードも大幅に増えました。特にテキスト・モードにおいて、横80文字が使えるモードが追加されたことは、プログラムを組む時にグッと楽になりました。但しテレビ画面もしくは同等な規格のディスプレイを使っている限り、縦方向の解像度を上げることは難しく、追加されたモードではインターレース表示が行われてはいますが、横方向が潰れてしまい文字やドットが判別できません。高い表現力を使いたければ、当時はマルチメィでテレビと呼ばれていたようなテレビまたはディスプレイを用意して、RGB出力から接続する必要があります。

MSX2 で追加された画面モードは以下です。

SCREEN 0 テキスト 40✕24文字のテキストに加え、80✕24文字のモードが追加
SCRREN 4 グラフィック 256✕192ピクセル 16色 (横方向の色数制限は SCREEN 2 と同じ)
SCREEN 5 グラフィック 256✕212ピクセル 16色
SCREEN 6 グラフィック 512✕212ピクセル 4色

これに加え、VRAMが128K搭載されている機種では以下のモードも使えます。

SCREEN 7 グラフィック 512✕512ピクセル 16色
SCREEN 8 グラフィック 256✕212ピクセル 256色

SCREEN 8 以外では色を指定する際にカラーパレットを使うことができるようになり、色コード毎にRGBに各々0~7を指定した色(512色)を使うことが出来ます。

MSX2

3章 MSX2の画面モード

http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=3%BE%CF+MSX2%A4%CE%B2%E8%CC%CC%A5%E2%A1%BC%A5%C9


SCREEN 0

横方向の文字数を変えるには WIDTH 命令を使います。

WIDTH 80

を実行すれば横方向に80文字の画面に切り替わります。WIDTH 命令は他のSCREENモードでも使うのですが、指定できる桁数はSCREENモード毎に異なっていて、最初に書いたようにテレビ画面でも安全に表示するために、デフォルト値は最大桁数よりも少し小さめになっています。

WIDTH

WIDTH


SCREEN 4

基本は SCREEN 2 と同じです。横方向 8 ドット内に 3 つめの色を付けようとすると、既に使われている 2 色のいずれかの色が 3 つめの色に変わってしまうことも同じです。異なるのはスプライト機能で、SCREEN 2 ではスプライト全体で 2 色しか使えなかったのですが、SCREEN 4 では、横方向は 1 ライン当たりでは 2 色なのですが、縦方向は 1ライン毎に異なる 2 色が使えるようになりました。

スプライトのライン毎の色を指定するには、COLOR SPRITE$ 命令を使います。
※COLOR SPRITE 命令と紛らわしいのですが、こちらはスプライト全体の色指定です。

COLOR SPRITE$

COLOR SPRITE$()

色指定は下位 3 ビットしか使いませんが、上位ビットには別の意味が割り当てられており、ちょっと複雑になっています。

具体的なVDPの動作に関しては、以下の「スプライトモード2」も参考にしてください。

5章 スプライト

http://ngs.no.coocan.jp/doc/wiki.cgi/TechHan?page=5%BE%CF+%A5%B9%A5%D7%A5%E9%A5%A4%A5%C8

これで MSX ではスペース・インベーダーのような単色のキャラしか動かせなかったのが、もう少し「らしい」キャラが使えるようになりました。


SCREEN 5


SCREEN 2/4 に対して、縦方向のドット数が少し増えています。このモードではドット毎に制約なしに512色中の16色の点を打つことが出来、スプライトもライン毎に色が変えられます。

MSXの画面 - SCREEN2 でグラフィック

で使ったサンプルコードを、少し変えて SCREEN 5 で実行してみましょう。

10 SCREEN 5
20 LINE(16,0)-(16,160),15
30 LINE-(255,160),15
40 PSET(16,RND(1)*160),8
50 FOR X%=32 TO 255 STEP 16
60 LINE-(X%,RND(1)*160),8
70 NEXT
80 A$=INKEY$
90 IF A$=”” THEN 80
縦軸の色が白色のまま

縦方向のドット数が増えたので、やや上に寄った画面になります。縦軸を最初の赤い線と重なるようにしましたが、縦軸が赤く変わることはありません。以下のコードを追加してみましょう。文字も同じように描けます。

72 OPEN “GRP:” AS #1
74 PSET(110,100),0
76 PRINT#1, “SAMPLE”
文字を描いてキャプションを入れてみる

あれ?文字の背景は背景色で塗られて赤い線が消えてしまいますね。透明色の扱いが変わったのかな?

実は SCREEN 2/4 のグラフィックはハードウェア的にはスプライトを敷き詰めたような構造だったので、あまりメモリも使わずに済んだのですが、SCREEN 5 は 24Kとちょっとの VRAM を使います。あくまで VDP のメモリなので、プログラムで使えるメモリが減るようなことはありませんが、少しばかり処理に時間がかかるような気がします。


SCREEN 6

SCREEN 5 に比べると横方向に2倍のドットが使える代わりに使える色の種類が 4 色に減っています。ですから VRAM のサイズとしては SCREEN 5 と変わりません。

色番号が 3 までしか使えないので、少しコードを変えましょう。

10 SCREEN 6
12 COLOR=(3,7,7,7)
14 COLOR=(2,7,0,0)
20 LINE(16,0)-(16,160),3
30 LINE-(255,160),3
40 PSET(16,RND(1)*160),2
50 FOR X%=32 TO 255 STEP 16
60 LINE-(X%,RND(1)*160),2
70 NEXT
72 OPEN “GRP:” AS #1
74 PSET(110,100),0
76 PRINT#1, “SAMPLE”
80 A$=INKEY$
90 IF A$=”” THEN 80

座標は変えていないので、横方向が詰まった画面になります。

横方向のドット数が2倍になったので左に詰まって描画される

あれぇ、文字描画は別の色指定が必要になるみたいですね。

このモードに関しては、色に関して少し注意点が他にもあるようです。

COLOR


SCREEN 7

こちらは SCREEN 5 の横方向を素直に2倍にしたモードです。VRAM として 48K余りを使うので、128K 搭載した機種のみしか使えません。

SCREEN 5 と同じコードの モード番号だけ 7 に変えて実行してみます。

SCREEN 5 の描画が左に寄っただけ

SCREEN 8

このモードは SCREEN 5 と同じドット数ですが、各ドットの色指定にカラーパレットを使わず 256 色を指定できるモードです。使う VRAM の量は SCREEN 7 と同じで、やはり VRAM を 128K 積んだ機種のみでしか使えません。

10 SCREEN 8
20 LINE(16,0)-(16,160),255
30 LINE-(255,160),255
40 PSET(16,RND(1)*160),63
50 FOR X%=32 TO 255 STEP 16
60 LINE-(X%,RND(1)*160),63
70 NEXT
72 OPEN “GRP:” AS #1
74 PSET(110,100),0
76 PRINT#1, “SAMPLE”
80 A$=INKEY$
90 IF A$=”” THEN 80
色は適当に変えたけれど、線は同じように描画される

色はパレット番号ではなく &HGGGRRRBB を直接指定します。RGBで3ビットずつ使うと 9 ビットになってしまうので、B だけ 2ビットしかありません。


ところで、MSX2 では多くの VRAM が搭載されているので、複数の画面を持つことが出来ます。表示されるページを SET PAGE 命令で指定します。

SET PAGE

スクリーンモードを変更したときには、その最初のページ(ページ0)しか内容がクリアされず、リセットしてもVRAMの内容は変更を受けません。

描画に時間がかかる処理を行うときには、見えない画面で描画を行ってから表示ページを切り替えたり、複数のページを使って画面の変化をスムーズに行う手法が使われることも多かったと思います。いずれにせよ解像度があがったり色数が増えれば、描画に必要なVRAMアクセスも増えるのですが、CPUの速度は変わらないので、パフォーマンスは悪化します。

MSX2+ では、さらに多くの画面モードが使えるようになりましたが、今回はここまで。

#MSX #MSX2 #グラフィック #スプライト #画面モード #折れ線グラフ

この記事が気に入ったらサポートをしてみませんか?