MC6800のプログラミングテクニック(8) 分岐条件の生成(3)
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命令が使えたかもしれないが、本末転倒してるな。手段のためなら目的を選ばず。
続く
ディスカッション
コメント一覧
まだ、コメントがありません