You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.5 KiB
ArmAsm
64 lines
1.5 KiB
ArmAsm
12 years ago
|
;
|
||
|
; Ullrich von Bassewitz, 2009-08-17
|
||
|
;
|
||
|
; CC65 runtime: multiplication for ints. Short versions.
|
||
|
;
|
||
|
|
||
|
.export tosumula0, tosmula0
|
||
|
.export mul8x16, mul8x16a
|
||
|
.import popsreg
|
||
|
.importzp sreg, ptr4
|
||
|
|
||
|
|
||
|
;---------------------------------------------------------------------------
|
||
|
; 8x16 routine with external entry points used by the 16x16 routine in mul.s
|
||
|
|
||
|
tosmula0:
|
||
|
tosumula0:
|
||
|
sta ptr4
|
||
|
mul8x16:jsr popsreg ; Get left operand
|
||
|
|
||
|
lda #0 ; Clear byte 1
|
||
|
ldy #8 ; Number of bits
|
||
|
ldx sreg+1 ; Get into register for speed
|
||
|
beq mul8x8 ; Do 8x8 multiplication if high byte zero
|
||
|
mul8x16a:
|
||
|
sta ptr4+1 ; Clear byte 2
|
||
|
|
||
|
lsr ptr4 ; Get first bit into carry
|
||
|
@L0: bcc @L1
|
||
|
|
||
|
clc
|
||
|
adc sreg
|
||
|
pha
|
||
|
txa ; hi byte of left op
|
||
|
adc ptr4+1
|
||
|
sta ptr4+1
|
||
|
pla
|
||
|
|
||
|
@L1: ror ptr4+1
|
||
|
ror a
|
||
|
ror ptr4
|
||
|
dey
|
||
|
bne @L0
|
||
|
tax
|
||
|
lda ptr4 ; Load the result
|
||
|
rts
|
||
|
|
||
|
;---------------------------------------------------------------------------
|
||
|
; 8x8 multiplication routine
|
||
|
|
||
|
mul8x8:
|
||
|
lsr ptr4 ; Get first bit into carry
|
||
|
@L0: bcc @L1
|
||
|
clc
|
||
|
adc sreg
|
||
|
@L1: ror
|
||
|
ror ptr4
|
||
|
dey
|
||
|
bne @L0
|
||
|
tax
|
||
|
lda ptr4 ; Load the result
|
||
|
rts ; Done
|
||
|
|