MSX-BASICのVPOKE命令で遊ぼう
※この記事はMSX Advent Calendar 2015の9日目の記事です。
こんにちは、sunflatです。 好きなMSX-BASICの命令はVPOKE命令です。
というわけで、今日はVPOKE命令で遊んでみましょう。
VPOKE命令とは
VPOKE命令は、VRAMにデータを直接書き込むための命令です。
MSXは画面表示のためにVDP(ビデオ・ディスプレイ・プロセッサ)というグラフィックチップを搭載しており、このVDPで使われるメモリがVRAMです。例えばMSX1規格の場合、16KBのVRAMが搭載されています。
VRAMにデータを書き込むことにより、フォント(文字の形状)のデータ、画面の表示内容、スプライト(画面上に表示されるキャラクター)の画像などを変更できます。
フォントのデータを変更してみる
今回は、フォントのデータを変更して遊んでみることにします。
早速プログラムを入力していきましょう。AUTO命令を使うと、行番号を10刻みで自動で振ってくれるので便利ですね。
このプログラムは、フォントの画像データを、右に1ピクセルずらしたものと重ね合わせることにより、文字を太くします。(ついでに結果表示のため、全ての文字を画面に表示)
MSXのSCREEN 1(画面モード)では、文字の画像は8x8ピクセルです。横8ピクセルを1バイトで表現し、それが縦8ピクセル分続くため、フォントのデータは1文字あたり8バイトで表現できます。
VRAMの先頭(0番地)から、各文字8バイトづつ、256文字分のフォントのデータが格納されています。これを書き換えています。
プログラムの簡単な解説
20行では文字コード(変数I)に対するFORループ、30行では文字の画像の縦座標(変数J)に対するFORループを開始しています。
40行ではVRAMのアドレスを計算し、50行ではVPEEK関数を使って現在のフォントデータを1バイト読み込み、60行では現在のフォントデータ(横8ピクセル分)を右に1ビットシフト(2で整数除算)してORを取った結果を、VPOKE命令を使って再び元の場所に書き込んでいます。
90行では、結果を表示するために、画面に全ての文字を表示しています。VRAMの&H1800番地以降には、画面に表示する文字の文字コードが格納されています(&Hは16進数を表す。&H1880番地は画面5行目に相当)。
実行
早速、RUN命令で実行してみましょう。
…。
…あれ、MSXってこんなに遅かったかな?
そういえば、MSX-BASICの変数は、デフォルトでは浮動小数点型なのでした。変数の型を整数型にして、少し高速化してみましょう。
行番号を15にすれば、10行と20行の間に挿入されます。
再び実行!
おおー、文字が太くなりました。成功です。
今度は、少しアレンジしてみて、文字の上側4ピクセルはそのままで、下側4ピクセルだけを太くしてみましょう。30行の J=0
をJ=4
に修正するだけです。
再び実行!
レトロな感じのフォントになりましたね。
次は、フォントの画像データを右にずらす量を、1ピクセルではなく2ピクセルにしてみます。
30行を元に戻し、60行のB ¥ 2
をB ¥ 4
にするだけです。
再び実行!
飾り文字っぽい、おしゃれなフォントになりましたね。
最後に、縦1ピクセルごとに、太くする行と太くしない行を繰り返す感じでアレンジしてみます。
60行を元に戻し、30行の末尾にSTEP 2
をつけるだけです。
再び実行!
文字がいい感じにかすれて、歴史を感じさせるフォントになりましたね。
まとめと発展
というわけで、VPOKE命令を使ってVRAMを書き換えることにより、フォントのデータを変更するテクニックを紹介しました。
もう少し高度なテクニックを使うと、フォント1文字の縦1ピクセル分(横8ピクセル)ごとに、描画色と背景色を変えたりすることもできます(通称、多色刷りモード)。
これを使うと、VRAMに文字コードを書き込むだけで、一見カラフルな画像を(1ピクセルづつ描画する場合と比較して)高速に表示することができ、MSX向けのゲームの背景描画などでよく使います(参考)。