ニャオニャオ21世紀

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

MSXマシン語入門(Z80 アセンブラ・機械語) 第27回 マシン語の計算 勉強レポート






今回はマシン語の計算です。

ゲームで計算というと座標とか、敵のダメージ量であったり

まぁ何かと使いますね^^

これを学ぶと少しプログラムを組めるようになるのかな?

 

f:id:nyaonyaokun:20180904192055j:plain

 

 

今回もこの本でお勉強です^^

MSXマシン語入門講座
MSXマシン語入門講座
posted with amazlet at 18.09.03
湯浅 敬
アスキー
売り上げランキング: 1,383,851
 
 
まずマシン語には足し算と、引き算しかないそうです。(論理演算もある)
掛け算、割り算、三角関数もありません。
これはどっかで聞いたことがあります。
どうやって計算するんだろう?って思いますよね。
 
算術演算命令には8ビットと16ビットがあるそうです。
では順番にやっていきます。
 

 8ビットの足し算・引き算

 演算に使うのはAレジスタ!
これは分かります^^
 
まず足し算です。
ADD  A , B
Aレジスタの内容と、Bレジスタの内容を足して、Aレジスタに入れます。
簡単、簡単 ♪
 
ADD  A , 41H
Aレジスタの内容と、41Hを足して、Aレジスタに入れます。
これも簡単 ♪
 
足し算のしくみを。
 
        01101000
+      00111011
--------------------
        10100011 
 
2進数で考えます。
1桁目から足していって、1+1のときは次の桁に繰り上がります。
まぁ分かります。
 
問題は、和が8ビット (8桁) に収まらない場合です。
 
      10000111
+    10011001
------------------
    100100000
 
赤文字の1は、9ビット目になります。
この場合Aレジスタには、8ビット目までが入ります。
この場合は、00100000です。
 
9ビット目の1はどうなるかというと、Fレジスタに情報がはいるそうです。
なるほど!
この本では、Fレジスタに入った1については、とりあえず考えないこと
にしております(~~;
ちょっと知りたかったけど、またでてくるのかなぁ?
 
 
続いて、
8ビットの引き算です。
こちらも、演算結果はAレジスタです。
いつものですw
 
SUB  C
Aレジスタから、Cレジスタの内容を引き、Aレジスタにいれます。
 
お、Aレジスタは書かないんですね?
うーん、ADDと書き方を統一してほしかったなぁ〜
 
SUB  0CH
こちらは、Aレジスタから、0CHという数値を引いて、Aレジスタに入れます。
上と同じですね ♪
 
      01110000
-    00100100
------------------
      01001100
 
こちらも各桁ごとに引いていくのですが....
こういう引き算の計算方法、完全に忘れてしまった(~~ ;
足し算はかろうじて覚えていましたが、どうやってやるんだっけ?
うーん、
学生の頃はこういうたくさんの桁同士の引き算を、紙の上でやっていたのだけどなぁ;
(10進数で、ですけど。)
まったく覚えていないw
調べる気力もないw
みなさんは覚えているもんですかねぇ?
 
小さい値から、大きい値を引くとマイナスになります。
マイナスというのは2の補数表示で表されます。
(2の補数かぁ。ちょっと調べないと忘れてるなぁ。ちなみにこのブログでは、
まだ書いていません。)
 
 
 8bit 算術演算命令のマシンコード
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ビットの足し算・引き算

 16ビットの場合は、演算が行われるレジスタが、
HL、IX、IY
になります。
 
いつものAレジスタじゃないんですね。(結果が16ビットになるから)
しかも、
8ビットの場合のように、数値を直接、足したり、引いたりできないそうです。

 

足し算

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世紀

上のリンク先でしっかり書いてありました(^^;

引き算についても。

読んでみてください^^

 

 

 16bit 算術演算命令のマシンコード(一部)
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の逆アセンブラのツールってどっかにあるのかな?

ありそうでなのでそれを使ってもいいですが。

 

いずれは、ハイドライドとかトリトーンのようなゲームを

フルマシン語で作ってみたいですね〜。

夢がひろがるなぁ〜^^

 


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

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