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

BASICMASTER, 昔のパソコン

NEG命令の続きである。NEGを使うとある1byteが00であるか80であるかそれ以外かを1命令で判断できる。


$00のとき	C=0, V=0
$80のとき	C=1, V=1
その他		C=1, V=0

これ何かに使えそうだなと思っていてひらめいた。IEEE754形式の浮動小数点演算で、+0.0と-0.0の処理をするのに使えそうである。

IEEE754形式の二つのゼロ

IEEE754形式は、今では広く使われている浮動小数点形式である。このフォーマットには0が2つ存在する。正の0と負の0である。

この2つは符号が違うことを除けば同一の値であり、 +0.0 == -0.0 になる。

-0.0 は、例えば -1 * 0.0 の結果として生成できる。実数方程式を解くときに、演算結果として生成されたりする。
(ニュートン法で平方根を求める処理で遭遇して、バグ探しに苦労したことがある)

+0.0 は、IEEE754 単精度32bit だと $00000000 であり、-0.0 は $80000000 である。

IEEE 754の単精度実数の大小比較は、それを同じビットパターンの 32bit符号あり整数としてみたときの大小みなして比較して良い。便利である。ただし、-0.0 を除く。

なので、操作開始時に -0.0 を特別視する処理が必要なのだが、-0.0 と +0.0 は先頭が$80か$00かだけが異なる。残りは$00で同一である。

NEGが使えそうである。


0.0か?の判断

後ろ3バイトが$00であれば、先頭バイトを読んで、$00か$80かそれ以外かを判断する。AccBの値を壊したくないなら、NEG/NEGと2回処理すれば良い(元に戻る)。


	LDAB	3,X
	BNE	normal
	LDAB	2,X
	BNE	normal
	LDAB	1,X
	bne	normal
	LDAB	0,X
	NEGB
	BCC	pluszero
	BVS	minuszero
normal:

普通に書けば $00 と $80 を別に比較しないといけないのだが、NEGだと1命令で比較できる。

1バイトしか節約できてないのは、LDABで$00のときはZが立つので差が出にくいから。


	LDAB	0,X
	BEQ	pluszero
	CMPB	#$80
	BEQ	minuszero
normal:

GAMEインタプリタやNTBのエディタは、テキストの末が通常$00だが、7bit目が1なら特別な処理をしていた。

これもうまく工夫すればNEG命令が使えたかもしれないが、本末転倒してるな。手段のためなら目的を選ばず。

続く