ニャオニャオ21世紀

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

WebMSXでMSX BASICの自作ゲーム作成!第18弾。 後半のマシン語部分を解説。その2

スポンサーリンク

前回は、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ルーチンを使って

コピーするだけです。

 

お付き合い頂きありがとうございました。

それでは〜。

 

 

 

 

 

 

 

 

 

 

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

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