前回は、MSX BASIC自作ゲーム作成のところで使った、
マシン語を2つ解説しました。
WebMSXでMSX BASICの自作ゲーム作成!第17弾。 マシン語部分を解説。その1 - ニャオニャオ21世紀
今回は後半の2つのマシン語の解説をしたいと思います。
(なお、このページだけでは理解できないと思います。今までの
MSX BASIC自作ゲーム作成、第1弾から読んでいただくのと、
MSXマシン語勉強レポートを最初から読んでくださいm(_ _)m。
大変ですが...)
980 DATA 21080211080A01A000CD4A0
0EBCD4D00EB23130B78B120F12108021
1081201A000CD4A00EBCD4D00EB23130
B78B120F1
985 DATA 21082211082A01A000CD4A0
0EBCD4D00EB23130B78B120F12108221
1083201A000CD4A00EBCD4D00EB23130
B78B120F1C9
このマシン語は何をやっているのかといいますと、
VRAMの一部を、別のVRAMの場所へコピーしています。
前回のマシン語が、メモリからVRAMへの書き込みでしたが、
今回はその書き込んだ値を、別の場所にコピーしています。
MSX1のVRAMは、画面の上段、中段、下段とそれぞれ値を
セットしないといけません。(多色刷り、SCREEN1.5の場合)
前回のマシン語は、上段に値を書き込んだので、今回はそれを、
中段、下段にコピーするというわけです。
マシンコードをアセンブラで書くとこうなります。
980行は、
LD HL , 0208 ... 210802
LD DE , 0A08 ... 11080A
LD BC , 00A0 ... 01A000
CD 00 4A ... CD4A00
EX DE , HL ... EB
CD 00 4D ... CD4D00
EX DE , HL ... EB
INC HL ... 23
INC DE ... 13
DEC BC ... 0B
LD A , B ... 78
OR C ... B1
JR NZ , F1 ... 20F1
順番に説明していきます。
LDは値を入れる命令でした。
HLに、0208を。
DEに、0A08を。
BCに、00A0を。
そして、
CD 004Aは、BIOSルーチンを呼び出しています。
004A番地は何かと言うと、
VRAMの値を読み込みます。(HLがアドレス、Aに値を入れます。使用レジスタAF)
ですので、
VRAMの0208番地の値をAレジスタに入れます。
EX DE,HLは、DEとHLの値を入れ替えるというもの。
CD 004Dも、BIOSルーチンを呼び出しています。
004D番地は、VRAMに値を書き込みます。(HLがアドレス、Aの値を書き込みます。
使用レジスタAF)
これは、VRAMの0A08番地の値にAレジスタの値を書き込みます。
さきほどVRAMの0208番地の値をAレジスタに入れていますので、
VRAM 0208番地の値を、VRAM 0A08番地へコピーしたことになります。
このときコピーしたのは、1バイトのみ。
それを書き換えた画像の分だけ、コピーします。
そして、ここででてくるのが、条件ループです。
EX DE , HLで、DEとHLの値を入れ替えます。(最初のに戻す)
INC HLで、HLの値にプラス1。
INC DEで、DEの値にプラス1。
DEC BCで、BCの値をマイナス1。
HLとDEを1づつ増やすのは、コピーするアドレスを
プラス1づつしていくことです。
(0208, 0209, 020A,020B,020C,......)
(0A08, 0A09, 0A0A, 0A0B......)
(なぜ、0208以降のアドレスなのかは、文字aのキャラクターコードが65で、
65*8=520、16進数で0208なのです。)
レジスタBCの値は、ループの回数が入ります。
LD A , B
OR C
JR NZ ,F1
この3行は、
ループの処理です。
JRは条件ジャンプです。
Zフラグが0のときにループします。
すこしややこしいのが、
Aレジスタが0の時、Zフラグは1、
Aレジスタが1の時、Zフラグは0となるところです。
この場合だと、Aレジスタの中身が0でなければ、
ループをし続けます。
(JR NZ はZフラグが0のとき、ループする)
JR NZ , F1
なので、F1、10進数で、-15戻ります。
この場合だと、CD 00 4A まで戻ります。
LD A , B
OR C
は、ループ条件の回数を判定しているのですが、
ORでBレジスタとCレジスタが0かどうか見ています。
(うっ、しまった;論理演算はまだやっていなかった。)
論理演算は、次回以降にやります。
今は、Bレジスタが00000000、Cレジスタが00000000のとき、
Aレジスタが0となり、Zフラグが1となるということだけ
そんなことをやっているんだなぁ〜と思っていただければ。
( BCが0になったら、ループが終わる)
残りのマシン語は、ほぼ同じです。
1箇所、アドレスが違います。
LD HL , 0208
LD DE , 1208
LD BC , 00A0
CD 00 4A
EX DE , HL
CD 00 4D
EX DE , HL
INC HL
INC DE
DEC BC
LD A , B
OR C
JR NZ , F1
VRAMの下段(画面の下段のキャラクターの形)へコピーしています。
985行は、色データをコピーしています。
(上段のデータを、中段、下段へ)
ループのところが少しややこしいですね。
マシン語コードは、この場合、最初の48文字がわかれば、
あとはほぼ同じです。
ほぼ同じのを4回繰り返しているだけです。
次回は最後のマシン語部分を解説します。
最後のは簡単です。メモリからVRAMへBIOSルーチンを使って
コピーするだけです。
お付き合い頂きありがとうございました。
それでは〜。
MSX BASICの情報はこちらへ^^