MSX


MSX2+ V9958の自然画モード(YJK方式)の解説



MSXの歴史はVDPの歴史といっても過言ではない。
2+以降のMSXに搭載されているVDPであるV9958には、YJK方式により1万9268色を同時発色する自然画モードがある。
ちなみにMSX2のV9938では256色表示が最高。
MSX2とMSX2+のVRAM容量はどちらも同じ128KBであり、そのままではこのような飛躍的に同時発色数を増やすことは不可能と思われる。
一体どのような仕組みで1万9000色を超える色数を実現しているのだろうか。

結論から言うと、表示する画像データを約15分の8に圧縮してVRAM内に置いている。
この自然画モードでは、4dotを32bitで表現する。
しかし単純に1dotが8bitという対応ではない。

32bitをまず20bitと12bitに分ける。
20bitで輝度情報を、12bitで色差情報を表す。

輝度情報の20bitはさらに5bitずつ4つに分けられる。
これで4dot分それぞれ32階調の輝度になる。

色差情報の12bitは6bitずつ2つに分けられる。
最初の6bitで赤の色差情報、2の補数付きで-32~31の64階調。
残りの6bitで緑の色差情報、2の補数付きで-32~31の64階調となる。
赤・緑の色差情報から計算して、青の色差情報を2の補数付きで-24~23の48階調を得る。
色差情報は4dot毎にしか指定できないという制限がある。
この4dot毎(4dotひとまとめ)という制限と、青の色差情報をデータの中に持たないという点で、圧縮がかかることになる。

展開時にRGB各々の値を求める計算式は以下の通り。

R=輝度+赤の色差
G=輝度+緑の色差
B=輝度×1.25-(赤の色差×2+緑の色差)×0.25


赤&緑の色差と青の色差は排他的に働き、赤と緑の色差がマイナスに振れるほど、青が強くなる。
計算式から分かるように、緑の色差の変化より赤の色差の変化のほうが、青成分に対して2倍敏感に働く。
これは輝度が同じでも、人間の目は 緑→赤→青 という順で明るく見える特性があるため、それを補正していると思われる。

以上のことから、輝度(明るいか暗いか)は1dot毎に指定できるが、色差(何色系かという色合い)は4dot毎にしか指定できないことが分かる。
人間の目は、色差よりも輝度に対して敏感に出来ているので、よく見るとギザギザした感じの絵になってしまうわけだが、よく見なければあまり分からない程度の画像になる。
もしこれが逆で、色差が1dot毎で輝度が4dot毎であったとすると、ギザギザしすぎてとても見られた画像ではなくなってしまう。

また計算式の特性から、色差を固定すると輝度が高いところでは青が強く、輝度が低いところでは青は弱くなる傾向がある。
結果、展開された画像は、明るい部分がやや青っぽく、暗い部分がやや黄色っぽく見えることになる。
このような特徴を持った画像は、通常の画像よりも人間の目には美しく見えるため、赤や緑ではなく青にこの計算式を持ってきたのはそれを考慮に入れたためだと思われるが、そもそもデータに存在しない青の色差を赤と緑の色差から求めているので、少し強引な方法ともとれる。
ちなみにこの計算式を赤に用いると、明るい部分はやや赤っぽく、暗い部分はやや水色っぽく見えるようになり、緑に用いると、明るい部分はやや緑っぽく、暗い部分はやや紫っぽく見えるようになる。
計算式を用いず、赤・緑・青すべての色差情報を持てばこのようなジレンマはなくなるが、それだとVRAMが足りなくなる。

この圧縮された状態でデータをVRAM内に保存しておき、これをVDP(V9958)が毎秒60コマでリアルタイムに展開しながら表示すれば自然画モードが実現できる。
この方式で表現できる理論上の色数は、単純に「5bit+12bit=17bit つまり 13万1072色」というわけにはいかない。
計算式の中に足し算・引き算、さらに小数点を含む掛け算が存在するためだ。
さらに同じ色を表すのに複数の組み合わせが存在し、そして小数点以下は無視される。
RとGはそれぞれ32階調なので、5bit(31)を超える桁あふれは丸め込まれて31となり、0未満のマイナスも丸め込まれて0となる。
Bは24階調程度で表現することになる。(輝度が25.6、色差が24)
ビット数に換算すると約4.58bitであり、4.58bitを超える桁あふれが丸め込まれて23程度となり、0未満のマイナスも丸め込まれて0となる。
ということで、R階調×G階調×B階調=32×32×24=2万4576色が同時発色可能という計算になる。
しかし実際には、VDPの仕様なのかNTSC出力の限界なのか、ハードウェアの制約のために結果同時発色数は1万9268色となってしまう。

これによりVRAM容量はMSX2と同じ128KBという中で、1万9000以上の同時発色を実現している。





[ 戻る ]