投稿日: Mar 13, 2017 1:58:8 PM
と、勝手に呼ばせてもらいます。OPCodeの頭2つのbitが10になるブロックです。
早速さくっと処理の概要だけ書いちゃいます。
縦に長い。
いちいちOPCodeのビット参照するの面倒くさかったのでop1に頭の2bit、op2、op3に続く3bitづつが格納されるようにコード書き加えたのでちょっとはすっきりするかな?
OPCodeの10AAABBBのAAAで8つの処理に分けます。BBBは対象となるレジスタ。
演算結果Aレジスタ <- Aレジスタ 演算 レジスタ[BBB] って感じですね。
で、それだけなら簡単なのだけどここから意識しなきゃいけないのがフラグです。
ちょっとフラグについておさらいしときます。
Fレジスタのビットに色々機能があって3bitは使って無いので残り5bitに意味があり。
S Z 0 AC 0 P 1 C
と言う並びで8bit、数字のビットは固定値。
S:サイン 符号ですね。マイナスになると1になります。
Z:ゼロ 演算結果がゼロになると1になります。
AC:AUXキャリー 値をBCDとして扱っているときに参照するキャリー。ややこしい。
P:パリティ 演算でビットが桁あふれしたときに1になるやつ。
1バイト内の1になっているビット数が偶数でセット、奇数でリセットされる
C:キャリー 演算結果で値が溢れたときに1になる。
PとCは一緒に出来なかったのかよこのやろう。ACとか必要なのかよこのやろう。
などと思わないでもないんですけど、頑張りましょう。
MVI A,020h
MVI B,020h
SUB B
A = A - B という内容なので Aは0になります。
Zフラグが1、ついでになぜかPフラグが1になります。えー。そうなの。
ちょっと想像と動きが違うのでこの辺はいろいろ試してみないといけなさそう。
→パリティビットを勘違いしてたです。偶数か奇数かを表すビットだったのです。あわわ;
この演算ブロックではフラグ操作がメインとなりそうです。