/********************************************/
/*Debug Code                                */
/*PIC32MX795F512L-80I/PF                    */
/********************************************/

#include "xc.h"
#include "MainBrain32.h"

void display_data(void)
{
    int i;
    int hpos = 325;
    int vpos = 50;

    fore_color = 0x0;

    //convert data
    Binary2ASCIIHex(bcd32);

    WriteChar(hpos, vpos, '<', fore_color);
    hpos = hpos + 15;

    for(i=7;i>=0;i--)
    {
        WriteChar(hpos, vpos, d_hex[i], fore_color);
        hpos = hpos + 15;
    }

    //convert data
    Binary2ASCIIHex(main_reg);

    hpos = 200;

    for(i=7;i>=0;i--)
    {
        WriteChar(hpos, vpos, d_hex[i], fore_color);
        hpos = hpos + 15;
    }

    //convert data
    Binary2ASCIIHex(extra_reg);

    hpos = 160;

    for(i=1;i>=0;i--)
    {
        WriteChar(hpos, vpos, d_hex[i], fore_color);
        hpos = hpos + 15;
    }

    fore_color = 0x2e04;
    hpos = 200;
    vpos = 80;

    Binary2ASCIIHex(working_reg);

    hpos = 200;

    for(i=7;i>=0;i--)
    {
        WriteChar(hpos, vpos, d_hex[i], fore_color);
        hpos = hpos + 15;
    }

    fore_color = 0xC924;
    hpos = 300;
    vpos = 120;

    Binary2ASCIIHex(nib0);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib1);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib2);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;
    
    Binary2ASCIIHex(nib3);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib4);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib5);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib6);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib7);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib8);

    WriteChar(hpos, vpos, d_hex[0], fore_color);

    hpos = hpos - 20;

    Binary2ASCIIHex(nib9);

    WriteChar(hpos, vpos, d_hex[0], fore_color);
    
    return;

}

void Debug32(void)
{
    //now display
    working_reg = 0;
    main_reg = 0;
    extra_reg = 0;
    
    fore_color = 0x0;
    back_color = 0xffff;
    //input register
    bcd32 = 0xffffffff;

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

        ext_reg = main_reg & 0x80000000;
        ext_reg = ext_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 + ext_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;

        ext_reg = main_reg & 0x80000000;
        ext_reg = ext_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 + ext_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;
         
        display_data();    
        
    return;
}

void DS18B20_test(void)
{   
    while(1)
    {
        /*Write 1 Time Slot*/
        TRISAbits.TRISA7 = 0;
        PORTAbits.RA7 = 0;
        //Release the bus 
        TRISAbits.TRISA7 = 1;
        Delay(60);    
    
        /*Write 0 Time Slot*/
        TRISAbits.TRISA7 = 0;
        PORTAbits.RA7 = 0;
        Delay(80);
        //Release the bus 
        TRISAbits.TRISA7 = 1;
    }
    
    
    return;
}