掛け算

目次

概要

Z80基本

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

6502基本

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

速度比較


最初の処理を展開

2014.9.1 追記

分岐改良のプログラムの「前処理部分」を少し書き換え、最初の1回分の計算を行ってしまう、と言うプログラムが投稿されました。

書き変わる箇所のみ示します。


	LDA #100 ;2
	STA >3 ;3
	ASL A ;2
	STA >0 ;3
	LDX #7 ;2
	LDA #0 ;2
	BCC LOOP ;3/2
	ADC >3 ;3
	BCC LOOP ;3
ADD:

プログラムでは、「端の処理」が重要なことがあります。一番初めとか、一番最後とか、ちょっと特別処理しないといけないこととか多いです。

元のプログラムでは、前処理が終わった時点で、最初の加算が発生しない場合は SKIP から処理を始めていました。この SKIP は、X レジスタを減算し、0 なら終わる、と言う処理です。

最初は X レジスタは 8 で、減算しても 0 になるわけがない。明らかに無駄のある部分です。


そこで、最初から X レジスタに1つ小さな値を入れ、SKIP が「0以外の場合」に進む、LOOP の部分に進むようにしています。

ただ、これだけだと最初の加算が発生する場合に整合性が取れなくなるため、最初の加算までは前処理で終わらせています。

この際、最初の加算でいきなり「8bit の範囲を超える」ことはあり得ないため、繰上り処理は省略しています。


前処理の変更なので、高速化の効果はそれほど大きくないです。X の減算と、0ではないことの確認の、計 4クロック速くなるだけ。


総計は、150クロックから 4クロック速くなり、146クロックです。


速度比較

2014.9.1時点での比較。

6502 は 146 クロック。ファミコンの周波数を考慮して倍にすると、MSX の 292 クロック相当の実時間です。

Z80 は 294クロック。2クロック差、0.7% の速度差で、ファミコンの勝ちです。

1% 以下の差と言うのは、「同等の速度」だと考えても良いのではないかな、と思っています。


次の例題は…ブロック転送


前ページ 1 2 3 4 5 6

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

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

-- share --

0000

-- follow --




- Reverse Link -