VRAMについて
VRAMとは
まずVRAMの前に、RAM(Random Access Memory)とはコンピュータ内の記憶装置(メモリ)の一種である。
同じメモリのひとつであるROM(Read Only Memory)は読み取りしかできないが、RAMは自由に読み書きできる。
プログラムのコードや変数の中身など、すべてRAMに記憶される。
しかし、コンピュータの電源を切ると情報はすべて失われてしまう。
それをふまえて、VRAM(Video RAM)は通常のRAMとは別にある、
MSXの画像情報を専門に扱うRAMである。
画像情報とはたとえば、文字のグラフィックパターンや色、スプライトのパターンや色
などである。要するに、VRAMの内容を書き換えると画面の表示が変化するのだ。
VRAMの内容はスクリーンモードによって変化する。
VRAMの中身を図にしたものをVRAMマップという。
BASICでは、VPEEK文で読み取り、VPOKE文で書き込みができる。
少し実験してみよう。
パターン・ジェネレータ・テーブル
次の例では、パターンの形状をいじってみる。
パターンの形状は、パターン・ジェネレータ・テーブルという領域に保存されているので、そのデータを変更する。
データパックによると、スクリーン1では、先頭アドレスは00000Hになっているぞ。
文字をレンガにする
1000 SCREEN 1 : WIDTH 32 : CLS
1010 FOR I=&H21 TO &H7E
1020 PRINT CHR$(I);
1030 NEXT
1040 FOR I=&H21 TO &H7E
1050 RESTORE 2000
1060 FOR J=0 TO 7
1070 READ A$ : D=VAL("&H"+A$)
1080 VPOKE I*8+J,D
1090 NEXT
1100 NEXT
2000 DATA FF,80,80,80,FF,08,08,08
実行結果
はじめは記号やアルファベットだった文字が、じわじわレンガパターンになっていきますよ。
キャラクタのパターンは8×8ドットで表現される。データ上では1列8ビット=1バイト×8行=8バイトで構成されているということだ。
なので、1キャラクタあたり8バイト必要なので、&H21番目のキャラクタのパターンは&h21×8したアドレスから始まることになる。
ということで、そこから8バイトのキャラクタパターンをVPOKEで書き換えているわけだな。
それじゃ、つぎ。
パターン・ネーム・テーブル
次の例では、画面の任意の座標に文字を表示してみよう。
BASICではLOCATE命令があるが、機能的にはそれとほぼ同じだ。
VRAMのパターン・ネーム・テーブルという領域に、どこの座標にどのパターンが表示されているか記憶されている。
データパックによると、スクリーン1では先頭アドレスは1800Hだ。
パターン・ネーム・テーブルでキャラクタ表示
1000 SCREEN 1 : WIDTH 32 : CLS
1010 FOR I=&H20 TO &H7E
1020 VPOKE &H1800+I,I
1030 NEXT
実行結果
VPOKE命令だけで、文字を表示しているね。
1800H+20Hの位置から、20H~7EHまでのキャラクタを表示している。
1800Hは座標にすると(0,0)、1801Hは(1,0)になる。
すると、1行は32文字なので(0,31)まで、1800H+20H(10進数では32)の座標は(0,1)つまり、2行目から20H~7FHまでのキャラクタを順番に、座標を増やしながら画面に表示しろということなのだ。
今度は逆に、任意の座標に表示されているキャラクタを調べてみよう。
パターン・ネーム・テーブルの値をVPEEKで読み取ればいいわけだな。
やってみよう。
例では、(0,2)の座標をしらべているよ。
パターン・ネーム・テーブルでキャラクタを知る
どうすか。
座標(0,2)は、64番目なので先頭アドレスに64を足している。
座標(0,2)に表示されているキャラクタは「@」なので、その結果は40Hなのだ。
疑り深いきみのために、40Hのキャラクタを表示させているぞ。もちろん結果は「@」だ。
とりあえず、ここまで。