MC6800のプログラミングテクニック(7) 分岐条件の生成(2)

BASICMASTER, 昔のパソコン

前回記事を投稿した後で気がついたけど、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

続く