ブロック転送というのは、いっぺんに大量のメモリの内容を、
別のメモリのアドレスに写すというものです。
コレができると、マップの画面切り替えとか、
そういったことができるようになります。
マシン語ではこれが一番やりたいんですよね〜。
BASICでは絶対に不可能なので。
前回のページです。
LDIRVM メモリからVRAMヘブロック転送する
BIOSルーチンのLDIRVM(&H005C)コールするだけで、
メモリからVRAMへブロック転送してくれます。
ただ、どのデータをどこへコピーするかが分からないとできません。
そこであらかじめレジスタにその値を入れておきます。
レジスタ HL 転送元のメモリの先頭アドレス
レジスタ DE 転送先のメモリ(VRAM)の先頭アドレス
レジスタ BC 転送するメモリ内容の数(バイト)
(以下の、具体的なマシン語なのですが、
MSX FANの方がわかりやすいのでそちらを参考にします。)
<駿河屋>
MSX FAN 1991年6月号に詳しく載っています。
リスト
LD HL, (F7F8H)
LD DE, 1800H
LD BC, 0300H
CALL LDIRVM
RET
説明:
LD HL, (F7F8H)
これは、次の2バイトが指し示すアドレスにある数値を
HLレジスタにセットします。
&HF7F8そのものをセットするのではないところが味噌ですね。
アドレス&HF7F8に入っている値です。
これがややこしい!
HLレジスタは、転送元のメモリの先頭アドレスをいれるのでした。
&HF7F8はなにかといいますと、BASICのUSR関数の引数が入っている
アドレスとなります。(MSX FANではそう書いてある)
具体的にマシン語で書くと
&HD000 2A
&HD001 F8
&HD002 F7
(プログラムに書く時は先頭のアドレスは書きません。 2AF8F7と書いていきます)
よくマシン語のプログラムに16進数が載っていますね。
LD DE, 1800H
次の2バイトの数値をDEレジスタにセット。
DEレジスタは、転送先のメモリ(VRAM)の先頭アドレスいれるのでした。
VRAMの、&H1800以降は画面のデータ(パターン名称テーブル)が
入っているアドレスです。
画面を描き変えるためにDEレジスタにセットします。
&HD003 11
&HD004 00
&HD005 18
LD BC, 0300H
次の2バイトの数値をBCレジスタにセット。
BCレジスタは、転送するメモリ内容の数(バイト)が入ります。
&H0300は10進数でいうと、768です。
768バイトはscreen1の1画面分のデータ量をさします。
X座標32文字 x Y座標24文字 x 1バイト(1文字) = 768バイトです。
&HD006 01
&HD007 00
&HD008 03
CALL LDIRVM
メモリからVRAMへブロック転送するBIOSルーチンを呼ぶ
&HD009 CD
&HD010 5C
&HD011 00
CDがコールで、&H005Cのアドレスを呼ぶと、LDIRVMが
呼ばれます。
RET
リターンです。メインルーチンに戻る。
&HD012 C9
BASICプログラムからマシン語を使う場合は、
C9
で、BASICプログラムに戻っていきます。
雑誌に載っているサンプルプログラムもC9が出てきたら、
そこまででがサブルーチンなんだなとわかります。
BASICではDATA文にいれて使います。
DATA 2AF8F7110018010003CD5C00C9
という風にです。
おお、今まで全くの意味不明だったマシン語が少しづつわかってきました!
なお、ハンドアセンブルしておりますが、
こちらの表を参考にしてください。
(16ビットのLDが載っています)
まとめ
今回は、メモリからVRAMへのブロック転送でしたので、
画面を一瞬でパッと表示することに使えると思います。
よくゲームで画面の端にいったら、隣の画面がパッと出てくる
というのがあると思いますが、それが出来ます。
BASICでやっていると、上から下へ順番に画面が描かれていくのが
わかってしまうんですよね。
それが一瞬で出来るというのは非常にありがたいです!
次回はVRAMからメモリへのブロック転送をやります。
スクロールをさせるのには、今回と次回やるのの両方が必要となります。
(追伸:よくよく考えると、別に今回のだけでもスクロールは出来るような気がします;)
BASICとマシン語の併用では、スクロールのアクションゲームは
無理なんじゃないかなぁと思っています。
実際にはハイドライドの画面切り替え時にスクロールするようなものとか、
ドラクエのようなアクション性のないRPGのスクロールに使うのでは
ないでしょうか。
画面を小さく使えばロマンシアのようなゲームもできるのかな?
夢は広がります!