mirror of
https://github.com/cc65/cc65.git
synced 2024-11-18 00:07:21 +00:00
70 lines
1.4 KiB
ArmAsm
70 lines
1.4 KiB
ArmAsm
;
|
|
; Ullrich von Bassewitz, 13.08.1998
|
|
;
|
|
; CC65 runtime: multiplication for long (unsigned) ints
|
|
;
|
|
|
|
.export tosumul0ax, tosumuleax, tosmul0ax, tosmuleax
|
|
.import addysp1
|
|
.importzp sp, sreg, tmp1, tmp2, tmp3, tmp4, ptr1, ptr3, ptr4
|
|
|
|
tosmul0ax:
|
|
tosumul0ax:
|
|
ldy #$00
|
|
sty sreg
|
|
sty sreg+1
|
|
|
|
tosmuleax:
|
|
tosumuleax:
|
|
mul32: sta ptr1
|
|
stx ptr1+1 ; op2 now in ptr1/sreg
|
|
ldy #0
|
|
lda (sp),y
|
|
sta ptr3
|
|
iny
|
|
lda (sp),y
|
|
sta ptr3+1
|
|
iny
|
|
lda (sp),y
|
|
sta ptr4
|
|
iny
|
|
lda (sp),y
|
|
sta ptr4+1 ; op1 in pre3/ptr4
|
|
jsr addysp1 ; Drop TOS
|
|
|
|
; Do (ptr1:sreg)*(ptr3:ptr4) --> EAX.
|
|
|
|
lda #0
|
|
sta tmp4
|
|
sta tmp3
|
|
sta tmp2
|
|
ldy #32
|
|
L0: lsr tmp4
|
|
ror tmp3
|
|
ror tmp2
|
|
ror a
|
|
ror sreg+1
|
|
ror sreg
|
|
ror ptr1+1
|
|
ror ptr1
|
|
bcc L1
|
|
clc
|
|
adc ptr3
|
|
pha
|
|
lda ptr3+1
|
|
adc tmp2
|
|
sta tmp2
|
|
lda ptr4
|
|
adc tmp3
|
|
sta tmp3
|
|
lda ptr4+1
|
|
adc tmp4
|
|
sta tmp4
|
|
pla
|
|
L1: dey
|
|
bpl L0
|
|
lda ptr1 ; Load the low result word
|
|
ldx ptr1+1
|
|
rts
|
|
|