/* 
Main.c
Larry Knight
MainBrain32
Revision 1.7 2022
PIC32MX795F512L-80I/PF
PIC32MX695F512L-80I/PF
*/
//Headers
#include <xc.h>
#include <sys/attribs.h>
#include <stdint.h>

#include "hardware.h"

#pragma config FMIIEN = OFF             // Ethernet RMII/MII Enable (MII Enabled)
#pragma config FETHIO = OFF             // Ethernet I/O Pin Select (Default Ethernet I/O)
#pragma config FUSBIDIO = OFF           // USB USID Selection (Controlled by the USB Module)
#pragma config FVBUSONIO = OFF          // USB VBUS ON Selection (Controlled by USB Module)
#pragma config FNOSC = PRIPLL           // Oscillator Selection Bits 
#pragma config POSCMOD = EC             // Primary Oscillator Configuration
#pragma config FPLLIDIV = DIV_6         // PLL Input Divider
#pragma config FSOSCEN = ON             // Secondary Oscillator Enable (Disabled)
#pragma config FPLLMUL = MUL_20         // PLL Multiplier 
#pragma config FPLLODIV = DIV_1         // System PLL Output Clock Divider 
#pragma config FPBDIV = DIV_1           // Peripheral Clock Divisor 
#pragma config UPLLIDIV = DIV_6         // USB PLL Input Divider
#pragma config UPLLEN = ON              // USB PLL Enable (Enabled)
#pragma config IESO = OFF               // Internal/External Switch Over (Enabled)
#pragma config OSCIOFNC = OFF            // CLKO Output Signal Active on the OSCO Pin 
#pragma config WDTPS = PS1              // Watchdog Timer Postscaler (1:1048576)
#pragma config FWDTEN = OFF             // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
#pragma config FCKSM = CSDCMD           // Clock Switching and Monitor Selection (Clock Switch Enable, FSCM Enabled)
#pragma config DEBUG = OFF              // Background Debugger
#pragma config FSRSSEL = PRIORITY_7     // All interrupt priorities are assigned to a shadow register set
#pragma config ICESEL = ICS_PGx1 

//Primary Oscillator Frequency
unsigned int PRI_FREQ = 20000000;

//Secondary Oscillator Frequency
unsigned int SEC_FREQ = 32768;

//Size of Dual Port RAM
unsigned int RAM_SIZE = 8191;

void main()
{    
    //Wait for PLL Lock
    while(!OSCCONbits.SLOCK);
    
    SYSKEY = 0x0;               // ensure OSCCON is locked
    SYSKEY = 0xAA996655;        // Write Key1 to SYSKEY
    SYSKEY = 0x556699AA;        // Write Key2 to SYSKEY

    //enable secondary oscillator
    OSCCONbits.SOSCEN = 1;    
    //wait for warm up
    while(OSCCONbits.SOSCRDY == 0);
    
    //Data Memory SRAM wait states: Default Setting = 1; set it to 0
    BMXCONbits.BMXWSDRM = 0;

    //Flash PM Wait States: MX Flash runs at 2 wait states @ 80 MHz
    CHECONbits.PFMWS = 2;

    //Prefetch-cache: Enable prefetch for cacheable PFM instructions
    CHECONbits.PREFEN = 1;

    //Disable JTAG Port
    DDPCONbits.JTAGEN = 0;
    
    //Set the Core Timer compare value
    //10 interrupts per second
    int CorTimer_Compare = 4800000;
    _CP0_SET_COMPARE(CorTimer_Compare);
    
    //Setup the GPO-2 pins as inputs
    //GP0
    TRISCbits.TRISC15 = 1;
    //GP1
    TRISAbits.TRISA15 = 1;
    //GP2
    TRISDbits.TRISD8 = 1;
    
    //Initialize the LED Data Port
    LED_Port_Init();

    //Beep speaker
    TRISDbits.TRISD14 = 0;
    int i;
    for(i=0;i<200;i++)
    {
        PORTDbits.RD14 = 0;
        Delay(20000);
        PORTDbits.RD14 = 1;
        Delay(20000);
    }

    //Initialize the Interrupts
    Interrupts_Init();

    //Initialize the Parallel Master Port
    PMP_Init();
    
    //Initialize the Dual Port SRAM
    REN70V05_Init();
    
    //Test SRAM
    memtest_70V05();
    
    //Initialize the ADC
    ADC_Init();
   
    //Initialize Timers
    Timer2_Init();
    Timer3_Init();
    Timer4_Init();
    Timer5_Init();
    
    //Initialize Flash Memory
    Flash_Init();

    //get number of used bytes
    unsigned d = PMADDR;
    Flash_Get_Bytes_Used();
    PMADDR = d;
    
    //Initialize the Display
    HX8357B_Init();            
    
    //control is with a P-channel MOSFET
    //so the higher the number, the dimmer
    //the screen
    Backlight_Control(5);
                
    //RTC_Init
    RTC_Init();
        
    //Clear the Core Timer
    _CP0_SET_COUNT(0);
        
    //Global Enable IUnterrupts
    __builtin_enable_interrupts();  
    
    //Clear the Screen
    HX8357B_CLRSCN(0xffff);
    
    //Turn on the Display
    HX8357B_DISPON();

//    //Load Splash Image
//    HX8357B_CASET(0, 479);
//    HX8357B_RASET(120, 170);
//    HX8357B_RAMWR();
//
//    //Data
//    //RF3 = D/C 1=Data, 0=Command
//    PORTFbits.RF3 = 1;                    
//    for(int i=0;i<=23040; i++)
//    {
//        PMDIN = ~SplashImage[i*2];
//        while(PMMODEbits.BUSY == 1);    
//    }

    //Select Display (/CS)    
    PORTFbits.RF13 = 0;
    
//    Speaker_Control(10000);
//    LongDelay(1);
//    Speaker_Control(0);
    
    //Show the splash screen for 5 seconds
    //LongDelay(5);
    //Home_Screen();
         //USB Init
    //setup my pointer
//    pBDT = (uint32_t *)addr;
    
    USBInit();
    //USB_Host();
//    BDT[0] = 0x400084;
//    while(BDT[0] != 0x080034);
//    BDT[4] = 0x1800c4;
////    while(BDT[4] = 0x180084);
//    BDT[6] = 0x430084;
            
       
    // USB_Screen();   
     //Oscillator_Screen();
    
    //DisplayData(); 
        
    while(1)
    {
//        if(USB_STATE == DEFAULT)
//        {
//            BDT[0].UOWN = 1;
//            while(BDT[0].UOWN);
//            LED7 = 1;
//            
//            if(bRequest == GET_DESCRIPTOR)
//            {
//                BDT[5].FULL_DWORD = ((uint32_t)&device_dsc[0] & 0x1fffffff);
//                BDT[4].FULL_DWORD = 0x120000;
////                BDT[4].DATA0 = 1;
//                BDT[4].UOWN = 1;
//                while(BDT[4].UOWN);
//
//                BDT[6].UOWN = 1;
//                while(BDT[6].UOWN);
//
//                BDT[2].FULL_DWORD = 0;
//                BDT[2].UOWN = 1;
//                while(BDT[2].UOWN);
//                
//                
//                LED6 = 1;                
//            }
//
//            //A RESET should occur here
//            
//            if(bRequest == SET_ADDRESS)
//            {
////                BDT[5].FULL_DWORD = ((uint32_t)&device_dsc[0] & 0x1fffffff);
////                BDT[4].FULL_DWORD = 0x120000;
////                BDT[4].DATA0 = 1;
////                BDT[4].UOWN = 1;
////                while(BDT[4].UOWN);
//                LED5 = 1;
//            }
//            
////            IEC1bits.USBIE = 0;
////            while(1);
//            
//            
//        }
        //USB();
        DisplayData();  
//        while(BDT[0].UOWN = 1);
    }
}   
void DebugPacketData(void)
{
    fore_color = 0;
    back_color = 0xffff;
    hchar = 10;
    ///////////////////////////////////////////////
    //EP0 Even Out
    ///////////////////////////////////////////////
    //pBDT = pBDT + 100;
    
    int i;
    Binary2ASCIIHex(BDT[0].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
    
    hchar = hchar + 20;

    for(i=0;i<=7;i++)
    {   
        Binary2ASCIIHex((uint8_t)EP0_0_Buffer[i]);
        Write_Char(hchar, vchar, d_hex[1], 0x203F);  
        Write_Char(hchar, vchar, d_hex[0], 0x203F);        
    }
    
    hchar = hchar + 20;
    
    Binary2ASCIIHex((uint8_t)dump);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = 10;
    vchar = vchar + 20;

    Binary2ASCIIHex(BDT[2].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
    
    hchar = hchar + 20;

    for(i=0;i<=7;i++)
    {   
        Binary2ASCIIHex((uint8_t)EP0_1_Buffer[i]);
        Write_Char(hchar, vchar, d_hex[1], 0x203F);  
        Write_Char(hchar, vchar, d_hex[0], 0x203F);        
    }
    
    hchar = hchar + 20;
    
    Binary2ASCIIHex((uint8_t)dump);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = 10;
    vchar = vchar + 25;

    
}

void DisplayData(void)
{
    fore_color = 0;
    back_color = 0xffff;
        
    //BDT base address
    hchar = 200;
    vchar = 10;
    Write_Char(hchar, vchar, 0x42, fore_color);    
    Write_Char(hchar, vchar, 0x44, fore_color);    
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);
    
    Binary2ASCIIHex((uint32_t)&BDT[0]);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //Base address registers
    hchar = 10;
    vchar = 10;
    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x42, fore_color);    
    Write_Char(hchar, vchar, 0x44, fore_color);    
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x33, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1BDTP3);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = 10;
    vchar = 30;
    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x42, fore_color);    
    Write_Char(hchar, vchar, 0x44, fore_color);    
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x32, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1BDTP2);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = hchar + 20;
    vchar = 30;
    Write_Char(hchar, vchar, 0x52, fore_color);    
    Write_Char(hchar, vchar, 0x65, fore_color);    
    Write_Char(hchar, vchar, 0x73, fore_color);    
    Write_Char(hchar, vchar, 0x65, fore_color);    
    Write_Char(hchar, vchar, 0x74, fore_color);    
    Write_Char(hchar, vchar, 0x73, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(RESETCount);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = hchar + 20;
    vchar = 30;
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x52, fore_color);    
    Write_Char(hchar, vchar, 0x4e, fore_color);    
    Write_Char(hchar, vchar, 0x49, fore_color);    
    Write_Char(hchar, vchar, 0x46, fore_color);    
    Write_Char(hchar, vchar, 0x73, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(TRNIFCount);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = 10;
    vchar = 50;
    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x42, fore_color);    
    Write_Char(hchar, vchar, 0x44, fore_color);    
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1BDTP1);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = 10;
    vchar = 75;
    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x49, fore_color);    
    Write_Char(hchar, vchar, 0x52, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1IR);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);


    //Interrupt error register U1EIR
    hchar = 150;
    vchar = 75;

    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x45, fore_color);    
    Write_Char(hchar, vchar, 0x49, fore_color);    
    Write_Char(hchar, vchar, 0x52, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1EIR);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //Status register U1STAT
    hchar = 300;
    vchar = 75;

    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x53, fore_color);    
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x41, fore_color);    
    Write_Char(hchar, vchar, 0x54, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(usb_status_reg);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //Address register U1ADDR
    hchar = 10;
    vchar = 100;

    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x41, fore_color);    
    Write_Char(hchar, vchar, 0x44, fore_color);    
    Write_Char(hchar, vchar, 0x44, fore_color);    
    Write_Char(hchar, vchar, 0x52, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1ADDR);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
    //Address register U1ADDR
    hchar = 180;
    vchar = 100;

    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x45, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x30, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1EP0);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
    //Address register U1ADDR
    hchar = 350;
    vchar = 100;

    Write_Char(hchar, vchar, 0x55, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x43, fore_color);    
    Write_Char(hchar, vchar, 0x4f, fore_color);    
    Write_Char(hchar, vchar, 0x4e, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(U1CON);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    //EP0-0 OUT EVEN BD
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
    hchar = 10;
    vchar = 140;

    Write_Char(hchar, vchar, 0x45, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x30, fore_color);    
    Write_Char(hchar, vchar, 0x2d, fore_color);    
    Write_Char(hchar, vchar, 0x30, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(BDT[0].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
    hchar = hchar + 20;
    Binary2ASCIIHex(BDT[1].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //EP0-1 OUT ODD BD
    hchar = 10;
    vchar = 160;

    Write_Char(hchar, vchar, 0x45, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x30, fore_color);    
    Write_Char(hchar, vchar, 0x2d, fore_color);    
    Write_Char(hchar, vchar, 0x31, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(BDT[2].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = hchar + 20;
    Binary2ASCIIHex(BDT[3].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //EP0-2 IN EVEN BD
    hchar = 10;
    vchar = 180;

    Write_Char(hchar, vchar, 0x45, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x30, fore_color);    
    Write_Char(hchar, vchar, 0x2d, fore_color);    
    Write_Char(hchar, vchar, 0x32, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(BDT[4].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = hchar + 20;
    Binary2ASCIIHex(BDT[5].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //EP0-3 IN ODD BD
    hchar = 10;
    vchar = 200;

    Write_Char(hchar, vchar, 0x45, fore_color);    
    Write_Char(hchar, vchar, 0x50, fore_color);    
    Write_Char(hchar, vchar, 0x30, fore_color);    
    Write_Char(hchar, vchar, 0x2d, fore_color);    
    Write_Char(hchar, vchar, 0x33, fore_color);    
    Write_Char(hchar, vchar, 0x3a, fore_color);  

    Binary2ASCIIHex(BDT[6].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = hchar + 20;
    Binary2ASCIIHex(BDT[7].FULL_DWORD);
    Write_Char(hchar, vchar, d_hex[7], 0x203F);  
    Write_Char(hchar, vchar, d_hex[6], 0x203F);
    Write_Char(hchar, vchar, d_hex[5], 0x203F);  
    Write_Char(hchar, vchar, d_hex[4], 0x203F);
    Write_Char(hchar, vchar, d_hex[3], 0x203F);  
    Write_Char(hchar, vchar, d_hex[2], 0x203F);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    //EP0-0 Buffer
    hchar = 10;
    vchar = 230;

    ///////////////////////////////////////////////
    //EP0 Even Out
    ///////////////////////////////////////////////
    //pBDT = pBDT + 100;
    int i;
    for(i=0;i<=7;i++)
    {   
        Binary2ASCIIHex((uint8_t)EP0_0_Buffer[i]);
        Write_Char(hchar, vchar, d_hex[1], 0x203F);  
        Write_Char(hchar, vchar, d_hex[0], 0x203F);
        
        hchar = hchar + 10;
        
        if(hchar > 350)
        {
            hchar = 10;
            vchar = vchar + 20;
        }
    }
    
    hchar = 10;
    vchar = 250;
    ///////////////////////////////////////////////
    //EP0 Odd Out
    ///////////////////////////////////////////////
    for(i=0;i<=7;i++)
    {   
        Binary2ASCIIHex((uint8_t)EP0_1_Buffer[i]);
        Write_Char(hchar, vchar, d_hex[1], 0x203F);  
        Write_Char(hchar, vchar, d_hex[0], 0x203F);
        
        hchar = hchar + 10;
        
        if(hchar > 350)
        {
            hchar = 10;
            vchar = vchar + 20;
        }
    }
    
    hchar = 10;
    vchar = 275;
    ///////////////////////////////////////////////
    //bRequest
    ///////////////////////////////////////////////
    Write_Char(hchar, vchar, 0x62, 0);  
    Write_Char(hchar, vchar, 0x52, 0);
    Write_Char(hchar, vchar, 0x65, 0);  
    Write_Char(hchar, vchar, 0x71, 0);  
    Write_Char(hchar, vchar, 0x3a, 0);
    
    Binary2ASCIIHex(bRequest);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
        
    hchar = hchar + 10;
    ///////////////////////////////////////////////
    //PID
    ///////////////////////////////////////////////
    Write_Char(hchar, vchar, 0x50, 0);  
    Write_Char(hchar, vchar, 0x49, 0);
    Write_Char(hchar, vchar, 0x44, 0);  
    Write_Char(hchar, vchar, 0x3a, 0);
    
    Binary2ASCIIHex((uint8_t)PID);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);
    
    hchar = hchar + 10;
    ///////////////////////////////////////////////
    //wValue
    ///////////////////////////////////////////////
    Write_Char(hchar, vchar, 0x77, 0);  
    Write_Char(hchar, vchar, 0x56, 0);  
    Write_Char(hchar, vchar, 0x61, 0);  
    Write_Char(hchar, vchar, 0x6c, 0);  
    Write_Char(hchar, vchar, 0x75, 0);
    Write_Char(hchar, vchar, 0x65, 0);  
    Write_Char(hchar, vchar, 0x3a, 0);
    
    Binary2ASCIIHex((uint8_t)wValue);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

    hchar = hchar + 10;
    ///////////////////////////////////////////////
    //dump
    ///////////////////////////////////////////////
    Write_Char(hchar, vchar, 0x64, 0);  
    Write_Char(hchar, vchar, 0x75, 0);  
    Write_Char(hchar, vchar, 0x6d, 0);
    Write_Char(hchar, vchar, 0x70, 0);  
    Write_Char(hchar, vchar, 0x3a, 0);
    
//    vchar = vchar - (TRNIFCount * 20);
    Binary2ASCIIHex((uint8_t)dump);
    Write_Char(hchar, vchar, d_hex[1], 0x203F);  
    Write_Char(hchar, vchar, d_hex[0], 0x203F);

}