mirror of
https://github.com/cc65/cc65.git
synced 2024-10-31 20:06:11 +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 popptr1
|
|
.importzp ptr1, ptr4
|
|
|
|
|
|
;---------------------------------------------------------------------------
|
|
; 8x16 routine with external entry points used by the 16x16 routine in mul.s
|
|
|
|
tosmula0:
|
|
tosumula0:
|
|
sta ptr4
|
|
mul8x16:jsr popptr1 ; Get left operand (Y=0 by popptr1)
|
|
|
|
tya ; Clear byte 1
|
|
ldy #8 ; Number of bits
|
|
ldx ptr1+1 ; check if lhs is 8 bit only
|
|
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 ptr1
|
|
tax
|
|
lda ptr1+1 ; hi byte of left op
|
|
adc ptr4+1
|
|
sta ptr4+1
|
|
txa
|
|
|
|
@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 ptr1
|
|
@L1: ror
|
|
ror ptr4
|
|
dey
|
|
bne @L0
|
|
tax
|
|
lda ptr4 ; Load the result
|
|
rts ; Done
|
|
|