mirror of
https://github.com/cc65/cc65.git
synced 2024-12-26 08:32:00 +00:00
64 lines
958 B
ArmAsm
64 lines
958 B
ArmAsm
|
;
|
||
|
; Ullrich von Bassewitz, 13.08.1998
|
||
|
;
|
||
|
; CC65 runtime: multiplication for long (unsigned) ints
|
||
|
;
|
||
|
|
||
|
.export tosumuleax, tosmuleax
|
||
|
.import addysp1
|
||
|
.importzp sp, sreg, tmp1, tmp2, tmp3, tmp4, ptr1, ptr3, ptr4
|
||
|
|
||
|
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
|
||
|
|