Imported Upstream version 2.9.0
[debian/cc1111] / device / lib / pic16 / libc / utils / cvtdec.S
1 ;--
2 ;
3 ;       File:   cvtdec.asm
4 ;       Author: George Gallant
5 ;       Date:   19OCT04
6 ;       
7 ;       $Id: cvtdec.S 3718 2005-04-06 06:06:20Z vrokas $
8 ;
9 ;       This routine is based on the code and algorithm by
10 ;       Nikolai Golovchenko and Scott Dattalo presented in
11 ;       the piclist webb site on radix conversion methods.
12 ;       Modified to support integers from 0 to 65535 and coded
13 ;       for the pic18 chip set.
14 ;
15 ;                          Digit
16 ;       BIT  Weight  4   3   2   1   0
17 ;       ---  ------ --- --- --- --- ---
18 ;        0      1    0   0   0   0   1
19 ;        1      2    0   0   0   0   2
20 ;        2      4    0   0   0   0   4
21 ;        3      8    0   0   0   0   8
22 ;       
23 ;        4     16    0   0   0   1   6
24 ;        5     32    0   0   0   3   2
25 ;        6     64    0   0   0   6   4
26 ;        7    128    0   0   1   2   8
27 ;
28 ;        8    256    0   0   2   5   6
29 ;        9    512    0   0   5   1   2
30 ;       10   1024    0   1   0   2   4
31 ;       11   2048    0   2   0   4   8
32 ;
33 ;       12   4096    0   4   0   9   6
34 ;       13   8192    0   8   1   9   2
35 ;       14  16384    1   6   3   8   4
36 ;       15  32768    3   2   7   6   8
37 ;
38 ;--
39                 nolist
40                 include <p18fxxx.inc>
41                 list
42
43                 udata
44
45                 global  digits
46
47 digits:         res     6
48
49                 code
50
51                 global  cvt_dec_word
52
53 ;--
54 ;
55 ;       Convert a 16-bit binary word to 5 BCD bytes
56 ;
57 ;       On Call
58 ;               PROD    16 bit word
59 ;               FSR0    pointer to ascii buffer
60 ;
61 ;       On Return
62 ;               digits[4:0] contain the BCD integers
63 ;
64 ;       Notes:  1. strip leading zeros
65 ;               2. only positive integers on input
66 ;               3. FSR0, PROD & W are modified and not preserved
67 ;
68 ;--
69 cvt_dec_word:   clrw                            ;calculate digit 0 - lsd
70
71                 btfsc   PRODL,0                 ;bit0
72                 addlw   1
73
74                 btfsc   PRODL,1                 ;bit1
75                 addlw   2
76
77                 btfsc   PRODL,2                 ;bit2
78                 addlw   4
79
80                 btfsc   PRODL,3                 ;bit3
81                 addlw   8
82
83                 btfsc   PRODL,4                 ;bit4
84                 addlw   6
85
86                 btfsc   PRODL,5                 ;bit5
87                 addlw   2
88
89                 btfsc   PRODL,6                 ;bit6
90                 addlw   4
91
92                 btfsc   PRODL,7                 ;bit7
93                 addlw   8
94
95                 btfsc   PRODH,0                 ;bit8
96                 addlw   6
97
98                 btfsc   PRODH,1                 ;bit9
99                 addlw   2
100
101                 btfsc   PRODH,2                 ;bit10
102                 addlw   4
103
104                 btfsc   PRODH,3                 ;bit11
105                 addlw   8
106
107                 btfsc   PRODH,4                 ;bit12
108                 addlw   6
109
110                 btfsc   PRODH,5                 ;bit13
111                 addlw   2
112
113                 btfsc   PRODH,6                 ;bit14
114                 addlw   4
115
116                 btfsc   PRODH,7                 ;bit15
117                 addlw   8
118
119                 clrf    digits+1                ;setup for carry in 10's
120 @1:             addlw   -10
121                 bnc     @2
122                 incf    digits+1,f
123                 bra     @1
124
125 @2:             addlw   10
126                 movwf   digits+0
127
128 ;       calculate digit 1
129
130                 movf    digits+1,w
131
132                 btfsc   PRODL,4                 ;bit4
133                 addlw   1
134
135                 btfsc   PRODL,5                 ;bit5
136                 addlw   3
137
138                 btfsc   PRODL,6                 ;bit6
139                 addlw   6
140
141                 btfsc   PRODL,7                 ;bit7
142                 addlw   2
143
144                 btfsc   PRODH,0                 ;bit8
145                 addlw   5
146
147                 btfsc   PRODH,1                 ;bit9
148                 addlw   1
149
150                 btfsc   PRODH,2                 ;bit10
151                 addlw   2
152
153                 btfsc   PRODH,3                 ;bit11
154                 addlw   4
155
156                 btfsc   PRODH,4                 ;bit12
157                 addlw   9
158
159                 btfsc   PRODH,5                 ;bit13
160                 addlw   9
161
162                 btfsc   PRODH,6                 ;bit14
163                 addlw   8
164
165                 btfsc   PRODH,7                 ;bit15
166                 addlw   6
167
168                 clrf    digits+2                ;setup for carry into 100's
169 @3:             addlw   -10
170                 bnc     @4
171                 incf    digits+2,f
172                 bra     @3
173
174 @4:             addlw   10
175                 movwf   digits+1
176
177 ;       calculate digit 2
178
179                 movf    digits+2,w
180
181                 btfsc   PRODL,7                 ;bit7
182                 addlw   1
183
184                 btfsc   PRODH,0                 ;bit8
185                 addlw   2
186
187                 btfsc   PRODH,1                 ;bit9
188                 addlw   5
189
190                 btfsc   PRODH,5                 ;bit13
191                 addlw   1
192
193                 btfsc   PRODH,6                 ;bit14
194                 addlw   3
195
196                 btfsc   PRODH,7                 ;bit15
197                 addlw   7
198
199                 clrf    digits+3                ;setup for carry into 1000's
200 @5:             addlw   -10
201                 bnc     @6
202                 incf    digits+3,f
203                 bra     @5
204 @6:             addlw   10
205
206                 movwf   digits+2
207
208 ;       calculate digit 3
209
210                 movf    digits+3,w
211
212                 btfsc   PRODH,2                 ;bit10
213                 addlw   1
214
215                 btfsc   PRODH,3                 ;bit11
216                 addlw   2
217
218                 btfsc   PRODH,4                 ;bit12
219                 addlw   4
220
221                 btfsc   PRODH,5                 ;bit13
222                 addlw   8
223
224                 btfsc   PRODH,6                 ;bit14
225                 addlw   6
226
227                 btfsc   PRODH,7                 ;bit15
228                 addlw   2
229
230                 clrf    digits+4                ;setup for carry into 10000's
231 @7:             addlw   -10
232                 bnc     @8
233                 incf    digits+4,f
234                 bra     @7
235
236 @8:             addlw   10
237                 movwf   digits+3
238
239 ;       calculate digit 4
240
241                 movf    digits+4,w
242
243                 btfsc   PRODH,6                 ;bit14
244                 addlw   1
245
246                 btfsc   PRODH,7                 ;bit15
247                 addlw   3
248
249 @9:             addlw   -10
250                 bc      @9
251
252                 addlw   10
253 ;               movwf   digits+4
254
255 ;               movf    digits+4,w
256                 bnz     @11
257                 movf    digits+3,w
258                 bnz     @12
259                 movf    digits+2,w
260                 bnz     @13
261                 movf    digits+1,w
262                 bnz     @14
263                 bra     @15
264
265 @11:            addlw   0x30
266                 movwf   POSTINC0
267
268                 movf    digits+3,w
269 @12:            addlw   0x30
270                 movwf   POSTINC0
271
272                 movf    digits+2,w
273 @13:            addlw   0x30
274                 movwf   POSTINC0
275
276                 movf    digits+1,w
277 @14:            addlw   0x30
278                 movwf   POSTINC0
279
280 @15:            movf    digits+0,w
281                 addlw   0x30
282                 movwf   POSTINC0
283
284                 return
285
286                 end