今回はマシン語の計算です。
ゲームで計算というと座標とか、敵のダメージ量であったり
まぁ何かと使いますね^^
これを学ぶと少しプログラムを組めるようになるのかな?
今回もこの本でお勉強です^^
8ビットの足し算・引き算
x (レジスタ、値) | A | B | C | D | E | H | L |
---|---|---|---|---|---|---|---|
ADD A,x | 87 | 80 | 81 | 82 | 83 | 84 | 85 |
SUB x | 97 | 90 | 91 | 92 | 93 | 94 | 95 |
x (レジスタ、値) | (HL) | (IX+d) | (IY+d) | n |
---|---|---|---|---|
ADD A,x | 86 | DD 86 d | FD 86 d | C6 n |
SUB x | 96 | DD 96 d | FD 96 d | D6 n |
16ビットの足し算・引き算
足し算
ADD HL , BC
HLレジスタの内容と、BCレジスタの内容を足して、HLレジスタに入れます。
使えるレジスタは、BC、DEレジスタ、またはHLレジスタになります。
引き算
SBC HL , BC
HLレジスタの内容から、BCレジスタの内容を引いて、HLレジスタに入れます。
8ビットの時のSUBとは命令が変わるんだそうです。
しかも、
CYフラグが関わってきます。
この命令を実行する前に、OR A という命令を実行しなければいけないそうです。
うーん、ややこしい;
16ビットの引き算は
OR A
SBC HL , DE
のようにするそうです。
なぜ OR A をするのかというと、
CYフラグを0にするためだそうです。
CYフラグってなんだっけ?
MSXマシン語入門(Z80 アセンブラ・機械語) 勉強レポート 第20回 Fレジスタの使い方 - ニャオニャオ21世紀
上のリンク先でしっかり書いてありました(^^;
引き算についても。
読んでみてください^^
x (レジスタ、値) | BC | DE | HL | SP | IX | IY |
---|---|---|---|---|---|---|
ADD HL , x | 09 | 19 | 29 | 39 | ||
ADD IX , x | DD 09 | DD 19 | DD 39 | DD 29 | ||
ADD IY , x | FD 09 | FD 19 | FD 39 | FD 29 | ||
ADC HL , x | ED 4A | ED 5A | ED 6A | ED 7A | ||
SBC HL , x | ED 42 | ED 52 | ED 62 | ED 72 |
まとめ
足し算と引き算はわかりました!
あとは掛け算と割り算ですねぇ。
掛け算は、同じ数を足し続ける方法でできます。
2 x 5だったら、2+2+2+2+2 ってやる方法があります。
他にもシフトというものがあります。
こちらはそのうち書きたいと思います。
割り算は?
10 / 2だったら
10-2=8、8-2=6、6-2=4、4-2=2、2-2=0
0になるまで何回引いたか、カウントするのかな?
かなりマシン語の勉強も進んできました^^
あとは、
・ビット単位のデータ操作
・I/Oポートの利用
・マシン語プログラムの応用
と、3つの章を残すのみとなりました。
でもマシン語の基礎なので、これが済んだら実際にプログラムを
書いて経験値を高めなければいけません。
とりあえずはMSX FANなどのBASICゲームのリストに載っている
プログラムの解析ですかね。
BASICのプログラムの中に、一部マシン語を利用しているものが
多いので勉強になりそうです。
それらの本のBASICゲームに、
DATA文の中の16進数の羅列をみたことがあると思いますが、
あれがマシン語だったりします。
(ただのデータかもしれないので、どこからがマシン語なのかよくみないと
いけませんが)
あれをハンド逆アセンブラして、解析をしようかなぁと思っています。
Z80の逆アセンブラのツールってどっかにあるのかな?
ありそうでなのでそれを使ってもいいですが。
いずれは、ハイドライドとかトリトーンのようなゲームを
フルマシン語で作ってみたいですね〜。
夢がひろがるなぁ〜^^
MSX BASICの情報はこちらへ〜