Utilities

Double Dabble (Shift and Add 3) Method

  
  1 /********************************************/
  2
  3 /*Binary to ASCII BCD Conversion Code       */
  4 /*Double Dabble or Shift and Add 3 Method   */
  5 /*PIC32MX795F512L-80I/PF                    */
  6 /********************************************/
  7 
  8 #include "xc.h"
  9 
 10 #include "MainBrain32.h"
 11 
 12 void Binary2ASCIIBCD32(unsigned long bcd32)
 13 {
 14     //now display
 15     working_reg = 0;
 16     main_reg = 0;
 17     extra_reg = 0;
 18     
 19     int i;
 20     
 21     for(i=0;i<31;i++)
 22     {
 23         //get carry bit
 24         working_reg = bcd32 & 0x80000000;
 25         working_reg = working_reg >> 31;
 26 
 27         ext_reg = main_reg & 0x80000000;
 28         ext_reg = ext_reg >> 31;
 29                 
 30         bcd32 = bcd32 << 1;
 31 
 32         main_reg = main_reg << 1;
 33         
 34         extra_reg = extra_reg << 1;
 35 
 36         //add carry bit to main register
 37         main_reg = main_reg + working_reg;
 38         extra_reg = extra_reg + ext_reg;
 39         
 40         //nib0
 41          nib0 = main_reg & 0xf;
 42 
 43         if(nib0 > 4)
 44         {
 45             main_reg = main_reg + 0x3;
 46             nib0 = main_reg & 0xf;
 47         }    
 48          
 49         //nib1
 50         nib1 = main_reg & 0xf0;
 51         nib1 = nib1 >> 4;
 52          
 53         if(nib1 > 4)
 54         {
 55             main_reg = main_reg + 0x30;
 56             nib1 = main_reg & 0xf0;
 57             nib1 = nib1 >> 4;
 58         }    
 59          
 60         //nib2
 61         nib2 = main_reg & 0xf00;
 62         nib2 = nib2 >> 8;
 63          
 64         if(nib2 > 4)
 65         {
 66             main_reg = main_reg + 0x300;
 67             nib2 = main_reg & 0xf00;
 68             nib2 = nib2 >> 8;
 69         }    
 70          
 71         //nib3
 72         nib3 = main_reg & 0xf000;
 73         nib3 = nib3 >> 12;
 74          
 75         if(nib3 > 4)
 76         {
 77             main_reg = main_reg + 0x3000;
 78             nib3 = main_reg & 0xf000;
 79             nib3 = nib3 >> 12;
 80         }    
 81          
 82         //nib4
 83         nib4 = main_reg & 0xf0000;
 84         nib4 = nib4 >> 16;
 85          
 86         if(nib4 > 4)
 87         {
 88             main_reg = main_reg + 0x30000;
 89             nib4 = main_reg & 0xf0000;
 90             nib4 = nib4 >> 16;
 91         }    
 92          
 93         //nib5
 94         nib5 = main_reg & 0xf00000;
 95         nib5 = nib5 >> 20;
 96          
 97         if(nib5 > 4)
 98         {
 99             main_reg = main_reg + 0x300000;
100             nib5 = main_reg & 0xf00000;
101             nib5 = nib5 >> 20;
102         }    
103          
104         //nib6
105         nib6 = main_reg & 0xf000000;
106         nib6 = nib6 >> 24;
107          
108         if(nib6 > 4)
109         {
110             main_reg = main_reg + 0x3000000;
111             nib6 = main_reg & 0xf000000;
112             nib6 = nib6 >> 24;
113         }    
114          
115         //nib7
116         nib7 = main_reg & 0xf0000000;
117         nib7 = nib7 >> 28;
118          
119         if(nib7 > 4)
120         {
121             main_reg = main_reg + 0x30000000;
122             nib7 = main_reg & 0xf0000000;
123             nib7 = nib7 >> 28;
124         }    
125          
126         //nib8
127         nib8 = extra_reg & 0xf;
128          
129         if(nib8 > 4)
130         {
131             extra_reg = extra_reg + 0x3;
132             nib8 = extra_reg & 0xf;
133         }    
134          
135         //nib9
136         nib9 = extra_reg & 0xf0;
137         nib9 = nib9 >> 4;
138          
139         if(nib9 > 4)
140         {
141             extra_reg = extra_reg + 0x30;
142             nib9 = extra_reg & 0xf0;
143             nib9 = nib9 >> 4;
144         }    
145                   
146     }
147         
148     //get carry bit
149     working_reg = bcd32 & 0x80000000;
150     working_reg = working_reg >> 31;
151 
152     ext_reg = main_reg & 0x80000000;
153     ext_reg = ext_reg >> 31;
154 
155     bcd32 = bcd32 << 1;
156 
157     main_reg = main_reg << 1;
158 
159     extra_reg = extra_reg << 1;
160 
161     //add carry bit to main register
162     main_reg = main_reg + working_reg;
163     extra_reg = extra_reg + ext_reg;
164 
165     //nib0
166      nib0 = main_reg & 0xf;
167 
168     //nib1
169     nib1 = main_reg & 0xf0;
170     nib1 = nib1 >> 4;
171 
172     //nib2
173     nib2 = main_reg & 0xf00;
174     nib2 = nib2 >> 8;
175 
176     //nib3
177     nib3 = main_reg & 0xf000;
178     nib3 = nib3 >> 12;
179 
180     //nib4
181     nib4 = main_reg & 0xf0000;
182     nib4 = nib4 >> 16;
183 
184     //nib5
185     nib5 = main_reg & 0xf00000;
186     nib5 = nib5 >> 20;
187 
188     //nib6
189     nib6 = main_reg & 0xf000000;
190     nib6 = nib6 >> 24;
191 
192     //nib7
193     nib7 = main_reg & 0xf0000000;
194     nib7 = nib7 >> 28;
195 
196     //nib8
197     nib8 = extra_reg & 0xf;
198 
199     //nib9
200     nib9 = extra_reg & 0xf0;
201     nib9 = nib9 >> 4;
202     
203     return;
204 }
205 
206 
I reserve to use all my legal rights to the original content provided on this page. Everything listed on this page is free to use with the agreement that my name, Larry Knight, is included with every article and listed as the sole owner and that no profits shall be taken without written permission. MainBrain and MainBrain32 is an originl name and shall not be used with out permission.