struct / union in initializer, RFE #901.
[sdcc.git] / sdcc / device / lib / pic16 / libc / utils / cvtdec.S
blob30b9ab7856e5c2162a9e845dbaae8988bdc284f9
1 ;--------------------------------------------------------------------------
2 ;  cvtdec.S - convert a 16-bit binary word to 5 BCD bytes
4 ;  Copyright (C) 2004, George Gallant <ggallant571 AT verizon.net>
6 ;  This library is free software; you can redistribute it and/or modify it
7 ;  under the terms of the GNU General Public License as published by the
8 ;  Free Software Foundation; either version 2, or (at your option) any
9 ;  later version.
11 ;  This library is distributed in the hope that it will be useful,
12 ;  but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 ;  GNU General Public License for more details.
16 ;  You should have received a copy of the GNU General Public License 
17 ;  along with this library; see the file COPYING. If not, write to the
18 ;  Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
19 ;   MA 02110-1301, USA.
21 ;  As a special exception, if you link this library with other files,
22 ;  some of which are compiled with SDCC, to produce an executable,
23 ;  this library does not by itself cause the resulting executable to
24 ;  be covered by the GNU General Public License. This exception does
25 ;  not however invalidate any other reasons why the executable file
26 ;  might be covered by the GNU General Public License.
27 ;--------------------------------------------------------------------------
29 ;--
31 ;       File:   cvtdec.asm
32 ;       Author: George Gallant
33 ;       Date:   19OCT04
34 ;       
35 ;       This routine is based on the code and algorithm by
36 ;       Nikolai Golovchenko and Scott Dattalo presented in
37 ;       the piclist webb site on radix conversion methods.
38 ;       Modified to support integers from 0 to 65535 and coded
39 ;       for the pic18 chip set.
41 ;                          Digit
42 ;       BIT  Weight  4   3   2   1   0
43 ;       ---  ------ --- --- --- --- ---
44 ;        0      1    0   0   0   0   1
45 ;        1      2    0   0   0   0   2
46 ;        2      4    0   0   0   0   4
47 ;        3      8    0   0   0   0   8
48 ;       
49 ;        4     16    0   0   0   1   6
50 ;        5     32    0   0   0   3   2
51 ;        6     64    0   0   0   6   4
52 ;        7    128    0   0   1   2   8
54 ;        8    256    0   0   2   5   6
55 ;        9    512    0   0   5   1   2
56 ;       10   1024    0   1   0   2   4
57 ;       11   2048    0   2   0   4   8
59 ;       12   4096    0   4   0   9   6
60 ;       13   8192    0   8   1   9   2
61 ;       14  16384    1   6   3   8   4
62 ;       15  32768    3   2   7   6   8
64 ;--
65                 nolist
66                 include <p18fxxx.inc>
67                 list
69         
70                 global  cvt_dec_word
72                 udata
74                 global  digits
76 digits:         res     6
78                 code
81 ;--
83 ;       Convert a 16-bit binary word to 5 BCD bytes
85 ;       On Call
86 ;               PROD    16 bit word
87 ;               FSR0    pointer to ascii buffer
89 ;       On Return
90 ;               digits[4:0] contain the BCD integers
92 ;       Notes:  1. strip leading zeros
93 ;               2. only positive integers on input
94 ;               3. FSR0, PROD & W are modified and not preserved
96 ;--
97 cvt_dec_word:   clrw                            ;calculate digit 0 - lsd
99                 btfsc   PRODL,0                 ;bit0
100                 addlw   1
102                 btfsc   PRODL,1                 ;bit1
103                 addlw   2
105                 btfsc   PRODL,2                 ;bit2
106                 addlw   4
108                 btfsc   PRODL,3                 ;bit3
109                 addlw   8
111                 btfsc   PRODL,4                 ;bit4
112                 addlw   6
114                 btfsc   PRODL,5                 ;bit5
115                 addlw   2
117                 btfsc   PRODL,6                 ;bit6
118                 addlw   4
120                 btfsc   PRODL,7                 ;bit7
121                 addlw   8
123                 btfsc   PRODH,0                 ;bit8
124                 addlw   6
126                 btfsc   PRODH,1                 ;bit9
127                 addlw   2
129                 btfsc   PRODH,2                 ;bit10
130                 addlw   4
132                 btfsc   PRODH,3                 ;bit11
133                 addlw   8
135                 btfsc   PRODH,4                 ;bit12
136                 addlw   6
138                 btfsc   PRODH,5                 ;bit13
139                 addlw   2
141                 btfsc   PRODH,6                 ;bit14
142                 addlw   4
144                 btfsc   PRODH,7                 ;bit15
145                 addlw   8
147                 clrf    digits+1                ;setup for carry in 10's
148 @1:             addlw   -10
149                 bnc     @2
150                 incf    digits+1,f
151                 bra     @1
153 @2:             addlw   10
154                 movwf   digits+0
156 ;       calculate digit 1
158                 movf    digits+1,w
160                 btfsc   PRODL,4                 ;bit4
161                 addlw   1
163                 btfsc   PRODL,5                 ;bit5
164                 addlw   3
166                 btfsc   PRODL,6                 ;bit6
167                 addlw   6
169                 btfsc   PRODL,7                 ;bit7
170                 addlw   2
172                 btfsc   PRODH,0                 ;bit8
173                 addlw   5
175                 btfsc   PRODH,1                 ;bit9
176                 addlw   1
178                 btfsc   PRODH,2                 ;bit10
179                 addlw   2
181                 btfsc   PRODH,3                 ;bit11
182                 addlw   4
184                 btfsc   PRODH,4                 ;bit12
185                 addlw   9
187                 btfsc   PRODH,5                 ;bit13
188                 addlw   9
190                 btfsc   PRODH,6                 ;bit14
191                 addlw   8
193                 btfsc   PRODH,7                 ;bit15
194                 addlw   6
196                 clrf    digits+2                ;setup for carry into 100's
197 @3:             addlw   -10
198                 bnc     @4
199                 incf    digits+2,f
200                 bra     @3
202 @4:             addlw   10
203                 movwf   digits+1
205 ;       calculate digit 2
207                 movf    digits+2,w
209                 btfsc   PRODL,7                 ;bit7
210                 addlw   1
212                 btfsc   PRODH,0                 ;bit8
213                 addlw   2
215                 btfsc   PRODH,1                 ;bit9
216                 addlw   5
218                 btfsc   PRODH,5                 ;bit13
219                 addlw   1
221                 btfsc   PRODH,6                 ;bit14
222                 addlw   3
224                 btfsc   PRODH,7                 ;bit15
225                 addlw   7
227                 clrf    digits+3                ;setup for carry into 1000's
228 @5:             addlw   -10
229                 bnc     @6
230                 incf    digits+3,f
231                 bra     @5
232 @6:             addlw   10
234                 movwf   digits+2
236 ;       calculate digit 3
238                 movf    digits+3,w
240                 btfsc   PRODH,2                 ;bit10
241                 addlw   1
243                 btfsc   PRODH,3                 ;bit11
244                 addlw   2
246                 btfsc   PRODH,4                 ;bit12
247                 addlw   4
249                 btfsc   PRODH,5                 ;bit13
250                 addlw   8
252                 btfsc   PRODH,6                 ;bit14
253                 addlw   6
255                 btfsc   PRODH,7                 ;bit15
256                 addlw   2
258                 clrf    digits+4                ;setup for carry into 10000's
259 @7:             addlw   -10
260                 bnc     @8
261                 incf    digits+4,f
262                 bra     @7
264 @8:             addlw   10
265                 movwf   digits+3
267 ;       calculate digit 4
269                 movf    digits+4,w
271                 btfsc   PRODH,6                 ;bit14
272                 addlw   1
274                 btfsc   PRODH,7                 ;bit15
275                 addlw   3
277 @9:             addlw   -10
278                 bc      @9
280                 addlw   10
281 ;               movwf   digits+4
283 ;               movf    digits+4,w
284                 bnz     @11
285                 movf    digits+3,w
286                 bnz     @12
287                 movf    digits+2,w
288                 bnz     @13
289                 movf    digits+1,w
290                 bnz     @14
291                 bra     @15
293 @11:            addlw   0x30
294                 movwf   POSTINC0
296                 movf    digits+3,w
297 @12:            addlw   0x30
298                 movwf   POSTINC0
300                 movf    digits+2,w
301 @13:            addlw   0x30
302                 movwf   POSTINC0
304                 movf    digits+1,w
305 @14:            addlw   0x30
306                 movwf   POSTINC0
308 @15:            movf    digits+0,w
309                 addlw   0x30
310                 movwf   POSTINC0
312                 return
314                 end