VRAMについて

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のキャラクタを表示させているぞ。もちろん結果は「@」だ。

とりあえず、ここまで。