Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

MC6800のプログラミングテクニック(1) 16bit数値の2の補数の計算

2024/10/05BASICMASTER, 昔のパソコン

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