MC6800のプログラミングテクニック(7) 分岐条件の生成(2)
前回記事を投稿した後で気がついたけど、NEG命令が意外に使えそうである。
NEGはAccやメモリの内容の2の補数を取る命令。この命令だけ、CとVの変化が覚えにくい。
Cは、元々の値が0(結果も0)のときだけ、C=0。そうでなければC=1である。これは、$00-Accの計算をして、Accが0以外なら桁借り(borrow)が発生するから。
Vは、元々の値が$80(結果も$80)のときだけ、V=1。そうでなければV=0である。$00-$80=$80 になってしまい、意味的におかしいので Vを立てて知らせている。
特殊な変化をするせいか、マニュアルの記述も変である。モトローラのマニュアルだと、Vはわかりやすいが、Cは逆の意味に見える。
① (Bit V) Test: Result = 10000000?
② (Bit C) Test: Result = 00000000?M6800 Microprocessor Applications Manual, Motorola 19751-19 より引用
ベーシックマスターL2IIのマニュアル。Jrも同様。合ってるけど、英語を直訳したかのような文章である。
① もし、0から減算した結果に桁借りがあれば、C Bitは、ACC X あるいは Mの内容が(00)16の時を除き、総ての場合セットされる。
② もし、0から減算した結果に2の補数のオーバフローがあれば、セットされる。これは、ACC X 或るいは Mの内容が(80)16の時に起る。BASIC MASTER MB6881 ベーシックマスター レベル2II 取扱説明書, HITACHI P.123 より引用
要するにNEGは、$00と$80だけを特別扱いで検出できる便利な命令としても使えるわけだ。
AccBが0でなければZ=0,AccB=1(AccBが0ならばZ=1,AccB=0)
普通に分岐で考えるとこうなる。8 or 12 cycle, 8bytes.
tstb bne L1 ldab #1 bra L2 L1: clrb L2:
前回は$00の検出にsubを使った。この場合は、$00のときだけC=1になるので、eorbで0/1を反転させる。8cycle,7bytes.
subb #1 rolb eorb #1 andb #1
NEGを使う。あら簡単! 6cycle, 4bytesである。
negb rolb andb #1
続く
ディスカッション
コメント一覧
まだ、コメントがありません