掛け算

目次

概要

Z80基本

構造整理HL活用参考記録変数共用

6502基本

結果のレジスタ持ち計算手順逆転ループ展開変数共用分岐改良最初の処理を展開

速度比較


6502基本

Z80 の HL をゼロページの 0 1 に、BC を 2 3 に、A を 4 に割り当てたベタ移植です。



	LDA #0 ; 2
	STA >0 ; 3
	STA >1 ; 3
	STA >2 ; 3
	LDA #101 ; 2
	STA >3 ; 3
	LDA #100 ; 2
	STA >4 ; 3

LOOP:
	LSR >4 ; 5
	BCC SKIP ; 3 / 2
	CLC ; 2
	LDA >1 ; 3
	ADC >3 ; 3
	STA >1 ; 3
	LDA >0 ; 3
	ADC >2 ; 3
	STA >0 ; 3

SKIP:
	LDA >4 ; 3
	BEQ END ; 3 / 2
	ASL >3 ; 5
	ROL >2 ; 5
	JMP LOOP ; 3

END:
	LSR >0 ; 5
	ROR >1 ; 5


前処理に 21クロック

LOOP 内は、加算が生じた場合 45クロック、生じない場合 26 クロック。

終了条件は Z80 版と同じで、最後だけ 12 クロック速くなります。


乗数 100 として、ループ内は 45*3 + 26*4 - 12 = 227 で 227 クロック。

後処理に 10 クロック。


総計で、258 クロックです。


結果のレジスタ持ち

2014.8.4 午前追記。

HL 相当を、ゼロページに置かずに YA に持たせてみました。X は A の一時退避用に使っています。

実は、ネットで見つけた 6502 の乗算ルーチンを参考に、基本を改良したもの。(ネットで見つけたルーチンは、小さなコードサイズになるように工夫していて、速度重視ではなかった)


	LDA #101 ; 2
	STA >3 ; 3
	LDA #100 ; 2
	STA >4 ; 3

	LDA #0 ;2
	STA >2 ; 3
	TAY ; 2
	BEQ START ; 3 / 2

ADD:
	CLC ; 2
	ADC >3 ; 3
	TAX ; 2
	TYA ; 2
	ADC >2 ; 3
	TAY ; 2
	TXA ; 2
	
LOOP:
	ASL >3 ; 5
	ROL >2 ; 5

START:
	LSR >4 ; 5
	BCS ADD ; 3 / 2
	BNE LOOP ; 3 / 2

END:
	STY >0 ; 3
	LSR >0 ; 5
	ROR A ; 2
	STA >1 ; 3

前処理 20 クロック。前処理の最後に BEQ でジャンプしていますが、直前の命令で 0 を入れているため、必ずジャンプします。(JMP とクロック数は同じだけど、命令長が1バイト短い)


加算が生じた場合、34 クロック、生じない場合 20 クロック。

ただし、ループ回数は基本プログラムより1回増えます。最後は1クロック速いです。


乗数 100 として、ループ内は 34*3 + 20*5 - 1 = 201 クロック。後処理に 13 クロック。

総計で 214クロック。


次ページ: 計算手順逆転


前ページ 1 2 3 4 5 6 次ページ

(ページ作成 2014-08-03)
(最終更新 2014-09-01)
第2版 …他の版 初版

前記事:Z80 vs 6502     戻る     次記事:ブロック転送
トップページへ

-- share --

2000

-- follow --




- Reverse Link -