]> git.sur5r.net Git - cc65/blob - libsrc/runtime/umul16x16r32.s
The upper 16 bit differ between signed and unsigned multiplication, so while
[cc65] / libsrc / runtime / umul16x16r32.s
1 ;
2 ; Ullrich von Bassewitz, 2010-11-03
3 ;
4 ; CC65 runtime: 16x16 => 32 unsigned multiplication
5 ;
6
7         .export         _cc65_umul16x16r32, umul16x16r32, umul16x16r32m
8         .import         popax
9         .importzp       ptr1, ptr3, sreg
10
11
12 ;---------------------------------------------------------------------------
13 ; 16x16 => 32 unsigned multiplication routine.
14 ;
15 ;   lhs         rhs           result          result also in
16 ; -------------------------------------------------------------
17 ;   ptr1        ax            ax:sreg          ptr1:sreg
18 ;
19
20 _cc65_umul16x16r32:
21         sta     ptr1
22         stx     ptr1+1
23         jsr     popax
24
25 umul16x16r32:
26         sta     ptr3
27         stx     ptr3+1
28
29 umul16x16r32m:
30         lda     #0
31         sta     sreg+1
32         ldy     #16             ; Number of bits
33
34         lsr     ptr1+1
35         ror     ptr1            ; Get first bit into carry
36 @L0:    bcc     @L1
37
38         clc
39         adc     ptr3
40         pha
41         lda     ptr3+1
42         adc     sreg+1
43         sta     sreg+1
44         pla
45
46 @L1:    ror     sreg+1
47         ror     a
48         ror     ptr1+1
49         ror     ptr1
50         dey
51         bne     @L0
52
53         sta     sreg            ; Save byte 3
54         lda     ptr1            ; Load the result
55         ldx     ptr1+1
56         rts                     ; Done
57