ニャオニャオ21世紀

レトロゲーム(MSX、PCエンジン、セガサターン)と、MSXぽいアプリ開発と、最新ゲーム(PS4、SWITCH)、身体(身体意識など)、ライフハックほか雑記を綴っています

MSXマシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第13回 メモリからVRAMへブロック転送 LDIRVM

スポンサーリンク

 

ブロック転送というのは、いっぺんに大量のメモリの内容を、

別のメモリのアドレスに写すというものです。

 

コレができると、マップの画面切り替えとか、

そういったことができるようになります。

 

マシン語ではこれが一番やりたいんですよね〜。

BASICでは絶対に不可能なので。

 

前回のページです。

www.nyaonyao21.com

 

 LDIRVM   メモリからVRAMヘブロック転送する

BIOSルーチンのLDIRVM(&H005C)コールするだけで、

メモリからVRAMへブロック転送してくれます。

ただ、どのデータをどこへコピーするかが分からないとできません。

そこであらかじめレジスタにその値を入れておきます。

 

 レジスタ HL  転送元のメモリの先頭アドレス

 レジスタ DE  転送先のメモリ(VRAM)の先頭アドレス

 レジスタ BC  転送するメモリ内容の数(バイト)

 

(以下の、具体的なマシン語なのですが、

 MSX FANの方がわかりやすいのでそちらを参考にします。)

 

  中古ゲーム雑誌MSX・FAN 1991年6月号

<駿河屋> 

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が載っています)

 

www.nyaonyao21.com

 

 まとめ

今回は、メモリからVRAMへのブロック転送でしたので、

画面を一瞬でパッと表示することに使えると思います。

よくゲームで画面の端にいったら、隣の画面がパッと出てくる

というのがあると思いますが、それが出来ます。

 

BASICでやっていると、上から下へ順番に画面が描かれていくのが

わかってしまうんですよね。

それが一瞬で出来るというのは非常にありがたいです!

 

次回はVRAMからメモリへのブロック転送をやります。

スクロールをさせるのには、今回と次回やるのの両方が必要となります。

(追伸:よくよく考えると、別に今回のだけでもスクロールは出来るような気がします;)

 

BASICとマシン語の併用では、スクロールのアクションゲームは

無理なんじゃないかなぁと思っています。

実際にはハイドライドの画面切り替え時にスクロールするようなものとか、

ドラクエのようなアクション性のないRPGのスクロールに使うのでは

ないでしょうか。

 

画面を小さく使えばロマンシアのようなゲームもできるのかな?

 

夢は広がります!

 

 

 

www.nyaonyao21.com

 

「ニャオニャオ21世紀は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。」

当サイトは第三者配信の広告サービス「Google Adsense グーグルアドセンス」を利用しています。 広告配信事業者は、ユーザーの興味に応じた広告を表示するためにCookie(クッキー)を使用することがあります。 Cookie(クッキー)を無効にする設定およびGoogleアドセンスに関する詳細は「広告 – ポリシーと規約 – Google」をご覧ください