[旋风][6502汇编][16位乘法]

;[Multiplication][16_16_32]
;FlameCyclone 20181120
FactorA_L = $00 ;因数A低位
FactorA_H = $01 ;因数A高位
FactorB_L = $02 ;因数B低位
FactorB_H = $03 ;因数B高位
Product_LL = $04 ;乘积低位
Product_LH = $05 ;乘积高位
Product_HL = $06 ;乘积低位
Product_HH = $07 ;乘积高位
Product_Temp_LL = $08 ;临时积低位
Product_Temp_LH = $09 ;临时积高位
Product_Temp_HL = $0A ;临时积低位
Product_Temp_HH = $0B ;临时积高位
BitTest_L = $0C
BitTest_H = $0D
;65535*65535耗时1466
;255*255耗时1226
;1*1耗时967
.ORG $8000
LDA #255
STA FactorA_L
LDA #255
STA FactorA_H
LDA #255
STA FactorB_L
LDA #255
STA FactorB_H
JSR Multiplication
RTS
Multiplication: ;乘法计算
LDA #00
STA Product_LL
STA Product_LH
STA Product_HL
STA Product_HH
Set_Max:
LDA FactorA_L
STA Product_Temp_HL
LDA FactorA_H
STA Product_Temp_HH
LDA #$00
STA Product_Temp_LL
STA Product_Temp_LH
Set_Max_Beg: ;计算最大位的乘数积
LSR Product_Temp_HH
ROR Product_Temp_HL
ROR Product_Temp_LH
LDY #15
LDA #$80
STA BitTest_H
LDA #$00
STA BitTest_L
Multiplication_BitTest: ;检测乘数B的单独位
LDA BitTest_H
BIT FactorB_H
BNE Addition
LDA BitTest_L
BIT FactorB_L
BEQ Addition_End
Addition: ;将临时积于最终积累加得出结果
LDA Product_Temp_LL
CLC
ADC Product_LL
STA Product_LL
LDA Product_Temp_LH
ADC Product_LH
STA Product_LH
LDA Product_Temp_HL
ADC Product_HL
STA Product_HL
LDA Product_Temp_HH
ADC Product_HH
STA Product_HH
Addition_End: ;测试位继续右移, 准备下次位测试
LSR Product_Temp_HH
ROR Product_Temp_HL
ROR Product_Temp_LH
ROR Product_Temp_LL
LSR BitTest_H
ROR BitTest_L
DEY
BPL Multiplication_BitTest
Multiplication_End: ;乘法计算结束
RTS