
/********************************************/
/*Binary to ASCII BCD Conversion Code       */
/*Double Dabble or Shift and Add 3 Method   */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include "xc.h"
#include "Binary2ASCIIBCD32.h"
 

void Binary2ASCIIBCD32(int bcd32)
{
    int working_reg = 0;
    int main_reg = 0;
    int extra_reg = 0;
    int i;
    
    for(i=0;i<31;i++)
    {
        //get carry bit
        working_reg = bcd32 & 0x80000000;
        working_reg = working_reg >> 31;

        extra_reg = main_reg & 0x80000000;
        extra_reg = extra_reg >> 31;
                
        bcd32 = bcd32 << 1;

        main_reg = main_reg << 1;
        
        extra_reg = extra_reg << 1;

        //add carry bit to main register
        main_reg = main_reg + working_reg;
        extra_reg = extra_reg + extra_reg;
        
        //nib0
         nib0 = main_reg & 0xf;

        if(nib0 > 4)
        {
            main_reg = main_reg + 0x3;
            nib0 = main_reg & 0xf;
        }    
         
        //nib1
        nib1 = main_reg & 0xf0;
        nib1 = nib1 >> 4;
         
        if(nib1 > 4)
        {
            main_reg = main_reg + 0x30;
            nib1 = main_reg & 0xf0;
            nib1 = nib1 >> 4;
        }    
         
        //nib2
        nib2 = main_reg & 0xf00;
        nib2 = nib2 >> 8;
         
        if(nib2 > 4)
        {
            main_reg = main_reg + 0x300;
            nib2 = main_reg & 0xf00;
            nib2 = nib2 >> 8;
        }    
         
        //nib3
        nib3 = main_reg & 0xf000;
        nib3 = nib3 >> 12;
         
        if(nib3 > 4)
        {
            main_reg = main_reg + 0x3000;
            nib3 = main_reg & 0xf000;
            nib3 = nib3 >> 12;
        }    
         
        //nib4
        nib4 = main_reg & 0xf0000;
        nib4 = nib4 >> 16;
         
        if(nib4 > 4)
        {
            main_reg = main_reg + 0x30000;
            nib4 = main_reg & 0xf0000;
            nib4 = nib4 >> 16;
        }    
         
        //nib5
        nib5 = main_reg & 0xf00000;
        nib5 = nib5 >> 20;
         
        if(nib5 > 4)
        {
            main_reg = main_reg + 0x300000;
            nib5 = main_reg & 0xf00000;
            nib5 = nib5 >> 20;
        }    
         
        //nib6
        nib6 = main_reg & 0xf000000;
        nib6 = nib6 >> 24;
         
        if(nib6 > 4)
        {
            main_reg = main_reg + 0x3000000;
            nib6 = main_reg & 0xf000000;
            nib6 = nib6 >> 24;
        }    
         
        //nib7
        nib7 = main_reg & 0xf0000000;
        nib7 = nib7 >> 28;
         
        if(nib7 > 4)
        {
            main_reg = main_reg + 0x30000000;
            nib7 = main_reg & 0xf0000000;
            nib7 = nib7 >> 28;
        }    
         
        //nib8
        nib8 = extra_reg & 0xf;
         
        if(nib8 > 4)
        {
            extra_reg = extra_reg + 0x3;
            nib8 = extra_reg & 0xf;
        }    
         
        //nib9
        nib9 = extra_reg & 0xf0;
        nib9 = nib9 >> 4;
         
        if(nib9 > 4)
        {
            extra_reg = extra_reg + 0x30;
            nib9 = extra_reg & 0xf0;
            nib9 = nib9 >> 4;
        }    
                  
    }
        
    //get carry bit
    working_reg = bcd32 & 0x80000000;
    working_reg = working_reg >> 31;

    extra_reg = main_reg & 0x80000000;
    extra_reg = extra_reg >> 31;

    bcd32 = bcd32 << 1;

    main_reg = main_reg << 1;

    extra_reg = extra_reg << 1;

    //add carry bit to main register
    main_reg = main_reg + working_reg;
    extra_reg = extra_reg + extra_reg;

    //nib0
     nib0 = main_reg & 0xf;

    //nib1
    nib1 = main_reg & 0xf0;
    nib1 = nib1 >> 4;

    //nib2
    nib2 = main_reg & 0xf00;
    nib2 = nib2 >> 8;

    //nib3
    nib3 = main_reg & 0xf000;
    nib3 = nib3 >> 12;

    //nib4
    nib4 = main_reg & 0xf0000;
    nib4 = nib4 >> 16;

    //nib5
    nib5 = main_reg & 0xf00000;
    nib5 = nib5 >> 20;

    //nib6
    nib6 = main_reg & 0xf000000;
    nib6 = nib6 >> 24;

    //nib7
    nib7 = main_reg & 0xf0000000;
    nib7 = nib7 >> 28;

    //nib8
    nib8 = extra_reg & 0xf;

    //nib9
    nib9 = extra_reg & 0xf0;
    nib9 = nib9 >> 4;
    
    nib9 = nib9 + 48;
    nib8 = nib8 + 48;
    nib7 = nib7 + 48;
    nib6 = nib6 + 48;
    nib5 = nib5 + 48;
    nib4 = nib4 + 48;
    nib3 = nib3 + 48;
    nib2 = nib2 + 48;
    nib1 = nib1 + 48;
    nib0 = nib0 + 48;
    
    return;
}

