割り算

Z80 vs 6502 、今回と次回の2回連続のプログラムでひとまず終わりにしたいと思います。


掛け算は最初の頃にやっていますが、今度は割り算を作ります。おそらくは、掛け算と同じで Z80 に有利なプログラムです。


目次

Z80 vs 6502 トップページ(別ページ)

概要

Z80 基本

Z80 引き放し法変数共用さらに引き放し法

6502基本

変数共用さらに引き放し法

速度判定


概要

16bit / 8bit で、商と剰余を求めるプログラムを作ります。

値は符号なしで、除数に 0 は入らない(DIV 0 エラーチェックは不要)とします。


商は 16bit 、余りは 8bit で返してください。


12345/10 を行い、そのクロック数を速度とします。


Z80 基本

まずは、基本的な「筆算による除算」プログラムを示します。

HLに被除数、DE に除数を入れ、HL' に商を入れています。



	LD L,0 ; 7 (8)
	EXX ; 4 (5)
	LD HL,12345 ; 10 (11)
	LD A,10 ; 7 (8)
	LD B,7 ; 7 (8)

; 前処理。割る数 A を左詰め。
PRE:
	INC B ; 4 (5)
	RLCA ; 4 (5)
	JR NC,PRE ; 12 / 7 (13 / 8)
	RRCA ; 4 (5)

	LD D,A ; 4 (5)
	LD E,0 ; 7 (8)

	AND A ; 4 (5) ; キャリーフラグを消す

; 筆算
LOOP:
	SBC HL,DE ; 15 (17)
	JR C,MINUS ; 12 / 7 (13 / 8)
PLUS:
	EXX ; 4 (5)
	ADD HL,HL ; 11 (12)
	INC L ; 4 (5)
	EXX ; 4 (5)
	JP AFTER ; 10 (11)

MINUS:
	ADD HL,DE ; 11 (12)
	EXX ; 4 (5)
	ADD HL,HL ; 11 (12)
	EXX ; 4 (5)

AFTER:
	SRL D ; 8 (10)
	RR E ; 8 (10)
	DJNZ LOOP ; 13 / 8 (14 / 9)

	LD A,L ; 4 (5)
	EXX ; 4 (5)
; HL に商、A に余り

除算では「被除数から、除数を何回引けたか」が「商」で、最後の残りが「剰余」です。

とはいえ、何回もループを回して引いていては時間がかかりすぎるため、掛け算と同じように一桁づつ処理を行います。


掛け算では最終的に足し算になるため、上の桁からでも、下の桁からでも処理できました。しかし、除算では引き算なので順序が意味を持ち、上の桁から処理する必要があります。

そのため、除数を「左詰め」する処理が最初に入っています。


以降は、1桁ごとに引き算しては、結果がプラスかマイナスかで処理を変えています。

プラスなら、引けたので結果の1桁を「1」にします。

マイナスなら結果は0ですが、被除数にもう一度除数を足して、引く前の値に戻しています。


Z80 の 16bit 引き算は、SBC(キャリー付引き算)しかありません。しかし、プログラム中 SBC が現れる部分は、必ずキャリーが「0」になるようにしています。

最初の一回は、前処理の中で AND A により、明示的にキャリーをクリアしています。

以降は直前の命令は PR E にあたりますが、E は前処理で 0 が入っているため、常に 0 が押し出されてキャリーに入ります。




前処理に 40クロック。


除数の左詰め処理(PRE~PLUS)は、1bit の左詰めにつき 23クロック。

計算の都合上、1回多く詰めてから戻します。戻す処理や次の準備などで 23クロック。


演算 LOOP 内の1桁の計算は、結果がプラスの時 97 クロック、マイナスの時 98 クロック。

最後に 終了処理で +5クロックになります。


計算の繰り返し部分などの詳細は次のようになります。

まず、12345 / 10 の場合、除数は 4bit に収まります。


左詰め処理は、8bit の上位 4bit の 0 を詰める処理になります。

詰める桁数より1回多くループが回るため、1ループ 23 クロックを5回。

これに、後処理の 23クロックを加え、23*5 + 23 = 138 クロック。


16bit / 4bit の除算は 1bit づつずらして計算していくと、16-4+1 = 13 回の計算が必要。(両端のある植木算なので +1 になります)


結果は 1234 。2進数で 0000 0100 1101 0010 です。

下 13 bit に、0 が 8 個、1 が 5 個。


これは、結果がマイナスだった回数が 8回、プラスだった回数が 5 回あることを意味します。

これらを全て計算すると、以下のようになります。


40 + 138 + 97*8 + 98*5 +5 = 1449


総計 1449クロックです。


次ページ: Z80 引き放し法


1 2 3 4 次ページ

(ページ作成 2014-08-20)
(最終更新 2015-04-28)
第2版 …他の版 初版

前記事:コマンド入力     戻る     次記事:10進表示
トップページへ

-- share --

5010

-- follow --




- Reverse Link -