MSX2/2+やOpenMSXでMSX1風パレットを使おう(2020/04/07 05:45更新)

MSX2/2+でパレットをMSX1風にしてみました。






1枚目:MSX2の色
2枚目:MSXPLAYer:MSX1をMSX2でパレット再現した物
3枚目:BlueMSX:MSX1動作時の色(TMS-9928A)
4枚目:改造版BlueMSX:MSX1動作時の色(TMS-9918A)
5枚目:MSX2上で自作MSX1風パレットを使用した物

MSX1のVDPであるTMS-9918Aの色は、MSX2以降と全然違います。
参考:http://www.purose.net/befis/halloffame/msx_col/

MSX1用に作られたゲームをMSX2で表示すると、かなり色がキツくなりがちだと思います。
これはSC1000のゲームをマスターシステムで表示した時などにも起こる問題だそうです。

TMS9918Aという映像チップの頃はRGB出力ではなく
色の生成方式が違うため、各自の環境で見え方が違う事もあります。

さて、MSX2でMSX1っぽい色を表示したい場合はどうするかというと、
パレット機能を使用します。
しかし、MSXではRGB各3bitしかないので、
MSX2実機でどうにかしようとすると細かい調整は難しいです。

なにか良いものはないかと
自分の感覚で一番しっくりくるパレットデータが無かったので探しましたが、
無かったので作りました。

■ パレットの一覧とパレット値まとめ




2020/04/07 test-3d追加
2020/04/14 誤字修正 9188→9918、BlueMSXのパレット名を99x8に変更


MSX用のパレット値は後でテキストでも書いておきます。

TMS-9918AとTMS-9928Aで目立つ違いは7,8,9,10の色でしょうか。
9918のほうが、水色は抑えめ、赤系も抑えめ。黄色は少し緑寄り。

(自分はMSX2+が出るころまでMX-101を使っていたので、9918の色での思い出が強めです。)


■ OpenMSXのTMS9918出力エミュレーション

OpenMSXはそのままだとRGB出力したかのような色になりますが、Machine設定ファイルを編集することによってTMS9918映像出力回路から出力されるくすんだ色を再現可能です。

調整はmachinesフォルダの*.xmlファイルをテキストエディタで開き、VDPタグに saturation、saturationPr、saturationPb の指定を追加することで可能です。(基本的にはsaturationの指定だけで良いかと思います)

例)OpenMSX\share\machines\Casio_MX-101.xml
    <VDP id="VDP">
      ....
      <saturation>50</saturation>
    </VDP>

 

① saturation無し(デフォルト)
f:id:uniskie:20210907003813p:plain

② saturation 75%
f:id:uniskie:20210907003801p:plain

③ saturation 50%
f:id:uniskie:20210907003742p:plain

MX-101の実機に近いのはsaturation 50%でしょうか。


■ blueMSXのパレット
(訂正:3ビット精度では再現できませんでした)

BlueMSXはTMS-9928Aとして公開されいてるパレット値と同じもののようです。



参考:
https://atariage.com/forums/topic/262599-palette-fixes-for-colem-adamem-and-classic99/

TMS-9918Aに比べて鮮やかな色になっています。
そのため、逆に自分が違和感を感じる原因にもなっています。
(綺麗ですけどね)

TMS-9918A:内部的にもNTSC信号で色を生成。計算式的に純色に近い色は出せないため、全体にくすんだ色になる。(色味が混色気味になる)

TMS-9928A:RGB相当の色差信号に対応。9918とは計算式自体が違う。純色に近い色に変更された。

もしかすると、BlueMSXのパレットを9928から9918に変更したら、自分的に一番満足なのかもしれない。

ということで、BlueMSXにTMS-9918Aカラーを追加しました。
 ↓
BlueMSX 3.9.0β TMS-9918Aカラー対応版作りました。(PrivateBuild )

uniskie.hatenablog.com

(OpenMSXならプログラム改造しなくてもいいんですけどね…)

TMS-9928A(従来)


TMS-9918A(追加分)

結構満足のいく結果になりました。
よければ使ってみてください。

MSXPLAYerのパレット

Mマガ永久保存版MSXPLAYerのMSX1用ゲームでは、
MSXに合わせて3bit精度パレットで再現しているとのことです。




こちらは、彩度を上げたTVの色のようで、これはこれでありだと思います。
(一部の色の組み合わせが見づらいこともあります)

このあたりは好みや環境による感覚の違いがあると思うので、
各自この記事を参考に、好きなものを選んだり、
調整してみて貰えれば良いかと思います。

■ NandemoMSXPAL

他に、「なんでもMSXPAL」という汎用性の高いツールがあります。http://www.tiny-yarou.com/ndmsxpal.html

MSX用のゲームはサブロムのINIPALを呼ばないので、事前にパレットを弄ればそのままのパレットで動作することを利用したものになります。

こちらは8bit精度パレットデータを3bitに丸め込んで実機側のパレットに変換します。
最終的には3bit精度になるので微調整には限界があり、各自調整してくださいとのことです。

調整したい場合は、パレットを変更・確認するための実機ツールを作成したほうが早そうです。


ということで、V9938/9958パレットでMSX1風を再現するための
パレット調査過程を記事にまとめました。

1chipMSXやエミュレーターの場合BIOSROMを書き換えられるので、
直接書き換えてしまえば気に入った色で気軽に起動できるようになるのもメリットです。

よければどうぞ。

■ パレットデータの形式

MSXのパレットデータは1色2バイトで、
順番に R*16+B、G の並び(RB 0G)で構成されています。
各パレット値は0~7の範囲です。

例)黒0000、白7707、赤7000、青0700、緑0007、黄7007、水色0707、紫7700

MSX2のSUBROMにある初期化パレットデータ


MSX2ではSUBROMの$141にあるINIPALを呼び出してパレットを初期化していますが、
この時のパレットデータはSUBROM$1055にあります。
内容は 2バイト*16色のデータで

0000 0000 1106 3307 1701 2703 5101 27067101 7303 6106 6406 1104 6502 5505 7707

です。

1CHIPMSXやエミュレーターであれば、ROMイメージの該当箇所を書き換えれば、
パレットの初期化値を変更できます。

ターボRでも、上のパレットデータをバイナリエディタで検索して
該当箇所を書き換えれば行けるんじゃないかと思います。

■ 自分の気に入ったデータ

自分の感覚で一番しっくりきたパレットデータ

2020/04/07現在

0000 0000 3305 4406 3702 4703 5203 3605
6203 6304 5306 6406 2104 5503 5505 7707

一覧のTest-3dのデータになりました。

この辺は好みですが、透明感とくすみのある色が好きなので。
カラー10番の黄色の輝度を合わせようとすると3bか3cの2択になるかなと思います。
9918が好きな自分的に3cのオレンジはないので、選んだのは3bになりました。
その後、賢者の石などを遊んだ際に6の暗い赤がきつかったので、
もう一段階くすませて、3dになりました。

もちろん、黄色味を優先するなら既存の他のパレットが良いかもです。

何度か修正を繰り返しましたが、
数値を1弄るとどう変わるかのサンプルを載せておきます。

カラー8修正前(test-3)



カラー8修正後(test-3a)



カラー6と8修正後(test-3b)



カラー6修正後(test-3d)


淡い感じを優先して最終的にこうなりました。

数値が1違うだけで大違い。難しいねー。

ちなみに、1chipMSXのS端子/AV端子出力だと色が微妙に変わります。
(黄色が少し赤っぽくなる)
VGA出力だとエミュレーターで見るのと同じ色になります。

当時のMSX1でTMS-9918Aを使用していたもので
実際にRGBで出力されたものは存在しないので、
基本的に好みで微調整する感じでしょうね。


テストショット色々。(※test-2の画像)



パロディウス



順にBlueMSX(TMS-9928A)、MSXPLAYerパレット、
BlueMSX改(TMS-9918A)、自作パレット(3d)

ガルフォース



順にBlueMSX(TMS-9928A)、MSXPLAYerパレット
BlueMSX改(TMS-9918A)、自作パレット(3d)

MSXPLAYerMSX1向けパレットはなんかエロくていいですね。

TMS-9918のように黄色を緑に寄せると冷たい感じで透明感が出ます。
緑ではなくオレンジに寄せると温かい鮮やかさが出ます。(TMS-9928等)

モニタ側の色彩表現力が上がっている現代に合わせるなら、後者の方が見やすい事でしょう。

MSXのTMS-9918Aに一番近い色で動かしたい場合は、
改造版BlueMSXを作ったのでそちらを使ってみてください。
エミュレータ側の8bit精度のパレットで再現しているのでかなり近いかと思います。

MSX2以上の実機でMSXっぽい色にしたい場合は、
パレット精度の限界があるので、
自分で調整して好みのものを選ぶのが良いと思います。

実機でのパレット再現(Test-3d)




blueMSX改でのTMS-9188A再現(ベスト)




test-3dパレットは結構淡い感じを優先して調整した物です。
賢者の石(1~4枚目)なんかは良い線行ってると思います。

ハーベルの塔(最後の画像)は、
実機MSX1だと綺麗に馴染んでいるのに対して、
test-3dでは壁の黄色が浮いて見えるのは残念です。
このあたり、3bit精度のパレットでの再現は厳しいです。
せめて4bit精度あれば…。

ということで、実機のパレットで再現する場合は、
自分なりのコンセプトを考えて、
どこを諦めてどこを優先するか決めていく事になりますね。

■パレット値の一覧

MSX2
0000 0000 1106 3307 1701 2703 5101 2706
7101 7303 6106 6406 1104 6502 5505 7707

MSXPLAYer再現
0000 0000 2305 0105 2602 3703 5202 1606
7202 7303 5205 6305 1204 5502 5505 7707

BlueMSX風チャレンジ
0000 0000 1205 4306 2602 3703 5202 2706
6203 7304 5205 6406 1204 5503 5505 7707

MSX1風-1(ボツ)
0000 0000 2205 3306 2602 4703 4202 3605
6202 6304 6306 7406 1204 5503 5505 7707

MSX1風-2(ボツ)
0000 0000 2205 3306 2603 4703 4202 3605
6202 6304 5306 6406 1204 5503 5505 7707

MSX1風-3a(ボツ)
0000 0000 3305 4406 2602 4703 4202 3605
5102 6304 5306 6406 2104 5503 5505 7707

MSX1風-3b 緑金(マイベスト1)
0000 0000 3305 4406 2602 4703 5202 3605
6203 6304 5306 6406 2104 5503 5505 7707

MSX1風-3c 赤金(なんか違う)
0000 0000 3305 4406 2602 4703 5202 3605
6203 6304 6305 6406 2104 5503 5505 7707

MSX1風-3d 緑金かつ淡い茶色(マイベスト2)
0000 0000 3305 4406 3702 4703 5203 3605
6203 6304 5306 6406 2104 5503 5505 7707

■参考:blueMSX vdp.c内の定義

■ TMS99x8A指定時の色
static struct {
int r;
int g;
int b;
} msx1Palette[16] = {
// TMS9928A
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 62, 184, 73 },
{ 116, 208, 125 },
{ 89, 85, 224 },
{ 128, 118, 241 },
{ 185, 94, 81 },
{ 101, 219, 239 },
{ 219, 101, 89 },
{ 255, 137, 125 },
{ 204, 195, 94 },
{ 222, 208, 135 },
{ 58, 162, 65 },
{ 183, 102, 181 },
{ 204, 204, 204 },
{ 255, 255, 255 }
};


■ BlueMSX改で追加したTMS-9918Aの色
static struct {
int r;
int g;
int b;
} msx1Palette_9918a[16] = {
// TMS9188A
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 79, 176, 69 },
{ 129, 202, 119 },
{ 95, 81, 237 },
{ 129, 116, 255 },
{ 173, 101, 77 },
{ 103, 195, 228 },
{ 204, 110, 80 },
{ 240, 146, 116 },
{ 193, 202, 81 },
{ 209, 215, 129 },
{ 72, 156, 59 },
{ 176, 104, 190 },
{ 204, 204, 204 },
{ 255, 255, 255 }
};

 

■ 値の検証・調整に使ったプログラム

1 DEFINTA-Z:CLEAR500:LM=191
10 SCREEN2:BLOAD"hyd3msx1.sr2",S
20 LINE(0,LM-32)-(255,LM),1,BF
30 FOR I=0 TO 15:LINE(I*16,LM-31)-(I*16+14,LM),I,BF:NEXT
40 IF INKEY$="" THEN 40
50 GOSUB 500:GOTO40
500 READ A$
510 IF A$="" THEN 540
520 FOR I=0 TO 15:J=I*5:COLOR=(I,VAL(MID$(A$,J+1,1)),VAL(MID$(A$,J+4,1)),VAL(MID$(A$,J+2,1))):NEXT
530 RETURN
540 RESTORE 1000:COLOR=NEW:RETURN
1000 DATA "0000 0000 3305 4406 3702 4703 5203 3605 6203 6304 5306 6406 2104 5503 5505 7707"
1010 DATA "0000 0000 2305 0105 2602 3703 5202 1606 7202 7303 5205 6305 1204 5502 5505 7707"
1020 DATA "0000 0000 1205 4306 2602 3703 5202 2706 6203 7304 5205 6406 1204 5503 5505 7707"
1030 DATA "0000 0000 3305 4406 2602 4703 5202 3605 6203 6304 6305 6406 2104 5503 5505 7707"
1040 DATA "0000 0000 3305 4406 2602 4703 5202 3605 6203 6304 5306 6406 2104 5503 5505 7707"
1050 DATA""

起動するとデフォルトパレットで表示、

Dataは1行ごとに16色ワンセットになっていて、
キーを何か押すと順番に読み込みます。
Data分に空文字列があるとデフォルトパレットに戻します。

現状の並びは、MSXPLAYerパレット、BlueMSX(9928)風だけど濃くなり過ぎたパレット、自作パレットTest-3c、自作パレットTest-3bの順。

パレットデータはVDP用のデータの並びになっています。
(RB0G。それぞれ0~7の範囲)

実際にはエミュレータスクリーンショット
BMP2MSXでSR5やSR2データに変換し、
それを表示して確認したりすると分かりやすいです。


違和感の出ない組み合わせとなると限られますが、
多少違和感があっても良ければ、割と色々な選択肢があるかと思います。
弄ってると面白いです。