MSX2+ で採用された YJK 自然画 SCREEN 12・19268色 の表示を行います。
とはいっても全色を 1 画面できれいに表示するのは難しいので、
Y を固定にして、横を J、縦を K で変化するようにしました。
J・K が主に色相となるので、このような表示になります
110 の C の値が Y に対応します。0*8~31*8 で変化させて試してみて下さい。
下に Y の値 3 種類を並べました。
RGB の色が分かる人は、この表示で YJK と RGB との対応が
なんとなく理解できる人もいるのではないでしょうか。
特に青(RGB での B)の扱いが特殊な点に注意を要します。
実際他の多色データからプログラムで変換させるのが理想で、
YJK で直接線画するのは難しい仕組みだと改めて感じます。
自然画モード YJK で解説を入れました。
100 DEFINT A-Z
110 C=15*8:'Y*8
120 SCREEN 12
130 COLOR 255,0,0
140 FOR J=-32 TO 31
150 X=128+J*256/64
160 LINE(X+2,0)-(X+2,211),C+(J AND 7)
170 LINE(X+3,0)-(X+3,211),C+(J AND 58)/8
180 NEXT J
190 FOR K=-32 TO 31
200 Y=106+K*212/64
210 LINE(0,Y)-(0,Y+3),C+(K AND 7)
220 LINE(1,Y)-(1,Y+3),C+(K AND 56)/8
230 NEXT K
240 FOR X=4 TO 255 STEP 4
250 COPY(0,0)-(1,211)TO(X,0)
260 NEXT X
270 GOTO 270
SCREEN 11 で表示したい場合は次を変更します。Y の変更は 0*16~15*16 です。
110 C=7*16:'Y*16
120 SCREEN 11
SCREEN 10 は COLOR 0~15 を通常の色コードで扱っているため、
YJK の線画は VPOKE を使う必要があります。
SCREEN 11・12 は COLOR 0~255 で、
VPOKE と同じ値で PSET・LINE 等を扱えます。
この方法を利用し、同じ値になる部分を
LINE で縦に線画する事で少し高速化しています。
MSXPen の WebMSX では更に MSX turbo R で動作させています。
2024年12月に改良しています。更に縦も 2✕212 ドットを描ければ、
あとは COPY した方が速い事に気が付き、そのようにしたところ、
Z80 でもたったの 5 秒で表示できるようになってしまいました。
当初 BASIC では表示するのに時間を要していたので、
z88dk を用いて C 言語で作成してみました。
(後に BASIC も速く表示できるようになったのですが残してます)
表示後、スペースキーで終了し、BASIC へ戻りますが、
WebMSX での表示では終了しないようにしてます。
zcc +msx -lndos -create-app -subtype=disk -bn yjkcolor yjkcolor.c
YJKCOLOR.MSX が生成したマシン語の実行ファイルです。
BASIC より BLOAD"YJKCOLOR.MSX",R で実行します。
当初は 1 ドットずつ VRAM に入れていく方法を用いていて、
これでも当時の BASIC より速かったのですが、
1 行分 256x1 ドットの仮想 VRAM をバッファとして設けてデータを生成し、
LDIRVM でメモリ⇢VRAMのブロック転送する方法を用いたところ、
Z80 でもおよそ 1.7 秒で表示できてしまいました。(2024年12月改良)
YJK の表示を見て、
何か見覚えがあるなぁ~と考えたら
思い出しました!
Raspberry Pi を
HDMI・ビデオ接続している時、
電源入れてまもなく
虹色画面が表示されます。
(正常な時は数秒間のみ)
せっかくなので、
そっくりに表示するプログラムを
作ってみました。
Raspberry Pi 実機の虹色画面
100 DEFINT A-Z
110 C=15*8
120 SCREEN 12
130 COLOR 255,0,0
140 CLS
150 FOR X=32 TO 223 STEP 4
160 K=(X-32)*64/192-32
170 LINE(X ,0)-(X ,211),C+(K AND 7)
180 LINE(X+1,0)-(X+1,211),C+(K AND 56)/8
190 NEXT X
200 FOR J=-32 TO 31
210 Y=106-(J+1)*212/64
220 LINE(34,Y)-(34,Y+3),C+(J AND 7)
230 LINE(35,Y)-(35,Y+3),C+(J AND 56)/8
240 NEXT J
250 FOR X=38 TO 223 STEP 4
260 COPY(34,0)-(35,211)TO(X,0)
270 NEXT X
280 GOTO 280
ブロック転送にした事で、開始位置を指定できるようになったので、
z88dk による C 言語版も作成してみました。
線画領域の横幅が少し狭いために速く、およそ 1.3 秒で表示します。
zcc +msx -lndos -create-app -subtype=disk -bn piboot piboot.c
PIBOOT.MSX が生成したマシン語の実行ファイルです。
BASIC より BLOAD"PIBOOT.MSX",R で実行します。