]> git.sur5r.net Git - cc65/blob - libsrc/runtime/umul16x16r32.s
Added division routine. Removed C callable entry points from mul routines,
[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         umul16x16r32, umul16x16r32m
8         .importzp       ptr1, ptr3, sreg
9
10
11 ;---------------------------------------------------------------------------
12 ; 16x16 => 32 unsigned multiplication routine.
13 ;
14 ;   lhs         rhs           result          result also in
15 ; -------------------------------------------------------------
16 ;   ptr1        ax            ax:sreg          ptr1:sreg
17 ;
18
19 umul16x16r32:
20         sta     ptr3
21         stx     ptr3+1
22
23 umul16x16r32m:
24         lda     #0
25         sta     sreg+1
26         ldy     #16             ; Number of bits
27
28         lsr     ptr1+1
29         ror     ptr1            ; Get first bit into carry
30 @L0:    bcc     @L1
31
32         clc
33         adc     ptr3
34         pha
35         lda     ptr3+1
36         adc     sreg+1
37         sta     sreg+1
38         pla
39
40 @L1:    ror     sreg+1
41         ror     a
42         ror     ptr1+1
43         ror     ptr1
44         dey
45         bne     @L0
46
47         sta     sreg            ; Save byte 3
48         lda     ptr1            ; Load the result
49         ldx     ptr1+1
50         rts                     ; Done
51