; ; 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