mirror of
https://github.com/cc65/cc65.git
synced 2024-10-30 12:28:25 +00:00
64 lines
1.6 KiB
ArmAsm
64 lines
1.6 KiB
ArmAsm
;
|
|
; 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
|
|
|