YJK 表示

 

MSX2+ で採用された YJK 自然画 SCREEN 12・19268色 の表示を行います。

 

とはいっても全色を 1 画面できれいに表示するのは難しいので、

Y を固定にして、横を J、縦を K で変化するようにしました。

J・K が主に色相となるので、このような表示になります

 

 

 

110 の C の値が Y に対応します。0*8~31*8 で変化させて試してみて下さい。
下に Y の値 3 種類を並べました。

 

Y=0
Y=0
Y=15
Y=15
Y=31
Y=31

 

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 秒で表示できるようになってしまいました。


C 言語版

当初 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月改良)


Pi Boot

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 で実行します。