今回はサブルーチンの呼び出し方と、戻り方です。
命令自体はとても簡単です。
CALL と RET
です。
BIOSのところでも出て来ました!
BASICでいうところの
GOSUB ~ RETURN
に当たります。
スポンサーリンク
サブルーチンを呼び出すのは、
マシン語からマシン語のサブルーチンを呼ぶ時は CALL
BASICからマシン語のサブルーチンを呼ぶ時はUSR関数
です。
今回のCALLですが、あとにサブルーチンの入っている先頭メモリの
アドレスが入ります。
CALL D000H
などと書き、
サブルーチンの最後に
RET
と書き、CALL以下に戻って来ます。
ここまではBASICのGOSUB~RETURNとほぼ同じですね〜。
それで、少し困るのが、サブルーチンのアドレスをどうするかです。
マシン語は、メモリの連番で、命令などを入れていくので、
適当にサブルーチンの開始アドレスを決めるわけにはいかないみたいです。
そこでニーモニックでプログラムをする場合は、
サブルーチンに名前をつけます。それをラベルといいます。
例:サブルーチン
KEISAN: LD A , (HL)
ADD A , 8
INC HL
LD (HL) , A
…
RET
この場合は KEISANがサブルーチンの名前です。
サブルーチンを呼び出す時は
CALL KEISAN
などとやります。
マシンコード
CALL CD
RET C9
CDのあとは、アドレスが入ります。
CALL D218H なら CD 18 D2
となります。
(16ビットであるアドレスは、上位、下位が入れ替わります。LDのところで説明しております。)
他にも条件コール命令、条件リターン命令というのがあるみたいですが、
勉強本の今回のページには説明がありませんでした。
もう少し先に載っているそうです。
この勉強本には、ハンドアセンブルする時の方法が書いてありました。
実際のマシンコードにするときは、
CALLのあとの2バイトは空けておくそうです。
MAINルーチンが終わって、サブルーチンが出て来て、
サブルーチンの開始アドレスが分かった時点で、先ほど空けておいた場所に
アドレスを書き込むそうです。
なかなか面倒な方法ですね^^
アセンブラが欲しいところですね〜。
Win用のZ80のアセンブラを使っているサイトをいくつか見たのですが、
よくわからないです;
なんかMSX専用のアセンブラはないみたいですね〜。
MSXは、CPUがZ80なので共通なのかな?
BIOSルーチンを呼ぶ時などはどうするのかな?
また調べてみます!
CALL命令を書かずに、
NOP命令という"何もしない"1バイトの命令を書いて
デバックをすることもあるそうです。
マシンコード:
NOP 00
まぁよくわからないけど、実際にやり始めたら分かるかな〜。
今は、そんなのがあるよってだけにしときます。
今日のところはここまでです。
次回は、CALL命令のメカニズムというところをやります。
MSX BASICでゲームを作ろうのところで書いた
マシン語の説明(VRAMのコピーの箇所)をしたいのですけど、
そこまで行くのに結構時間がかかりそう;
それほど難しいのは使っていないのですけど、
色々と説明に順番があって…。
まあじっくりとやっていくことにします。
それでは〜。
スポンサーリンク
MSX BASIC + マシン語はこちらへ〜