MSX2(以上)の発色をMSX1っぽくする
MSX1とMSX2以上のカラーは異なる
OpenMSXやWebMSXなどを使うとだいたい初期設定はMSX2以上になっています。MSX2+とかですね。
さて、実はMSX1とMSX2以上では発色が違います。
MSX2ではVDPが変わり、カラーパレットという概念が盛り込まれました。いわゆるRGBってやつです。
赤色、青色、緑色の発色がそれぞれ7階調で設定できるようになり、512色中16色を表現できるようになりました。
このことによってMSX1よりも多彩な発色ができるようになりました。
さて、問題はここからで。
MSX2以上ではデフォルトのカラーコードの色合い(発色)がMSX1のそれよりもちょっとギラついた発色になりました。
全体的にキツめのオラオラ的な発色となっていてMSX1のほんわか発色ではありません。
筆者は基本的にMSX1を対象としたプログラムしか作らないので、MSX1で綺麗な感じに作ったPCGやスプライトなどがMSX2の環境で動作させると「えー!?こんなにギラついた色はイメージしてないよー!」となることがしばしばです。前回作ったゲームをMSX1、MSX2それぞれのマシン環境で動かしてみると一目瞭然です。赤や青の発色がキツめ。
MSX2のほうは「90年代オタク」っていう感じの発色になっていて、ノスタルジー大好きな筆者はあまり好みではありません(個人の感想です)
MSX2のカラーパレットを書き換えてMSX1っぽくする
そこで、MSX2で動かしたときにカラーパレットの設定を書き換えてMSX1(っぽい)色に変更してしまおう。というテクニックがあります。
今回はその紹介の記事です。
今回はMSXPenでサンプルを作っています。
このコードでは、マシン語でカラーパレットを書き換えています。
Z80ASMのソースコードはこんな感じ。
org $D000
; BIOSルーチン(SUB-ROM用)
EXTROM:equ $015F ; SUB-ROMインタースロットコール
SETPLT:equ $014D ; カラーパレットの設定
; MSXのバージョン情報
MSX1FLG:equ $002D ; 0であればMSX1と判定する
;-------------------------------------------
; 画面カラーパレットの初期化
;-------------------------------------------
SetColorPalleteMSX1:
ld a, (MSX1FLG)
or a
; MSX1FLGが0であればMSX1と判定
ret z
; MSX1FLGが0でなければカラーパレットを変更する
ld hl, ColorPalleteData
ld b, 15
ld c, 0
; 15色ぶんループしてカラーパレットの値を
; ColorPalleteDataの内容に書き換える
ColorPalleteSetLoop:
;
; カラーパレットへの値書き込みを行う
; Dレジスタ:
; カラーコード
; Aレジスタ:
; 上位4ビット=赤のコード
; 下位4ビット=青のコード
; Eレジスタ:
; 上位4ビット=常に0000B
; 下位4ビット=緑のコード
; コード値は0-7(7階調)
;
ld d, c
ld a, (hl)
inc hl
ld e, (hl)
inc hl
; カラーパレット書き込みルーチン呼び出し
; SETPLTはSUB-ROMに格納されてあるため
; EXTROM経由で呼び出しを行う
ld ix, SETPLT
call EXTROM
; インタースロットコール時に
; InterruptがDisableになることがあるらしく
; 明示的にEnableにする
ei
inc c
ld a, c
cp b
jp nz, ColorPalleteSetLoop
ret
ColorPalleteData:
defb $00, $00 ; Color 0
defb $00, $00 ; Color 1
defb $11, $05 ; Color 2
defb $33, $06 ; Color 3
defb $26, $02 ; Color 4
defb $37, $03 ; Color 5
defb $52, $02 ; Color 6
defb $27, $06 ; Color 7
defb $62, $02 ; Color 8
defb $63, $03 ; Color 9
defb $52, $05 ; Color A
defb $63, $06 ; Color B
defb $11, $04 ; Color C
defb $55, $02 ; Color D
defb $55, $05 ; Color E
defb $77, $07 ; Color F
カラーパレットに設定するカラーコード値は0-7です(8段階、7階調、0は発色なし)
赤8x青8x緑8=512色というわけですね。
これをBASIC側でDEFUSRして呼び出し、カラーパレット変更後にBASICで文字を表示しています。
BIOSルーチン:SETPLTとその呼び出し
SETPLTというBIOSルーチンはSUB-ROMと呼ばれる場所に存在しているため、通常の呼び出し方では呼べません。そのためインタースロットコールという形でBIOSルーチンを呼び出しています。インタースロットコールについて、わかりやすいネタができたのでのちほど別記事で説明します。
MSXのバージョン番号を知る手掛かり
筆者はこれがわからずに悩んでました。
基本ROMの002D番地にその情報が存在していて、そのアドレスの値が0であればMSX、MSX2であれば1、MSX2+であれば2という感じになっていることを知り、それを使っています。
MSX1であればカラーパレットなんてものは存在しないので何もせずスルー。
MSX2以上であればカラーパレットを変更してMSX1っぽい設定にしているのが今回のASMのロジックになっています。
このバージョン番号でいろんなことが判別できる気がしますね。
ASMにはコメントを入れてるのでだいたいのことは理解できるかと思います。この小技(こわざ)を使うと前述したゲーム画面もMSX2では以下のように表示されます。100%MSX1の色にはなりませんが、初期状態のギラつきはかなり軽減された状態になっていることがわかると思います。
とりあえず試してみて!
MSXPenでは画面の右ペインにWebMSXが同梱されているので、Machine設定をMSX1とかMSX2とかに切り替えてみてください。なんとなくイメージはつかめるかと思います。
ということで、今回の記事は
「MSX2なんだけどMSX1っぽい、やんわり発色にしてしまう企画」
でした!
では、また!ノシ
オマケ:なつかしCM
アカ、ミドーリ、アオ、グンジョイーロ、キレイ。