vc6.0 提取*.lst文件,中函数地址,数据地址,应用实例 红色部分显示

本文介绍了如何在VC6.0环境下,通过读取.lst文件来提取函数和变量的地址。文章详细展示了代码实现,包括结构体定义、全局指针、内存读取等步骤,同时提供了打开USB设备和处理.list文件的示例。通过此方法,可以方便地查看和操作程序中的函数和变量地址。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// tdebugDlg.cpp : implementation file
//


#include "stdafx.h"
#include "tdebug.h"
#include "tdebugDlg.h"
#include "usbprt.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////global pointer to a file/////////////
FILE *pf; 






struct g_variables_functions{
int cnt;
unsigned  long addr[2000];
unsigned  long  len[2000];
char  name[2000][100];
unsigned  value[2000];


} g_v,g_f;


union type_change{
unsigned char byte[8];
unsigned char us_char;
char s_char;
unsigned __int16 us_short;
__int16 s_short;
unsigned __int32 us_long;
__int32 s_long;
unsigned __int64 us_long_long;
__int64 s_long_long;
float s_float;


} g_type;


/////////////////////////////////////////////////////////////////////////////
// CTdebugDlg dialog


CTdebugDlg::CTdebugDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTdebugDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTdebugDlg)
m_auto_detect = FALSE;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CTdebugDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTdebugDlg)
DDX_Control(pDX, IDC_BUTTON10, m_btn_step);
DDX_Control(pDX, IDC_BUTTON9, m_btn_docmd);
DDX_Control(pDX, IDC_EDIT4, m_edit_tcdbcmd);
DDX_Control(pDX, IDC_COMBO3, m_comb_device);
DDX_Control(pDX, IDC_COMBO2, m_comb_type);
DDX_Control(pDX, IDC_COMBO1, m_comb_bus);
DDX_Control(pDX, IDC_CHECK2, m_check2);
DDX_Control(pDX, IDC_USB, m_btn_usb);
DDX_Control(pDX, IDC_BUTTON8, m_btn_clrbk);
DDX_Control(pDX, IDC_BUTTON7, m_btn_clr);
DDX_Control(pDX, IDC_CHECK4, m_check_tcpc);
DDX_Control(pDX, IDC_CHECK3, m_bk_check);
DDX_Control(pDX, IDC_STATIC_CFG, m_bd_cfg);
DDX_Control(pDX, IDC_CHECK1, m_check1);
DDX_Control(pDX, IDC_BUTTON5, m_btn_stop);
DDX_Control(pDX, IDC_BUTTON6, m_btn_run);
DDX_Control(pDX, IDC_BUTTON3, m_btn_rst);
DDX_Control(pDX, IDC_STATIC_INF, m_info);
DDX_Control(pDX, IDC_BUTTON4, m_btn_mode);
DDX_Control(pDX, IDC_BUTTON1, m_btn_update);
DDX_Control(pDX, IDC_STATIC3, m_static_data);
DDX_Control(pDX, IDC_STATIC2, m_static_addr);
DDX_Control(pDX, IDC_STATIC1, m_board1);
DDX_Control(pDX, IDC_EDIT3, m_edit3);
DDX_Control(pDX, IDC_EDIT2, m_edit2);
DDX_Control(pDX, IDC_EDIT1, m_edit1);
DDX_Check(pDX, IDC_CHECK2, m_auto_detect);
DDX_Control(pDX,IDC_CUSTOM1,m_grid);
//}}AFX_DATA_MAP
//DDX_Control(pDX,IDC_CUSTOM1,m_grid);
}


BEGIN_MESSAGE_MAP(CTdebugDlg, CDialog)
//{{AFX_MSG_MAP(CTdebugDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
ON_EN_SETFOCUS(IDC_EDIT3, OnSetfocusEdit3)
ON_EN_KILLFOCUS(IDC_EDIT2, OnKillfocusEdit2)
ON_WM_CTLCOLOR()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON5, OnButton5)
ON_BN_CLICKED(IDC_BUTTON6, OnButton6)
ON_BN_CLICKED(IDC_CHECK3, OnCheck3)
ON_BN_CLICKED(IDC_BUTTON7, OnButton7)
ON_BN_CLICKED(IDC_BUTTON8, OnButton8)
ON_BN_CLICKED(IDC_USB, OnUsb)
ON_BN_CLICKED(IDC_CHECK2, OnCheck2)
ON_BN_CLICKED(IDC_BUTTON9, OnButton9)
ON_BN_CLICKED(IDC_BUTTON10, OnButton10)
//}}AFX_MSG_MAP
ON_NOTIFY(NM_CLICK, IDC_CUSTOM1, OnGridClick)
ON_NOTIFY(GVN_ENDLABELEDIT, IDC_CUSTOM1, OnGridEndEdit)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CTdebugDlg message handlers


BOOL CTdebugDlg::OnInitDialog()
{


    if(__argc >=2)
{
m_usb_id = strtol(__argv[1],NULL,16);


}
else
{
        m_usb_id = 0xffff;
}




CDialog::OnInitDialog();


nFullWidth=GetSystemMetrics(SM_CXSCREEN); 
nFullHeight=GetSystemMetrics(SM_CYSCREEN);


// Set the icon for this dialog.  The framework does this automatically
//  when the application's main window is not a dialog
CFont a; 
a.CreateFont( 24, 0, 0, 0, FW_NORMAL, FALSE, FALSE, 0, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T( "宋体" ) ); 
m_info.SetFont(&a);
m_info.GetDC()->SetTextColor(RGB(255,0,0));

m_info.SetWindowText("device ok");




////////////////set the grid /////////////////////////////////////////
m_ImageList.Create(MAKEINTRESOURCE(IDB_BITMAP1), 16, 2, RGB(255,255,255));
m_grid.SetImageList(&m_ImageList);  //绑定grid控件和 图片列表
// m_grid.SetEditable(true);


m_grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); //黄色背景
m_grid.SetTextColor(RGB(0x00, 0x00, 0xff));
//m_grid.SetFixedTextColor(RGB(0xff, 0x00, 0x00)); //表头的字体颜色


OnUsb();


    unsigned char test_buf[8];
ReadMem(m_usb_handle,0x0000,test_buf,4,1);
ReadMem(m_usb_handle,0x0000,test_buf,4,4);


m_nTextLen = 0x100000;
m_edit1.SetLimitText(m_nTextLen);


return TRUE;  // return TRUE  unless you set the focus to a control
}


// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.


void CTdebugDlg::OnPaint() 
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting


SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);


// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;


// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{

CDialog::OnPaint();
}
}


// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTdebugDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}


void CTdebugDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
int i,j;
unsigned long addr_start,addr_end,addr_now;
unsigned char buf[1024*32];
unsigned char *pt;
CString str;

// unsigned char buf[32];
if(grid_mode == 0)
{


// addr_start = g_v.addr[0]; //get the start of the ".bss" section
// addr_end = g_v.addr[g_v.cnt-1] + g_v.len[g_v.cnt - 1]; // the end of the ".bss" section



if(m_usb_handle == NULL)
{
//MessageBox("no usb device!!");
debug_print("no usb device!");
}
else if(bss_end < bss_end)
{
//MessageBox("start addr is bigger than end addr!");
debug_print("start addr is bigger than end addr!");
}
else
{


ReadMem(m_usb_handle,bss_start,buf,bss_end-bss_start,device_type);
/*
addr_now = addr_start;
pt = buf; 
i = 0;

do
{
if(addr_now == g_v.addr[i])
{
for(j=0;j<8;j++){
g_type.byte[j] = pt[j];

}

pt = pt + g_v.len[i];
addr_now = addr_now + g_v.len[i];

if(g_v.len[i] == 1)
str.Format("0x%02x",g_type.us_char);
else if(g_v.len[i] == 2)
str.Format("0x%04x",g_type.us_short);
else if(g_v.len[i] == 4)
str.Format("0x%08x",g_type.us_long);
else if(g_v.len[i] > 4)
{
//str.Format("click to get value");
str.Format("");
m_grid.SetItemImage(i+1,3,5);
}
//str.Format("0x%02x%02x%02x%02x",g_type.byte[3],g_type.byte[2],g_type.byte[1],g_type.byte[0]);

//////////////set the m_grid///////////////////
m_grid.SetItemText(i+1,3,str);

//////////////end of m_grid ///////////////////
i++;
}
else
{
pt++;
addr_now++;
}*/


for(i =0;i<g_v.cnt;i++)
{
for(j=0;j<8;j++){
addr_start = g_v.addr[i] - bss_start;
g_type.byte[j] = buf[j+addr_start];
}
if(g_v.len[i] == 1)
str.Format("0x%02x",g_type.us_char);
else if(g_v.len[i] == 2)
str.Format("0x%04x",g_type.us_short);
else if(g_v.len[i] == 4)
str.Format("0x%08x",g_type.us_long);
else if(g_v.len[i] > 4)
{
//str.Format("click to get value");
str.Format("");
m_grid.SetItemImage(i+1,3,5);
}
//str.Format("0x%02x%02x%02x%02x",g_type.byte[3],g_type.byte[2],g_type.byte[1],g_type.byte[0]);

//////////////set the m_grid///////////////////
if(g_v.len[i] != 0)
m_grid.SetItemText(i+1,3,str);
else
{
m_grid.SetItemText(i+1,3,"len=0");
m_grid.SetItemImage(i+1,3,7);
}
//////////////end of m_grid ///////////////////








//m_grid.AutoSize();
}
m_grid.Refresh();
}
}
else
{
//MessageBox("must set variables mode");
debug_print("must set variable mode");


}

}
// write the memory.
void CTdebugDlg::OnButton2() 
{
// TODO: Add your control notification handler code here
CWnd *pwnd=GetDlgItem(IDC_EDIT4);
if(GetFocus()==pwnd)
{
// MessageBox("test");
OnButton9();
}
else
{
CString str;
CString tcdb_str;

unsigned char buf[4];
long addr;
unsigned long  value;
int     i;
int     byte_length;
CString  str_device;


if(m_comb_type.GetCurSel() == 0)
{
byte_length=1;
}
else if(m_comb_type.GetCurSel() == 1)
{
byte_length=2;
}
else
{
byte_length=4;
}


//if(m_comb_device.GetCurSel()==0)
if(device_type == 4)
{
str_device="";
}
else
{
str_device="-u";
}


m_edit2.GetWindowText(str);
addr = strtol(str,NULL,16);

m_edit3.GetWindowText(str);
value = strtol(str,NULL,16);




if(strcmp(str,"") != 0)
{
//buf[0] = value;
switch(m_comb_bus.GetCurSel())
{
case 0:
for(i=0;i<byte_length;i++)
{
buf[i] = value&0xff;
value=value>>8;
}
WriteMem(m_usb_handle,addr,buf,byte_length,device_type);
break;
/* case 1:
str.Format("wa %04x %04x %s",addr,value,str_device);
tcdb_cmd(str);
break;*/
case 1:
str.Format("wf %04x %04x %s",addr,value,str_device);
tcdb_cmd(str);
break;
default:
break;
}
}




str.Format("## write %04x",addr);
debug_print(str);

}

}




void CTdebugDlg::debug_print(CString   str)
{
#if 0
CString str_text;
int cnt,i;
char cstr[1000];
//char    temp_buff[64*1024];
int nLength;



/*
m_edit1.GetWindowText(str_text);

nLength = m_edit1.GetWindowTextLength();
cnt = m_edit1.GetLineCount();
if(cnt >= 180)
{
m_edit1.GetLine(cnt-180,cstr,1000);
str_text =  str_text.Right(str_text.GetLength() - strlen(cstr));
}
m_edit1.SetSel(nLength, 0);
m_edit1.ReplaceSel(str_text);  */

m_edit1.GetWindowText(str_text);


str_text += str;
//str_text += "\r\n";  

m_edit1.SetWindowText(str_text);
//nLength = m_edit1.GetWindowTextLength();
//m_edit1.SetSel(nLength, nLength);
//m_edit1.ReplaceSel(str_text); 




for(i=0;i<100;i++)
cstr[i]=0;


// m_edit1.GetWindowText(str_text);
// str_text=str_text+"\r\n"+str;






// m_edit1.SetWindowText(str_text);






cnt = m_edit1.GetLineCount();
if(cnt >= 180)
{

//memcpy(buf,0,100);
m_edit1.GetLine(cnt-180,cstr,1000);
// cc = strlen(buf);
m_edit1.SetSel(0,strlen(cstr)+1);
m_edit1.ReplaceSel("");
}

int index = m_edit1.GetLineCount();
m_edit1.LineScroll(index); 
#endif
int len = m_edit1.GetWindowTextLength();
int nstep = m_nTextLen  / 8;
if (len >= nstep * 7) {
m_edit1.SetSel (0, nstep*6);
m_edit1.ReplaceSel ("");
len = m_edit1.GetWindowTextLength();
}
m_edit1.SetSel (len, len);
m_edit1.ReplaceSel (str);


}


void CTdebugDlg::debug_printx(unsigned char *buf,unsigned int len)
{
#if 0
CString str_text,str;


int cnt,i;
char cstr[1024*16];


for(i=0;i<100;i++)
cstr[i]=0;


m_edit1.GetWindowText(str_text);
//str_text = str_text + "\r\n";

for(i = 0;i<len;i++)
{
if(i%16 == 8)
{
str_text = str_text + " ";
}
if(i % 16 == 0)
{
str.Format("\r\n%04x:",i);
str_text = str_text + str;
}
str.Format("%02x",buf[i]);
str_text = str_text + " " + str;
}


str_text=str_text+"\r\n";


m_edit1.SetWindowText(str_text);


cnt = m_edit1.GetLineCount();
if(cnt >= 180)
{

//memcpy(buf,0,100);
m_edit1.GetLine(cnt-180,cstr,1024*8);
// cc = strlen(buf);
m_edit1.SetSel(0,strlen(cstr)+1);
m_edit1.ReplaceSel("");
}

int index = m_edit1.GetLineCount();
m_edit1.LineScroll(index);
#endif
#if 1
CString str_text,str;
int cnt,i;
for(i = 0;i<len;i++)
{
if(i%16 == 8)
{
str_text = str_text + " ";
}
if(i % 16 == 0)
{
str.Format("\r\n%04x:",i);
str_text = str_text + str;
}
str.Format("%02x",buf[i]);
str_text = str_text + " " + str;
}


str_text=str_text+"\r\n";
int m_len = m_edit1.GetWindowTextLength();
int nstep = m_nTextLen  / 8;
if (m_len >= nstep * 7) {
m_edit1.SetSel (0, nstep*6);
m_edit1.ReplaceSel ("");
m_len = m_edit1.GetWindowTextLength();
}
m_edit1.SetSel (m_len, m_len);
m_edit1.ReplaceSel (str_text);


#endif


}






void CTdebugDlg::OnGridClick(NMHDR *pNotifyStruct, LRESULT* /*pResult*/)
{
NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
unsigned char buf[1024*16];
long addr;
int i;
CString str;


if(m_usb_handle != NULL)
{
if(grid_mode == 0)
{

if((pItem->iRow == 0) && (pItem->iColumn == 1))
{
///////////////make the addr to be increase order/////////////////////

int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_v.cnt;i++)
for(j=i;j>0;j--)
{
if(g_v.addr[j] < g_v.addr[j-1])
{
temp = g_v.addr[j];
g_v.addr[j] = g_v.addr[j-1];
g_v.addr[j-1] = temp;


temp = g_v.len[j];
g_v.len[j] = g_v.len[j-1];
g_v.len[j-1] = temp;


strcpy(temp_str,g_v.name[j]);
strcpy(g_v.name[j],g_v.name[j-1]);
strcpy(g_v.name[j-1],temp_str);




}
}


this->grid_display();


}
else if((pItem->iRow == 0) && (pItem->iColumn == 0))
{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_v.cnt;i++)
for(j=i;j>0;j--)
{
if(strcmp(g_v.name[j],g_v.name[j-1]) < 0)
{
temp = g_v.addr[j];
g_v.addr[j] = g_v.addr[j-1];
g_v.addr[j-1] = temp;


temp = g_v.len[j];
g_v.len[j] = g_v.len[j-1];
g_v.len[j-1] = temp;


strcpy(temp_str,g_v.name[j]);
strcpy(g_v.name[j],g_v.name[j-1]);
strcpy(g_v.name[j-1],temp_str);




}
}
this->grid_display();
}
else if(m_grid.GetItemImage(pItem->iRow,pItem->iColumn) == 5)
{
addr = g_v.addr[pItem->iRow-1];
i = 0;


str.Format("## Memory read Addr %04x: ",addr);
debug_print(str);





ReadMem(m_usb_handle,addr,buf,g_v.len[pItem->iRow - 1],device_type);


debug_printx(buf,g_v.len[pItem->iRow - 1]);
}
}
else if(grid_mode == 1)
{
if((pItem->iRow == 0) && (pItem->iColumn == 3))
{
for(i=0;i<g_f.cnt;i++)
{   g_f.value[i] = 0;
m_grid.SetItemImage(i+1,3,1);
}
bkpoint = 0;
bk_ctl[0] = 0;
bk_ctl[1] = 0;
bk_ctl[2] = 0;
bk_ctl[3] = 0;
buf[0] = 0x00;
WriteMem(m_usb_handle,0x613,buf,1,device_type);
WriteMem(m_usb_handle,0x617,buf,1,device_type);
WriteMem(m_usb_handle,0x61b,buf,1,device_type);
WriteMem(m_usb_handle,0x61f,buf,1,device_type);


m_grid.Refresh();
}
else if(pItem->iColumn == 3)
{
if((g_f.value[pItem->iRow - 1] & 0x0f) == 0)
{/*
m_grid.SetItemImage(pItem->iRow,pItem->iColumn,0);
m_grid.Refresh();


buf[0] = (g_f.addr[pItem->iRow - 1]) & 0xff;
buf[1] = (g_f.addr[pItem->iRow - 1] & 0xff00)>>8;
buf[2] = (g_f.addr[pItem->iRow - 1] & 0xff0000)>>16;


WriteMem(m_usb_handle,0x610,buf,3,1); // mcu run


bkpoint++;*/
if(bkpoint < 4)
{
for(i=0;i<4;i++)
{
if(bk_ctl[i] == 0)
{
bk_ctl[i] = 1;
m_grid.SetItemImage(pItem->iRow,pItem->iColumn,0);
m_grid.Refresh();


buf[0] = (g_f.addr[pItem->iRow - 1]) & 0xff;
buf[1] = (g_f.addr[pItem->iRow - 1] & 0xff00)>>8;
buf[2] = (g_f.addr[pItem->iRow - 1] & 0xff0000)>>16;
buf[3] = 0x01;


WriteMem(m_usb_handle,4*i+0x610,buf,4,device_type); // mcu run


bkpoint++;


g_f.value[pItem->iRow - 1] = (0x02) | (i<<4);



break;


}
}

}
else
{
//MessageBox("break point can't more than 4");
debug_print("break point can't more than 4");
}
}
else if((g_f.value[pItem->iRow - 1] & 0x0f)== 1)
{
if(g_f.len[pItem->iRow - 1] >= 0x18)
{


i = g_f.value[pItem->iRow - 1] >> 4;


m_grid.SetItemImage(pItem->iRow,pItem->iColumn,6);
m_grid.Refresh();






buf[0] = (g_f.addr[pItem->iRow - 1]+g_f.len[pItem->iRow - 1]- 0x18) & 0xff;
buf[1] = ((g_f.addr[pItem->iRow - 1]+g_f.len[pItem->iRow - 1]- 0x18) & 0xff00)>>8;
buf[2] = ((g_f.addr[pItem->iRow - 1]+g_f.len[pItem->iRow - 1]- 0x18)& 0xff0000)>>16;
buf[3] = 0x01;




WriteMem(m_usb_handle,4*i+0x610,buf,4,device_type); // mcu run






g_f.value[pItem->iRow - 1] = (0x02) | (i<<4);
}
else
{
i = g_f.value[pItem->iRow - 1] >> 4;
//MessageBox("the function length is not more than 0x18");
debug_print("the function length is not more than 0x18");
m_grid.SetItemImage(pItem->iRow,pItem->iColumn,1);
m_grid.Refresh();
g_f.value[pItem->iRow - 1] = 0x00;
bk_ctl[i] = 0;

buf[0] = 0x00;




WriteMem(m_usb_handle,4*i+0x613,buf,1,device_type); // mcu run


bkpoint--;

}


//bkpoint--;
}
else if((g_f.value[pItem->iRow - 1] & 0x0f) == 2)
{
i = g_f.value[pItem->iRow - 1] >> 4;
bk_ctl[i] = 0;


// buf[0] = (g_f.addr[pItem->iRow - 1]+g_f.len[pItem->iRow - 1]-0x10) & 0xff;
// buf[1] = ((g_f.addr[pItem->iRow - 1]+g_f.len[pItem->iRow - 1]-0x10) & 0xff00)>>8;
// buf[2] = ((g_f.addr[pItem->iRow - 1]+g_f.len[pItem->iRow - 1]-0x10)& 0xff0000)>>16;
buf[0] = 0x00;
WriteMem(m_usb_handle,4*i+0x613,buf,1,device_type); // mcu run


m_grid.SetItemImage(pItem->iRow,pItem->iColumn,1);
m_grid.Refresh();

g_f.value[pItem->iRow - 1] = 0x00;
bkpoint--;
}
//g_f.value[pItem->iRow - 1] = (((g_f.value[pItem->iRow - 1] & 0x0f) + 1)%3) | (g_f.value[pItem->iRow - 1] & 0xf0);
}
}

}
else
{


//MessageBox("no usb device");
debug_print("no usb device");
}
}




void CTdebugDlg::grid_display(void)
{
////////////////set the grid /////////////////////////////////////////
{
int i;
CString str;

if(grid_mode == 0)
{
m_grid.SetEditable(true);
m_grid.SetRowCount(g_v.cnt+1); //初始为n行 
m_grid.SetColumnCount(4); //初始化为n列            
m_grid.SetFixedRowCount(1); //表头为一行  
m_grid.SetFixedColumnCount(1); //表头为一列 
m_grid.SetItemText(0,0,"variable name:");
m_grid.SetItemImage(0,0,8);
m_grid.SetItemText(0,1," addr ");
m_grid.SetItemImage(0,1,8);


m_grid.SetItemText(0,2," len ");
m_grid.SetItemImage(0,2,8);
m_grid.SetItemText(0,3,"   value  ");
m_grid.SetItemImage(0,3,8);
for(i=0;i<g_v.cnt;i++)
{
m_grid.SetItemText(i+1,0,g_v.name[i]);
str.Format("0x%02x",g_v.len[i]);
m_grid.SetItemText(i+1,2,str);


str.Format("0x%04x",g_v.addr[i]);
m_grid.SetItemText(i+1,1,str);
m_grid.SetItemImage(i+1,0,3);
m_grid.SetItemImage(i+1,3,9);



}


}
else if(grid_mode == 1)
{
m_grid.SetEditable(false);
m_grid.SetRowCount(g_f.cnt+1);
m_grid.SetColumnCount(4); //初始化为n列            
m_grid.SetFixedRowCount(1); //表头为一行  
m_grid.SetFixedColumnCount(1); //表头为一列 
m_grid.SetItemText(0,0,"function name:");
m_grid.SetItemImage(0,0,8);
m_grid.SetItemText(0,1," addr ");
m_grid.SetItemImage(0,1,8);
m_grid.SetItemText(0,2," len ");
m_grid.SetItemImage(0,2,8);
m_grid.SetItemText(0,3,"break point");
m_grid.SetItemImage(0,3,8);


for(i=0;i<g_f.cnt;i++)
{
m_grid.SetItemText(i+1,0,g_f.name[i]);
str.Format("0x%04x",g_f.addr[i]);
m_grid.SetItemText(i+1,1,str);

str.Format("0x%02x",g_f.len[i]);
m_grid.SetItemText(i+1,2,str);


m_grid.SetItemImage(i+1,0,2);
m_grid.SetItemText(i+1,3,"");
if((g_f.value[i] & 0x0f ) == 0)
m_grid.SetItemImage(i+1,3,1);
else if((g_f.value[i] & 0x0f )== 1)
m_grid.SetItemImage(i+1,3,0);
else if((g_f.value[i] & 0x0f )== 2)
m_grid.SetItemImage(i+1,3,6);


}


}


m_grid.SetItemText(1,3,"0x123456789a");
m_grid.AutoSize(); 
m_grid.SetItemText(1,3,"");
}



/////////change the size of m_grid///////////////
{
CRect  rect;
int t1,t2;
unsigned char grid_cnt;
unsigned char cnt;





grid_cnt = m_grid.GetColumnCount();
t1 = 0;
for(cnt = 0; cnt<grid_cnt;cnt++)
{
m_grid.GetCellRect(0,cnt,rect);
t1+=rect.Width();


}

this->GetClientRect(rect);
t2 = nFullHeight*0.9;
//t2 = 540;
m_grid.MoveWindow(0,0,t1+32,t2-40,TRUE);

//nFullWidth 


t1 = t1 + 32;
t2 = t2;
m_btn_mode.MoveWindow(t1+8,8,100,32,TRUE);
m_btn_update.MoveWindow(t1+115,8,100,32,TRUE);
m_btn_rst.MoveWindow(t1 + 222,8,100,32,TRUE);
m_btn_clr.MoveWindow(t1 + 329,8,100,32,TRUE);
m_btn_clrbk.MoveWindow(t1 + 436,8,100,32,TRUE);
m_btn_usb.MoveWindow(t1+543,8,100,32,TRUE);




m_btn_run.MoveWindow(t1+275,44,35,32,TRUE);
m_btn_stop.MoveWindow(t1+314,44,35,32,TRUE);
m_btn_step.MoveWindow(t1+354,44,35,32,TRUE);


// the memory read and write board
m_board1.MoveWindow(t1+8,44,260,96,TRUE);
m_static_addr.MoveWindow(t1+16,104,30,20,TRUE);
m_edit2.MoveWindow(t1+50,100,80,20,TRUE);
m_static_data.MoveWindow(t1+136,104,30,20,TRUE);
m_edit3.MoveWindow(t1+170,100,80,20,TRUE);
//m_comb_device.MoveWindow(t1+16,64,80,20,TRUE);
m_comb_bus.MoveWindow(t1+50,64,80,20,TRUE);
m_comb_type.MoveWindow(t1+170,64,80,20,TRUE);


m_edit2.SetWindowText("00");
m_comb_device.SetCurSel(0);
m_comb_bus.SetCurSel(0);
m_comb_type.SetCurSel(0);

        // the config board
m_bd_cfg.MoveWindow(t1+275,80,360,60,TRUE);
m_check1.MoveWindow(t1+281,100,50,20,TRUE);
m_check_tcpc.MoveWindow(t1+340,100,90,20,TRUE);
m_bk_check.MoveWindow(t1+430,100,90,20,TRUE);
m_check2.MoveWindow(t1+530,100,90,20,TRUE);
//m_info.MoveWindow(t1+200,64,20,60.TRUE);
m_info.MoveWindow(t1+314+90,50,180,30,TRUE);



m_edit_tcdbcmd.MoveWindow(t1+8,150,550,22);
m_btn_docmd.MoveWindow(t1+562,145,96,32);
m_edit1.MoveWindow(t1+8,150+36,650,t2 - 150 - 40 -36);
this->GetWindowRect(rect);
this->MoveWindow(rect.left,rect.top,t1 + 670,t2,TRUE);


}



this->Invalidate();
////////////////////////////////////////////////////////////////////////




}


void CTdebugDlg::OnButton4() 
{
// TODO: Add your control notification handler code here
grid_mode = (grid_mode + 1)%2;
grid_display();


if(grid_mode == 0)
{
m_btn_mode.SetWindowText("SeeFunctions");
}
else
{
m_btn_mode.SetWindowText("SeeVariables");
}
}


void CTdebugDlg::OnSetfocusEdit3() 
{
// TODO: Add your control notification handler code here
/* CString str;

unsigned char buf[4];
long addr;




if(m_usb_handle != NULL)
{



m_edit2.GetWindowText(str);
addr = strtol(str,NULL,16);


str.Format("## read %04x",addr);
this->debug_print(str);


ReadMem(m_usb_handle,addr,buf,1,1);
str.Format("%02x",buf[0]);




m_edit3.SetWindowText(str);


m_edit3.SetSel(0,-1);
}
else
{


MessageBox(" no usb device!");
}*/



}


void CTdebugDlg::OnKillfocusEdit2() 
{
// TODO: Add your control notification handler code here
CString str;

unsigned char buf[4];
long addr;
int     byte_length;
CString  str_device;


if(m_comb_type.GetCurSel() == 0)
{
byte_length=1;
}
else if(m_comb_type.GetCurSel() == 1)
{
byte_length=2;
}
else
{
byte_length=4;
}


//if(m_comb_device.GetCurSel()==0)
if(device_type == 4)
{
str_device="";
}
else
{
str_device="-u";
}



if(m_usb_handle != NULL)
{



m_edit2.GetWindowText(str);
addr = strtol(str,NULL,16);
m_edit3.SetWindowText("");



switch(m_comb_bus.GetCurSel())
{
//CString  str;
case 0:   // read core
str.Format("## read %04x",addr);
this->debug_print(str);
ReadMem(m_usb_handle,addr,buf,byte_length,device_type);
str.Format("%02x",buf[0]);
//m_edit3.SetWindowText(str);
//this->debug_print(str);
this->debug_printx(buf,byte_length);
//this->debug_print("");
m_edit3.SetSel(0,-1);
break;
/*case 1:  //read analog
str.Format("ra %04x -s %d %s",addr,byte_length,str_device);
tcdb_cmd(str);
break;*/
case 1:  // read flash
str.Format("rf %04x -s %d %s",addr,byte_length,str_device);
tcdb_cmd(str);
break;
default:
break;
}
}
else
{


// MessageBox(" no usb device!");
debug_print("no usb device!");
}




}
SECURITY_ATTRIBUTES g_sa = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE};  


void CTdebugDlg::tcdb_cmd(CString str) 
{
// TODO: Add your control notification handler code here

DWORD dwWritten = 0;
/* char cmdLine[2048];
//sprintf (cmdLine, "\"%s\"", m_AppName);


CString cCmd = m_dir + "\\tcdb.exe";
//+ " set prj " + m_mPrj + " " + m_mLib;
sprintf (cmdLine, "\"%s  %s ",cCmd, str);
sprintf (cmdLine, "\"%s  rf 0 -s 10",cCmd, str); */

HANDLE hWritePipe, hReadPipe;  
    if ( !CreatePipe( &hReadPipe, &hWritePipe, &g_sa, 2048*10 ) )  
    {  
        return;  
    }  
CString str_tmp;
//CString cCmd = m_dir + "\\tcdb.exe";
CString cCmd = this->m_exe_dir + "\\tcdb.exe";
    CString strCmdLine;  
strCmdLine.Format("%s %s",cCmd,str);
    // create an environment for the CGI process....   
    DWORD dwCreateFlags = 0;  
  
    PROCESS_INFORMATION pi;  
    STARTUPINFO si = {0};  
    si.cb = sizeof(si);  
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;  
    si.wShowWindow = SW_HIDE;  
    si.hStdInput = hReadPipe;  
    si.hStdOutput = hWritePipe;  
    si.hStdError = hWritePipe;  
    BOOL bOk = CreateProcess( NULL, strCmdLine.GetBuffer(1),  
        NULL, NULL, TRUE,  
        dwCreateFlags, NULL,  
        "c:\\", &si, &pi );  
     



//Sleep(1000);
    // if created....   
    if ( bOk )  
    {  
      
        while(1)
{
DWORD ExitCode;
GetExitCodeProcess(pi.hProcess,&ExitCode);
Sleep(300);
if(ExitCode==STILL_ACTIVE)
{

 
char buffer[1028]={0};
buffer[1024]=0;
ReadFile(hReadPipe, buffer,1024,&dwWritten, NULL );  
       
str_tmp.Format("%s",buffer);
this->debug_print(str_tmp);  
//The process is still running
}
else
{
break;
}
//The prcoces has terminated,the ExitCode is its exitcode 


}
        // wait for either cancel or process done....   
        //WaitForSingleObject(pi.hProcess,INFINITE);  
        // release our hold on the thread....   


Sleep(1000);
        CloseHandle( pi.hThread );  
        // send the body of the post to the stdin....

         

//
    // we're at the end of the file 
//while(0) 
while(dwWritten==1024)
{  
// DWORD dwWritten = 0; 
char buffer[1028]={0};
buffer[1024]=0;
//Sleep(500);
ReadFile(hReadPipe, buffer,1024,&dwWritten, NULL );  
        //m_msg = buffer; 

str_tmp.Format("%s",buffer);
this->debug_print(str_tmp);
// }
if (dwWritten < 1024) 
{
break;
}

    //  AfxMessageBox(m_msg);   
        //UpdateData(FALSE);  
        // close our hold on it....   
        //CloseHandle( pi.hProcess );  
    }  
else
{
debug_print("tcdb.exe not find!\r\n");
}
//strCmdLine.ReleaseBuffer(); 
}






HBRUSH CTdebugDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// TODO: Change any attributes of the DC here
if(pWnd->GetDlgCtrlID()==IDC_STATIC_INF)
{
pDC->SetTextColor(RGB(0,0,255));

// TODO: Return a different brush if the default is not desired
return hbr;
}


void CTdebugDlg::OnTimer(UINT nIDEvent) 
{




// TODO: Add your message handler code here and/or call default
unsigned char  buf[10];
CString  str;
int  rt;



if(m_check2.GetCheck())
{
// rt = ReadMem(m_usb_handle,0x602,buf,1,device_type); // read mcu ctl reg
rt = ReadMem(m_usb_handle,0x602,buf,1,1); // read mcu ctl reg
}




if(nIDEvent == 1)//////////////////////timer 1//////////////////////////////////////////////
{
if(m_check2.GetCheck())
{
if(device_type == 4)
{
if(rt == 0)
{
m_info.SetWindowText("no swire slave device");
rt = ReadMem(m_usb_handle,0x602,buf,1,1); // read mcu ctl reg
if(rt == 0)
{
m_info.SetWindowText("no Evk and swire slave device");
}
//this->debug_print(" ## Error:  NO  usb device!!!  ##\r\n## please restart the porgram!");
//this->Invalidate();
}


}
else
{
if(rt == 0)
{
m_info.SetWindowText("no usb device");
//this->debug_print(" ## Error:  NO  usb device!!!  ##\r\n## please restart the porgram!");
//this->Invalidate();
}
}
}

if(m_check1.GetCheck())
{
debug_print("auto read register..");
OnButton1();
}

//if((this->m_bk_check.GetCheck()) && (mcu_status == MCU_ST_RUN))




}


// check break point
if((mcu_status == MCU_ST_RUN))
{
int i;
unsigned long pc_now;
ReadMem(m_usb_handle,0x613,buf,1,device_type);
if((buf[0] & 0x80) != 0)
{ debug_print("##break point:");


ReadMem(m_usb_handle,0x6bc,buf,4,device_type); // read mcu ctl reg
g_type.byte[0] = buf[0];
g_type.byte[1] = buf[1];
g_type.byte[2] = buf[2];
g_type.byte[3] = buf[3];


pc_now = (g_type.us_long) & 0xffffff;


str.Format(" pc now is : % 08x",pc_now);
debug_print(str);


for(i = 0; i< g_f.cnt;i++)
{
if((pc_now >= g_f.addr[i]) && (pc_now < g_f.addr[i] + g_f.len[i]))
{
if(pc_now == g_f.addr[i])
{
str.Format(" stop at function::  %s()\n",g_f.name[i]);
}
else
{
str.Format(" stop at end(end - 0x18) of function::  %s()",g_f.name[i]);
}
debug_print(str);
break;


}
}
//debug_print("##break point:");
mcu_status = MCU_ST_BREAK;


//OnButton5();
this->m_btn_run.EnableWindow(true);
this->m_btn_stop.EnableWindow(false);


}


}
//else if(nIDEvent == 2) //////////////////////////timer 2 ////////////////////////////////////
{
if(m_check_tcpc.GetCheck())
{ int i;
unsigned long pc_now;
//ReadMem(m_usb_handle,0x613,buf,1,1); // read mcu ctl reg
ReadMem(m_usb_handle,0x6bc,buf,4,device_type); // read mcu ctl reg
g_type.byte[0] = buf[0];
g_type.byte[1] = buf[1];
g_type.byte[2] = buf[2];
g_type.byte[3] = buf[3];


pc_now = (g_type.us_long) & 0xffffff;


str.Format("auto pc read is : %08x\r\n",pc_now);
debug_print(str);


for(i = 0; i< g_f.cnt;i++)
{
if((pc_now >= g_f.addr[i]) && (pc_now < g_f.addr[i] + g_f.len[i]))
{
str.Format("mcu now in:  %s()\r\n",g_f.name[i]);
debug_print(str);
break;


}
}


}
}


// CDialog::OnTimer(nIDEvent);






CDialog::OnTimer(nIDEvent);
MSG msg;
while(::PeekMessage(&msg, m_hWnd, WM_TIMER, WM_TIMER, PM_REMOVE));
}


void CTdebugDlg::OnButton3() 
{
// TODO: Add your control notification handler code here
unsigned char  buf[10];
int i;


//str.Format("## mcu restart --");
debug_print("## mcu restart --\n");


/* this->bk_ctl[0] = 0;
this->bk_ctl[1] = 0;
this->bk_ctl[2] = 0;
this->bk_ctl[3] = 0;


buf[0] = 0x00;
WriteMem(m_usb_handle,0x613,buf,1,device_type); // mcu run
WriteMem(m_usb_handle,0x617,buf,1,device_type); // mcu run
WriteMem(m_usb_handle,0x61b,buf,1,device_type); // mcu run
WriteMem(m_usb_handle,0x61f,buf,1,device_type); // mcu run


buf[0] = 0x80;
WriteMem(m_usb_handle,0x613,buf,1,device_type); // mcu dereset */


// OnButton6();
///////////////////////enable all break point //////////////////////
/*
buf[0] = 0x89;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu reset


if(this->m_bk_check.GetCheck())
{
buf[0] = 0x01;
for(i=0;i<g_f.cnt;i++)
{
if((g_f.value[i]>>4) != 0)
{
bk_ctl[g_f.value[i]>>4] = 1;
WriteMem(m_usb_handle,(g_f.value[i]>>2)+0x613,buf,1,device_type); // mcu run
}


}
buf[0] = 0x81;
WriteMem(m_usb_handle,0x613,buf,1,device_type); // mcu run


}
*/
    ///////////////////////////////////////////////////////////////////////////
buf[0] = 0x84;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu dereset
/* ReadMem(m_usb_handle,0x613,buf,1,device_type);
buf[0] = buf[0] | 80;
WriteMem(m_usb_handle,0x613,buf,1,device_type); // mcu break run
buf[0] = 0x05;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu dereset
buf[0] = 0x88;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu dereset */




/* if(mcu_status == MCU_ST_RUN)
{
m_btn_run.EnableWindow(false);
m_btn_stop.EnableWindow(true);
m_info.SetWindowText(" run..");
}
else 
{
m_btn_run.EnableWindow(true);
m_btn_stop.EnableWindow(false);
m_info.SetWindowText(" stop..");
} */


mcu_status = MCU_ST_RUN;



}


void CTdebugDlg::OnButton5() 
{
// TODO: Add your control notification handler code here


unsigned char  buf[10];
int i;
unsigned long pc_now;
CString  str;




ReadMem(m_usb_handle,0x602,buf,1,device_type); // read mcu ctl reg


buf[0] = buf[0] | 0x02;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu stall


m_btn_run.EnableWindow(true);
m_btn_stop.EnableWindow(false);


m_info.SetWindowText("mcu stop!");


if(mcu_status == MCU_ST_RUN)
{
ReadMem(m_usb_handle,0x6bc,buf,4,device_type); // read mcu ctl reg
g_type.byte[0] = buf[0];
g_type.byte[1] = buf[1];
g_type.byte[2] = buf[2];
g_type.byte[3] = buf[3];


pc_now = (g_type.us_long) & 0xffffff;


str.Format("pc is : %08x",pc_now);
debug_print(str);


for(i = 0; i< g_f.cnt;i++)
{
if((pc_now >= g_f.addr[i]) && (pc_now < g_f.addr[i] + g_f.len[i]))
{
str.Format("## mcu stop in:  %s()",g_f.name[i]);
debug_print(str);
break;


}
}
}
mcu_status = MCU_ST_STOP;


}


void CTdebugDlg::OnButton6() 
{
// TODO: Add your control notification handler code here
unsigned char  buf[10];

{
ReadMem(m_usb_handle,0x613,buf,1,device_type);
buf[0] = buf[0] | 80;
WriteMem(m_usb_handle,0x613,buf,1,device_type); // mcu break run


}


ReadMem(m_usb_handle,0x602,buf,1,device_type); // read mcu ctl reg


buf[0] = buf[0] & 0xfd;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu run



//if(mcu_status == MCU_ST_BREAK)



m_btn_run.EnableWindow(false);
m_btn_stop.EnableWindow(true);


mcu_status = MCU_ST_RUN;




m_info.SetWindowText("mcu run..");
}


void CTdebugDlg::OnCheck3() 
{
// TODO: Add your control notification handler code here
unsigned char buf[10];
int i;


if(bk_en == false)
{
bk_en = true;

}
else 
{
bk_en = false;



}
}


void CTdebugDlg::OnButton7() 
{
// TODO: Add your control notification handler code here
m_edit1.SetSel(0,-1);
m_edit1.ReplaceSel("");
m_edit1.SetWindowText("## print window  clear ");
}


void CTdebugDlg::OnButton8() 
{
// TODO: Add your control notification handler code here
int i;
unsigned char buf[10];


for(i=0;i<g_f.cnt;i++)
{   g_f.value[i] = 0;
m_grid.SetItemImage(i+1,3,1);
}
bkpoint = 0;
bk_ctl[0] = 0;
bk_ctl[1] = 0;
bk_ctl[2] = 0;
bk_ctl[3] = 0;
buf[0] = 0x00;
WriteMem(m_usb_handle,0x613,buf,1,device_type);
WriteMem(m_usb_handle,0x617,buf,1,device_type);
WriteMem(m_usb_handle,0x61b,buf,1,device_type);
WriteMem(m_usb_handle,0x61f,buf,1,device_type);


m_grid.Refresh();

}


void CTdebugDlg::swireusb(void)
{
unsigned char buf[4];
buf[0] = 0x80;
WriteMem(m_usb_handle,0x61,buf,1,1);
Sleep(1);


buf[0] = 0x00;
WriteMem(m_usb_handle,0x61,buf,1,1);
Sleep(1);


buf[0] = 0x20;
WriteMem(m_usb_handle,0x588,buf,1,1);
Sleep(1);


buf[0] = 0x20;
WriteMem(m_usb_handle,0x58c,buf,1,1);
Sleep(1);


buf[0] = 0x20;
WriteMem(m_usb_handle,0x584,buf,1,1);
Sleep(80);

buf[0] = 0x00;
WriteMem(m_usb_handle,0x584,buf,1,1);
Sleep(40);


buf[0] = 0x20;
WriteMem(m_usb_handle,0x584,buf,1,1);
Sleep(20);


buf[0] = 0x00;
WriteMem(m_usb_handle,0x58c,buf,1,1);
Sleep(1);






}


void CTdebugDlg::OnUsb() 
{
// TODO: Add your control notification handler code here
///////////open usb device ///////////////////////////////////////////
m_usb_handle = GetPrintDeviceHandle(m_usb_id);   // get usb printdevice.
if(m_usb_handle == NULL)
{
//MessageBox("no usb device!!");
debug_print("no usb device!!");
//str_info.Format("NO usb device");
m_info.SetWindowText("NO usb device");
}
else
{
if(IsEVKDevice(m_usb_handle))
{ m_info.SetWindowText("Evk device ok");
device_type = 4;
swireusb();


}
else
{ m_info.SetWindowText("usb device ok");
device_type = 1;
}

}
//////////////////////////////////////////////////////////////////////


////////////////open file ////////////////////////////////////////
{
char line[1024];
int cnt,para_cnt;
char *para[10];
unsigned char  f_st;


/* CString str;

str.Format("cp  -f *.lst  \"boot-.llst\" ");   // create a folder.
//system(str);
WinExec(str,SW_HIDE);
Sleep(200);
pf = fopen("boot-.llst","r");  */
// find the latest list file .
{


char* strTemp;
CString str;
CString final_filename;
HANDLE hDir;
FILETIME lpCreationTime; // 文件夹的创建时间
FILETIME lpLastAccessTime; // 对文件夹的最近访问时间
FILETIME lpLastWriteTime; // 文件夹的最近修改时间
FILETIME ftime_latest;
strTemp = new char[MAX_PATH];
GetCurrentDirectory(MAX_PATH, strTemp);//(strTemp为D:/Practice)

//m_cur_dir.Format("%s",strTemp);


WIN32_FIND_DATA ffd;
HANDLE hFind = INVALID_HANDLE_VALUE;
m_dir.Format("%s\\",strTemp);
this->get_exe_cur();
//m_dir = ".//";
CString strDir = m_dir+"*.lst";

hFind = FindFirstFile(strDir, &ffd);
if (hFind != INVALID_HANDLE_VALUE) {
      
//((CComboBox *) GetDlgItem (IDC_COMBO_BIN))->ResetContent();
ftime_latest.dwHighDateTime = 0;
ftime_latest.dwLowDateTime = 0;
final_filename = "nofile";
do {
if (!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ){
//((CComboBox *) GetDlgItem (IDC_COMBO_BIN))->AddString (ffd.cFileName);
str = m_dir + ffd.cFileName;
hDir = CreateFile(str, GENERIC_READ,FILE_SHARE_READ|FILE_SHARE_DELETE,NULL, OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (GetFileTime(hDir, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){
FILETIME ftime;
SYSTEMTIME stime;
CString  tstr;
FileTimeToLocalFileTime(&lpLastWriteTime, &ftime); // 转换成本地时间
FileTimeToSystemTime(&ftime, &stime); // 转换成系统时间格式
//tstr.Format("the h %x l %x",ftime.dwHighDateTime,ftime.dwLowDateTime);
//tstr.Format("the file wtime:year%d,month%d,data%d,h%d,m%d,s%d",stime.wYear,stime.wMonth,stime.wDay,stime.wHour,stime.wMinute,stime.wSecond);
//MessageBox(tstr);
if(ftime.dwHighDateTime > ftime_latest.dwHighDateTime)
{
 final_filename = str;
 ftime_latest.dwHighDateTime = ftime.dwHighDateTime;
 ftime_latest.dwLowDateTime = ftime.dwLowDateTime;
}
else if(ftime.dwHighDateTime == ftime_latest.dwHighDateTime)
{
if(ftime.dwLowDateTime > ftime_latest.dwLowDateTime)
{
 final_filename = str; 
 ftime_latest.dwHighDateTime = ftime.dwHighDateTime;
 ftime_latest.dwLowDateTime = ftime.dwLowDateTime;
}
}

}
CloseHandle(hDir); // 关闭打开过的文件夹
}
}while (FindNextFile(hFind, &ffd) != 0);
//((CComboBox *) GetDlgItem (IDC_COMBO_BIN))->SetCurSel(0);
FindClose(hFind);
}



pf = fopen(final_filename,"r");


}


// end of list file find.

this->debug_print("##telink-semiconductor: tdebug tools:\r\n");
if(pf == NULL)
{
//MessageBox("no default init file find!!");
debug_print("no default init file find!!\r\n");
m_info.SetWindowText("no init file");
}
else
{ this->debug_print("tables update completed!\r\n");
f_st = 0;
memset(line,0,1024);
while( fgets( line, 1024, pf ) != NULL)   // get every line int the file
{
cnt = 0;
para[cnt] = strtok(line," \t");
do
{
para[++cnt] = strtok(NULL," \t");
} while ((cnt < 10) && (para[cnt] != NULL));
para_cnt = cnt;


if(strcmp(para[0],"SYMBOL") == 0)
{
f_st = 1;
g_v.cnt = 0;
g_f.cnt = 0;
}


if(strcmp(para[0],"00809208")==0)
{
int bug;
bug = 0x55;
}


if((f_st == 1) && (para_cnt== 6))
{
if((strcmp(para[1],"g") == 0) || (strcmp(para[1],"l") == 0))  //  if it is global variables or functions 
{
if(((strcmp(para[3],".bss") == 0) || (strcmp(para[3],".data") == 0)) && (strcmp(para[2],"O") == 0))
{
g_v.addr[g_v.cnt] = strtol(para[0],NULL,16); // get the adress
//g_v.addr[g_v.cnt] = (g_v.addr[g_v.cnt]&0xffff)|0x8000; // we need only the variable. /// ----> mj
g_v.addr[g_v.cnt] = (g_v.addr[g_v.cnt]&0xfffff); /// ----> mj
g_v.len[g_v.cnt] = strtol(para[4],NULL,16);
strcpy(g_v.name[g_v.cnt],para[5]);
g_v.cnt++;



}
else if((strcmp(para[3],".text") == 0) && (strcmp(para[2],"F") == 0))
{
g_f.addr[g_f.cnt] = strtol(para[0],NULL,16);
g_f.len[g_f.cnt] = strtol(para[4],NULL,16);
g_f.value[g_f.cnt] = 0;
strcpy(g_f.name[g_f.cnt],para[5]);
g_f.cnt++;

}


}
}










}

fclose(pf);
}






}
/////////////file read end ///////////////////////////////////////////


///////////////make the addr to be increase order/////////////////////
{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_v.cnt;i++)
for(j=i;j>0;j--)
{
if(g_v.addr[j] < g_v.addr[j-1])
{
temp = g_v.addr[j];
g_v.addr[j] = g_v.addr[j-1];
g_v.addr[j-1] = temp;


temp = g_v.len[j];
g_v.len[j] = g_v.len[j-1];
g_v.len[j-1] = temp;


strcpy(temp_str,g_v.name[j]);
strcpy(g_v.name[j],g_v.name[j-1]);
strcpy(g_v.name[j-1],temp_str);




}
}


}


bss_start = g_v.addr[0];
bss_end = g_v.addr[g_v.cnt-1] + g_v.len[g_v.cnt - 1];
////////////////////////////////// order by name /////////////////////////////////


{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_v.cnt;i++)
for(j=i;j>0;j--)
{
if(strcmp(g_v.name[j],g_v.name[j-1]) < 0)
{
temp = g_v.addr[j];
g_v.addr[j] = g_v.addr[j-1];
g_v.addr[j-1] = temp;


temp = g_v.len[j];
g_v.len[j] = g_v.len[j-1];
g_v.len[j-1] = temp;


strcpy(temp_str,g_v.name[j]);
strcpy(g_v.name[j],g_v.name[j-1]);
strcpy(g_v.name[j-1],temp_str);




}
}


}


{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_f.cnt;i++)
for(j=i;j>0;j--)
{
if(strcmp(g_f.name[j],g_f.name[j-1]) < 0)
{
temp = g_f.addr[j];
g_f.addr[j] = g_f.addr[j-1];
g_f.addr[j-1] = temp;


temp = g_f.len[j];
g_f.len[j] = g_f.len[j-1];
g_f.len[j-1] = temp;


strcpy(temp_str,g_f.name[j]);
strcpy(g_f.name[j],g_f.name[j-1]);
strcpy(g_f.name[j-1],temp_str);




}
}


}




////////////////////order end ////////////////////////////////////////

////////////////set the grid /////////////////////////////////////////
// m_ImageList.Create(MAKEINTRESOURCE(IDB_BITMAP1), 16, 2, RGB(255,255,255));
// m_grid.SetImageList(&m_ImageList);  //绑定grid控件和 图片列表
// m_grid.SetEditable(true);


m_grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); //黄色背景
m_grid.SetTextColor(RGB(0x00, 0x00, 0xff));
//m_grid.SetFixedTextColor(RGB(0xff, 0x00, 0x00)); //表头的字体颜色

////////////set global config //////////////////
grid_mode = 0;
bkpoint = 0;
bk_en = false;


bk_ctl[0] = 0;
bk_ctl[1] = 0;
bk_ctl[2] = 0;
bk_ctl[3] = 0;

mcu_status = MCU_ST_RUN;


    /////////////////////////////////////////////////


grid_display();


////////set edit box///////////////////
//m_edit1.SetWindowText("print window:");
//m_edit2.SetWindowText("0000");


//set  timer /////////////
SetTimer(1,10,NULL); 
SetTimer(2,5,NULL);


m_btn_run.EnableWindow(false);
m_btn_stop.EnableWindow(true);
////////////edit box end //////////////


SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

if(grid_mode == 0)
{
m_btn_mode.SetWindowText("SeeFunctions");
}
else
{
m_btn_mode.SetWindowText("SeeVariables");
}










}












void CTdebugDlg::OnGridEndEdit(NMHDR *pNotifyStruct, LRESULT* pResult)
{
    NM_GRIDVIEW* pItem = (NM_GRIDVIEW*) pNotifyStruct;
//    Trace(_T("End Edit on row %d, col %d\n"), pItem->iRow, pItem->iColumn);
CString  str;
int      index;
__int64   tv;
index = pItem->iRow - 1;
unsigned char buf[8];
unsigned char i;


//*pResult = (m_bRejectEditChanges)? -1 : 0;
if((this->grid_mode == 0) && (g_v.len[index] <= 8) && (pItem->iColumn == 3))
{
str = m_grid.GetItemText(pItem->iRow, pItem->iColumn);

tv = strtol(str,NULL,16);
str.Format("End Edit %x", tv);

for(i=0;i< g_v.len[index] ;i++)
{
buf[i] = tv & 0x00ff;
tv = tv >> 8;
}


WriteMem(m_usb_handle,g_v.addr[index],buf,g_v.len[index],device_type); // mcu run
this->debug_print(" write complete!");
//grid_display();
}
}








void CTdebugDlg::OnCheck2() 
{
// TODO: Add your control notification handler code here



/* if(m_check2.GetCheck())
MessageBox("true");
else
MessageBox("false"); */


}


///////////// for backup ///////////
/*
#if 0
///////////open usb device ///////////////////////////////////////////
m_usb_handle = GetPrintDeviceHandle();   // get usb printdevice.
if(m_usb_handle == NULL)
{
MessageBox("no usb device!!");
//str_info.Format("NO usb device");
m_info.SetWindowText("NO usb device");
}
else
{
if(IsEVKDevice(m_usb_handle))
{ m_info.SetWindowText("Evk device ok");
device_type = 4;
swireusb();
}
else
{ m_info.SetWindowText("usb device ok");
device_type = 1;
}


}


//////////////////////////////////////////////////////////////////////




////////////////open file ////////////////////////////////////////
{
char line[100];
int cnt,para_cnt;
char *para[10];
unsigned char  f_st;
CString str;

str.Format("cp  -f *.lst  \"boot-.llst\" ");   // create a folder.
//system(str);
WinExec(str,SW_HIDE);
Sleep(200);


pf = fopen("boot-.llst","r");
if(pf == NULL)
{
MessageBox("no  list file find!!");
m_info.SetWindowText("no list file");
}
else
{
f_st = 0;
while( fgets( line, 100, pf ) != NULL)   // get every line int the file
{
cnt = 0;
para[cnt] = strtok(line," \t");
do
{
para[++cnt] = strtok(NULL," \t");
} while ((cnt < 10) && (para[cnt] != NULL));
para_cnt = cnt;


if(strcmp(para[0],"SYMBOL") == 0)
{
f_st = 1;
g_v.cnt = 0;
g_f.cnt = 0;
}


if((f_st == 1) && (para_cnt== 6))
{
if((strcmp(para[1],"g") == 0) || (strcmp(para[1],"l") == 0))  //  if it is global variables or functions 
{
if(((strcmp(para[3],".bss") == 0) || (strcmp(para[3],".data") == 0)) && (strcmp(para[2],"O") == 0))
{
g_v.addr[g_v.cnt] = strtol(para[0],NULL,16);
g_v.len[g_v.cnt] = strtol(para[4],NULL,16);
strcpy(g_v.name[g_v.cnt],para[5]);
g_v.cnt++;



}
else if((strcmp(para[3],".text") == 0) && (strcmp(para[2],"F") == 0))
{
g_f.addr[g_f.cnt] = strtol(para[0],NULL,16);
g_f.len[g_f.cnt] = strtol(para[4],NULL,16);
g_f.value[g_f.cnt] = 0;
strcpy(g_f.name[g_f.cnt],para[5]);
g_f.cnt++;

}


}
}









}

fclose(pf);
}






}
/////////////file read end ///////////////////////////////////////////
///////////////make the addr to be increase order/////////////////////
{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_v.cnt;i++)
for(j=i;j>0;j--)
{
if(g_v.addr[j] < g_v.addr[j-1])
{
temp = g_v.addr[j];
g_v.addr[j] = g_v.addr[j-1];
g_v.addr[j-1] = temp;


temp = g_v.len[j];
g_v.len[j] = g_v.len[j-1];
g_v.len[j-1] = temp;


strcpy(temp_str,g_v.name[j]);
strcpy(g_v.name[j],g_v.name[j-1]);
strcpy(g_v.name[j-1],temp_str);




}
}


}


bss_start = g_v.addr[0];
bss_end = g_v.addr[g_v.cnt-1] + g_v.len[g_v.cnt - 1];
////////////////////////////////// order by name /////////////////////////////////


{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_v.cnt;i++)
for(j=i;j>0;j--)
{
if(strcmp(g_v.name[j],g_v.name[j-1]) < 0)
{
temp = g_v.addr[j];
g_v.addr[j] = g_v.addr[j-1];
g_v.addr[j-1] = temp;


temp = g_v.len[j];
g_v.len[j] = g_v.len[j-1];
g_v.len[j-1] = temp;


strcpy(temp_str,g_v.name[j]);
strcpy(g_v.name[j],g_v.name[j-1]);
strcpy(g_v.name[j-1],temp_str);




}
}


}


{
int i,j;
unsigned long temp;
char temp_str[100];
for(i=1;i<g_f.cnt;i++)
for(j=i;j>0;j--)
{
if(strcmp(g_f.name[j],g_f.name[j-1]) < 0)
{
temp = g_f.addr[j];
g_f.addr[j] = g_f.addr[j-1];
g_f.addr[j-1] = temp;


temp = g_f.len[j];
g_f.len[j] = g_f.len[j-1];
g_f.len[j-1] = temp;


strcpy(temp_str,g_f.name[j]);
strcpy(g_f.name[j],g_f.name[j-1]);
strcpy(g_f.name[j-1],temp_str);




}
}


}




////////////////////order end ////////////////////////////////////////

////////////////set the grid /////////////////////////////////////////
m_ImageList.Create(MAKEINTRESOURCE(IDB_BITMAP1), 16, 2, RGB(255,255,255));
m_grid.SetImageList(&m_ImageList);  //绑定grid控件和 图片列表
// m_grid.SetEditable(true);


m_grid.SetTextBkColor(RGB(0xFF, 0xFF, 0xE0)); //黄色背景
m_grid.SetTextColor(RGB(0x00, 0x00, 0xff));
//m_grid.SetFixedTextColor(RGB(0xff, 0x00, 0x00)); //表头的字体颜色

////////////set global config //////////////////
grid_mode = 0;
bkpoint = 0;
bk_en = false;


bk_ctl[0] = 0;
bk_ctl[1] = 0;
bk_ctl[2] = 0;
bk_ctl[3] = 0;

mcu_status = MCU_ST_RUN;


    /////////////////////////////////////////////////


grid_display();


////////set edit box///////////////////
m_edit1.SetWindowText("print window:");
m_edit2.SetWindowText("0000");


//set  timer /////////////
SetTimer(1,1000,NULL); 
SetTimer(2,5,NULL);


m_btn_run.EnableWindow(false);
m_btn_stop.EnableWindow(true);
////////////edit box end //////////////


SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon

// TODO: Add extra initialization here

if(grid_mode == 0)
{
m_btn_mode.SetWindowText("SeeFunctions");
}
else
{
m_btn_mode.SetWindowText("SeeVariables");
}
#endif






  */
///////////////end of backup/////////


// do tcdb command
void CTdebugDlg::OnButton9() 
{
// TODO: Add your control notification handler code here
CString str;
m_edit_tcdbcmd.GetWindowText(str);
if(strcmp(str,"") != 0)
{
tcdb_cmd(str);
}


}


void CTdebugDlg::get_exe_cur(void) 
{
//CString str;
// TODO: Add your control notification handler code here
//定义程序路径的字符数组
char szEexFullpath[MAX_PATH];
char szExeDir[MAX_PATH];//得到EXE所有目录(包含"\")
//得到程序的模块句柄
HMODULE hMyModule = GetModuleHandle(NULL);
//得到程序的路径
DWORD dwLen = GetModuleFileName(hMyModule,szEexFullpath,MAX_PATH);
//计算程序的路径(倒数查找最后一个"\")
char * pPatch = &szEexFullpath[dwLen]; //szexepatch + dwLen;
while (pPatch!=NULL && *pPatch!='\\')
{
pPatch--;
}
//得到最后一个反斜扛之后再往后加1,并把它设置为0,这样后面的数据对于字符数组就会忽略
pPatch++;
*pPatch=0;
strcpy(szExeDir,szEexFullpath);
m_exe_dir.Format("%s",szExeDir);


}


void CTdebugDlg::OnButton10() 
{
// TODO: Add your control notification handler code here
unsigned char  buf[10];




ReadMem(m_usb_handle,0x602,buf,1,device_type); // read mcu ctl reg


buf[0] = buf[0] | 0x02;
WriteMem(m_usb_handle,0x602,buf,1,device_type); // mcu run stop mcu 





{
ReadMem(m_usb_handle,0x613,buf,1,device_type);
buf[0] = buf[0] | 80;
WriteMem(m_usb_handle,0x613,buf,1,device_type); // mcu break run


}






//if(mcu_status == MCU_ST_BREAK)



m_btn_run.EnableWindow(true);
m_btn_stop.EnableWindow(false);


mcu_status = MCU_ST_STOP;




m_info.SetWindowText("mcu stop..");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值