読者です 読者をやめる 読者になる 読者になる

MSX-BASICのVPOKE命令で遊ぼう

※この記事はMSX Advent Calendar 2015の9日目の記事です。

www.adventar.org

こんにちは、sunflatです。 好きなMSX-BASICの命令はVPOKE命令です。

というわけで、今日はVPOKE命令で遊んでみましょう。

VPOKE命令とは

VPOKE命令は、VRAMにデータを直接書き込むための命令です。

MSXは画面表示のためにVDP(ビデオ・ディスプレイ・プロセッサ)というグラフィックチップを搭載しており、このVDPで使われるメモリがVRAMです。例えばMSX1規格の場合、16KBのVRAMが搭載されています。

VRAMにデータを書き込むことにより、フォント(文字の形状)のデータ、画面の表示内容、スプライト(画面上に表示されるキャラクター)の画像などを変更できます。

フォントのデータを変更してみる

今回は、フォントのデータを変更して遊んでみることにします。

早速プログラムを入力していきましょう。AUTO命令を使うと、行番号を10刻みで自動で振ってくれるので便利ですね。

f:id:sunflat:20151209081854p:plain

このプログラムは、フォントの画像データを、右に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命令で実行してみましょう。 f:id:sunflat:20151208201305p:plain

…。

…あれ、MSXってこんなに遅かったかな?

そういえば、MSX-BASICの変数は、デフォルトでは浮動小数点型なのでした。変数の型を整数型にして、少し高速化してみましょう。

行番号を15にすれば、10行と20行の間に挿入されます。

f:id:sunflat:20151208204003p:plain

再び実行!

f:id:sunflat:20151208211955p:plain

おおー、文字が太くなりました。成功です。

今度は、少しアレンジしてみて、文字の上側4ピクセルはそのままで、下側4ピクセルだけを太くしてみましょう。30行の J=0J=4に修正するだけです。

f:id:sunflat:20151208212542p:plain

再び実行!

f:id:sunflat:20151208212947p:plain

レトロな感じのフォントになりましたね。

次は、フォントの画像データを右にずらす量を、1ピクセルではなく2ピクセルにしてみます。

30行を元に戻し、60行のB ¥ 2B ¥ 4にするだけです。

f:id:sunflat:20151208213558p:plain

再び実行!

f:id:sunflat:20151208213805p:plain

飾り文字っぽい、おしゃれなフォントになりましたね。

最後に、縦1ピクセルごとに、太くする行と太くしない行を繰り返す感じでアレンジしてみます。

60行を元に戻し、30行の末尾にSTEP 2をつけるだけです。

f:id:sunflat:20151208213946p:plain

再び実行!

f:id:sunflat:20151208214031p:plain

文字がいい感じにかすれて、歴史を感じさせるフォントになりましたね。

まとめと発展

というわけで、VPOKE命令を使ってVRAMを書き換えることにより、フォントのデータを変更するテクニックを紹介しました。

もう少し高度なテクニックを使うと、フォント1文字の縦1ピクセル分(横8ピクセル)ごとに、描画色と背景色を変えたりすることもできます(通称、多色刷りモード)。

これを使うと、VRAMに文字コードを書き込むだけで、一見カラフルな画像を(1ピクセルづつ描画する場合と比較して)高速に表示することができ、MSX向けのゲームの背景描画などでよく使います(参考)。

というわけで、MSX-BASICでゲーム等を作る時には、VPOKE命令を活用して表現の幅を広げていきましょう!