![見出し画像](https://assets.st-note.com/production/uploads/images/97808070/rectangle_large_type_2_75c1e8c47dd2d85aae9f7c595b2ef458.png?width=1200)
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
![](https://assets.st-note.com/img/1676135000500-MAqTs18Td0.png?width=1200)
縦方向のドット数が増えたので、やや上に寄った画面になります。縦軸を最初の赤い線と重なるようにしましたが、縦軸が赤く変わることはありません。以下のコードを追加してみましょう。文字も同じように描けます。
72 OPEN “GRP:” AS #1
74 PSET(110,100),0
76 PRINT#1, “SAMPLE”
![](https://assets.st-note.com/img/1676134963994-EOE6MSojRq.png?width=1200)
あれ?文字の背景は背景色で塗られて赤い線が消えてしまいますね。透明色の扱いが変わったのかな?
実は 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
座標は変えていないので、横方向が詰まった画面になります。
![](https://assets.st-note.com/img/1676135144477-qMIRCU3HqL.png?width=1200)
あれぇ、文字描画は別の色指定が必要になるみたいですね。
このモードに関しては、色に関して少し注意点が他にもあるようです。
COLOR
SCREEN 7
こちらは SCREEN 5 の横方向を素直に2倍にしたモードです。VRAM として 48K余りを使うので、128K 搭載した機種のみしか使えません。
SCREEN 5 と同じコードの モード番号だけ 7 に変えて実行してみます。
![](https://assets.st-note.com/img/1676135254087-z1wsZTr14v.png?width=1200)
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
![](https://assets.st-note.com/img/1676135329133-JPdFotER0s.png?width=1200)
色はパレット番号ではなく &HGGGRRRBB を直接指定します。RGBで3ビットずつ使うと 9 ビットになってしまうので、B だけ 2ビットしかありません。
ところで、MSX2 では多くの VRAM が搭載されているので、複数の画面を持つことが出来ます。表示されるページを SET PAGE 命令で指定します。
SET PAGE
スクリーンモードを変更したときには、その最初のページ(ページ0)しか内容がクリアされず、リセットしてもVRAMの内容は変更を受けません。
描画に時間がかかる処理を行うときには、見えない画面で描画を行ってから表示ページを切り替えたり、複数のページを使って画面の変化をスムーズに行う手法が使われることも多かったと思います。いずれにせよ解像度があがったり色数が増えれば、描画に必要なVRAMアクセスも増えるのですが、CPUの速度は変わらないので、パフォーマンスは悪化します。
MSX2+ では、さらに多くの画面モードが使えるようになりましたが、今回はここまで。
いいなと思ったら応援しよう!
![kzn](https://assets.st-note.com/production/uploads/images/111925158/profile_dffba6e25229ee04f46397fb91bbfc20.jpg?width=600&crop=1:1,smart)