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