掛け算
目次
最初の処理を展開
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% 以下の差と言うのは、「同等の速度」だと考えても良いのではないかな、と思っています。
次の例題は…ブロック転送