MC6800のプログラミングテクニック(1) 16bit数値の2の補数の計算
AccABを16bitレジスタに見立てて2の補数(NEG)を計算する。素直に考えると1の補数を計算して+1なので、以下のプログラムになる。
メモリ 6bytes,実行時間 8cycle。ADDB #1 はINC Bにしたいのだが、INCではCarryが立たない。
COMA
COMB
ADDB #1
ADCA #0
電大版TinyBASICは IX(0:1)の反転だが、AccABに置き換えるとこうなる。5bytes,10cycle。1バイト減ったが2サイクル増えた。NAKAMOZU Tiny BASIC、GAME68も同様。
NEGB BNE *+3 DECA COMA
KUMAJIRIのK-CPU。5bytesだが10cycle。電大版同様にBNEが4cycleかかる分だけ遅くなっている。
COMA NEGB BNE NRET INCA
Small-C 68、micro PASCAL68。4bytes,6cycle。COMA/COMBと同じアイディアだが、SBCを使うことで小さく・速くなっている。
NEGA NEGB SBCA #0
誰が考えたのだろう。凄い。ちょっと検索してみると、1981年5月1日発行のMotorola社「MC6809-MC6809E 8-Bit Microprocessor Programming Manual」 のB-60に、はNEGD命令の解説として提示されている。考え出されたのはこのころだろうか?
追記:
蛇足になるが、動作の説明をしておく。
まず、COMA/COMB/ADDB #1/ADCA #0 から考える。これは2バイトの2の補数の定義をそのまま書いただけ。
COMB / ADDB #1 は、NEGB に纏めることができる。問題は上位バイトへのキャリーだ。1を足しているので、キャリーが発生するのは$FF+1 → $00 + C のときだけだ。
NEG命令は、結果が$00のときに C=0, その他は C=1 になり、欲しいキャリーとは逆になっている。
そこで、COMAをNEGAに変えてあらかじめ1を足した上で、SBCA #0 でキャリーを引くことで、欲しい結果を得ている。
同じくMotorola社 1979年発行の「MC6809 PRELIMINARY PROGRAMMING MANUAL」の “7.0 PROGRAMMING TRICKS 'N TREATS" には、MC6809の命令の組み合わせの例が書かれており、NEGDについてもいくつかの例が挙げられている。
この記事の最初に提示したプログラムと同一である(MC6809なのでADDD命令がある)。
COMA COMB ADDD #1
ディスカッション
コメント一覧
まだ、コメントがありません