[1chipMSX改]

V9958調査資料 〜YJKカラー〜

V9958には、YJKカラーモードという機能が存在する。

MSX-BASIC では、SCREEN10〜12 という画面モードとして扱われているが、VDPとしては R#0,R#1 の M1〜5 のモード
指定とは独立して、R#25 に YJK というビットで存在しており、実際に独立に機能する。

独立であることの確認方法は簡単で、BASIC から下記のプログラムを実行してみればいい。

SCREEN 1:PRINT "TEST":VDP(26)=VDP(26)OR8

画面は SCREEN1 のままであるにも関わらず、画面が YJKモードに切り替わるため、文字が化けるのが確認できる。
しかし、SCREEN1 である証拠に、カーソルキーを動かしてみると、しっかりカーソルの位置らしき部分が反応する。

この挙動は、画面モードを処理している回路(TH9958 では VDP_GRAPHIC.VHD)は、普通に SCREEN1 として処理し、
その出てきたパレット値4bit の上に "1111" を付加した 8bit を強引に YJKカラーと処理しているように見える。
Y に相当するビットが常に ALL 1 に近い状態であるため、画面全体が白っぽい表示になる。
BlueMSX2.7 あたりでは、この辺の挙動はエミュレートされていないようである。

回路的には、新たに画面モードとして認識するよりも、「パレットとして処理する回路」と「YJKとして処理する回路」
が並列動作して、出てきた値に対してどちらを採用するか選択する MUX があるような構造にすると簡単になる。

MSX Datapack の YJK の説明部分に簡単なブロック図が記載されているが、それも出力値を MUX してるだけの回路として
記載されている。


1chipMSX では、表示は R,G,B を基準にしているため、Y,J,K値から R,G,B値へ変換しなければならない。
変換式は下記の式を用いる。

B=5*Y/4 - J/2 - K/4
R=Y+J
G=Y+K

Y は、符号無し整数で 0〜31 の範囲をとる値。
J, K は、2の補数による符号付き整数で -32〜31 の範囲をとる値である。
これを VRAM から読み出して、上記の式で変換して出力すればいい。

演算精度を意識して、変換式は下記のように変換して用いる。
B=(5*Y - (2*J + K))/4
R=Y+J
G=Y+K
上式の変位および演算がすべて整数で行われるものとして考えると、J/2やK/4を先に実施してしまうと、
JのLSB1bit, KのLSB2bit は、B に全く影響を及ぼさなくなってしまい、結果として出力の色数も減ってしまう。
それをかけるために、右シフト(/2や/4)は、最後にまとめる。

これらを踏まえて下記の回路図を作図した。

回路図


[▲上へ]