掛け算
目次
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クロック。