struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / device / lib / mos6502 / _mullong.s
blob3d06b7569787519505fbb1ee1f86ef427bfc70e2
1 ;-------------------------------------------------------------------------
2 ; _mullong.s - routine for multiplication of 32 bit (unsigned) long
4 ; Copyright (C) 1998, Ullrich von Bassewitz
5 ; Copyright (C) 2022, Gabriele Gorla
7 ; This library is free software; you can redistribute it and/or modify it
8 ; under the terms of the GNU General Public License as published by the
9 ; Free Software Foundation; either version 2, or (at your option) any
10 ; later version.
12 ; This library is distributed in the hope that it will be useful,
13 ; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 ; GNU General Public License for more details.
17 ; You should have received a copy of the GNU General Public License
18 ; along with this library; see the file COPYING. If not, write to the
19 ; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
20 ; MA 02110-1301, USA.
22 ; As a special exception, if you link this library with other files,
23 ; some of which are compiled with SDCC, to produce an executable,
24 ; this library does not by itself cause the resulting executable to
25 ; be covered by the GNU General Public License. This exception does
26 ; not however invalidate any other reasons why the executable file
27 ; might be covered by the GNU General Public License.
28 ;-------------------------------------------------------------------------
30 .module _mullong
32 ;--------------------------------------------------------
33 ; exported symbols
34 ;--------------------------------------------------------
35 .globl __mullong_PARM_2
36 .globl __mullong_PARM_1
37 .globl __mullong
39 ;--------------------------------------------------------
40 ; overlayable function parameters in zero page
41 ;--------------------------------------------------------
42 .area OSEG (PAG, OVR)
43 __mullong_PARM_1:
44 .ds 4
45 __mullong_PARM_2:
46 .ds 4
48 ;--------------------------------------------------------
49 ; local aliases
50 ;--------------------------------------------------------
51 .define tmp "___SDCC_m6502_ret4"
52 .define res0 "__mullong_PARM_1+0"
53 .define res1 "__mullong_PARM_1+1"
54 .define res2 "___SDCC_m6502_ret2"
55 .define res3 "___SDCC_m6502_ret3"
57 ;--------------------------------------------------------
58 ; code
59 ;--------------------------------------------------------
60 .area CODE
62 __mullong:
64 ldx *__mullong_PARM_1+3
65 stx *res3
66 ldx *__mullong_PARM_1+2
67 stx *res2
68 ; ldx *__mullong_PARM_1+1
69 ; stx *res1
70 ; ldx *__mullong_PARM_1+0
71 ; stx *res0
73 lda #0
74 sta *tmp+2
75 sta *tmp+1
76 sta *tmp+0
78 ldy #32
79 next_bit:
80 lsr *tmp+2
81 ror *tmp+1
82 ror *tmp+0
83 ror a
84 ror *res3
85 ror *res2
86 ror *res1
87 ror *res0
88 bcc skip
89 clc
90 adc *__mullong_PARM_2+0
91 tax
92 lda *__mullong_PARM_2+1
93 adc *tmp+0
94 sta *tmp+0
95 lda *__mullong_PARM_2+2
96 adc *tmp+1
97 sta *tmp+1
98 lda *__mullong_PARM_2+3
99 adc *tmp+2
100 sta *tmp+2
102 skip:
104 bpl next_bit
105 ldx *res1
106 lda *res0