📄 opensourcebdm_dll.c
字号:
#else
usb_data[0]=(MAX_DATA_SIZE&0xfe)-1+1;
opensourcebdm_usb_recv_ep0(usb_data);
#endif
for (i=0;i<(MAX_DATA_SIZE&0xfe)-1;i++) *(data++) = usb_data[i+1];
address += (MAX_DATA_SIZE&0xfe)-1; /* update address */
count -= (MAX_DATA_SIZE&0xfe)-1; /* update count */
}
while (count>MAX_DATA_SIZE) {
usb_data[1]=CMD_READ_BLOCK1;
*((unsigned int*)(usb_data+2)) = address;
usb_data[4]=(MAX_DATA_SIZE&0xfe);
#ifdef FAST_BLOCK
usb_data[0]=4;
opensourcebdm_usb_send_ep2(usb_data);
usb_data[0]=(MAX_DATA_SIZE&0xfe)+1;
opensourcebdm_usb_recv_ep2(usb_data);
#else
usb_data[0]=(MAX_DATA_SIZE&0xfe)+1;
opensourcebdm_usb_recv_ep0(usb_data);
#endif
for (i=0;i<(MAX_DATA_SIZE&0xfe);i++) *(data++) = usb_data[i+1];
address += (MAX_DATA_SIZE&0xfe); /* update address */
count -= (MAX_DATA_SIZE&0xfe); /* update count */
}
if (count) {
usb_data[1]=CMD_READ_BLOCK1;
*((unsigned int*)(usb_data+2)) = address;
usb_data[4]=count;
#ifdef FAST_BLOCK
usb_data[0]=4;
opensourcebdm_usb_send_ep2(usb_data);
usb_data[0]=count+1;
opensourcebdm_usb_recv_ep2(usb_data);
#else
usb_data[0]=count+1;
opensourcebdm_usb_recv_ep0(usb_data);
#endif
for (i=0;i<count;i++) *(data++) = usb_data[i+1];
}
}
/* writes block to memory */
void WINAPI __declspec(dllexport) opensourcebdm_write_block(unsigned int address, unsigned int count, unsigned char *data) {
unsigned int i;
if ((count>MAX_DATA_SIZE)&&(address&0x0001)) {
/* if address is odd and we are going to write more than one block make the first packet 1 byte short to align the address */
usb_data[0]=(MAX_DATA_SIZE&0xfe)-1+4;
usb_data[1]=CMD_WRITE_BLOCK1;
*((unsigned int*)(usb_data+2)) = address;
usb_data[4]=(MAX_DATA_SIZE&0xfe)-1;
for (i=0;i<(MAX_DATA_SIZE&0xfe)-1;i++) usb_data[i+5] = *(data++);
#ifdef FAST_BLOCK
opensourcebdm_usb_send_ep2(usb_data); /* Tx data */
usb_data[0]=1; /* read status */
opensourcebdm_usb_recv_ep2(usb_data);
#else
opensourcebdm_usb_send_ep0(usb_data);
#endif
address += (MAX_DATA_SIZE&0xfe)-1; /* update address */
count -= (MAX_DATA_SIZE&0xfe)-1; /* update count */
}
while (count>MAX_DATA_SIZE) {
usb_data[0]=(MAX_DATA_SIZE&0xfe)+4;
usb_data[1]=CMD_WRITE_BLOCK1;
*((unsigned int*)(usb_data+2)) = address;
usb_data[4]=(MAX_DATA_SIZE&0xfe);
for (i=0;i<(MAX_DATA_SIZE&0xfe);i++) usb_data[i+5] = *(data++);
#ifdef FAST_BLOCK
opensourcebdm_usb_send_ep2(usb_data); /* Tx data */
usb_data[0]=1; /* read status */
opensourcebdm_usb_recv_ep2(usb_data);
#else
opensourcebdm_usb_send_ep0(usb_data);
#endif
address += (MAX_DATA_SIZE&0xfe); /* update address */
count -= (MAX_DATA_SIZE&0xfe); /* update count */
}
if (count) {
usb_data[0]=count+4;
usb_data[1]=CMD_WRITE_BLOCK1;
*((unsigned int*)(usb_data+2)) = address;
usb_data[4]=count;
for (i=0;i<count;i++) usb_data[i+5] = *(data++);
#ifdef FAST_BLOCK
opensourcebdm_usb_send_ep2(usb_data); /* Tx data */
usb_data[0]=1; /* read status */
opensourcebdm_usb_recv_ep2(usb_data);
#else
opensourcebdm_usb_send_ep0(usb_data);
#endif
}
}
/* reads contents of core registers */
/* returns 0 on success and non-zero on failure */
unsigned char WINAPI __declspec(dllexport) opensourcebdm_read_regs(registers_t *registers) {
#if SELAHCS08
usb_data[0]=9; //return 9
usb_data[1]=CMD_READ_REGS;
opensourcebdm_usb_recv_ep0(usb_data);
registers->hcs08.pc = (*((unsigned int*)(usb_data+1)))&0xffff;
registers->hcs08.sp = (*((unsigned int*)(usb_data+3)))&0xffff;
registers->hcs08.hx = (*((unsigned int*)(usb_data+5)))&0xffff;
registers->hcs08.a = (*((unsigned int*)(usb_data+7)))&0x00ff;
registers->hcs08.ccr= (*((unsigned int*)(usb_data+8)))&0x00ff;
return(!(usb_data[0]==CMD_READ_REGS));
#else
usb_data[0]=13; // return 13 bytes
usb_data[1]=CMD_READ_REGS;
opensourcebdm_usb_recv_ep0(usb_data);
registers->hc12.pc = (*((unsigned int*)(usb_data+1)))&0xffff;
registers->hc12.sp = (*((unsigned int*)(usb_data+3)))&0xffff;
registers->hc12.ix = (*((unsigned int*)(usb_data+5)))&0xffff;
registers->hc12.iy = (*((unsigned int*)(usb_data+7)))&0xffff;
registers->hc12.d = (*((unsigned int*)(usb_data+9)))&0xffff;
registers->hc12.ccr= (*((unsigned int*)(usb_data+11)))&0xffff;
return(!(usb_data[0]==CMD_READ_REGS));
#endif
}
/* writes PC */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_pc(unsigned int value) {
usb_data[0]=3; /* send 3 bytes */
usb_data[1]=CMD_WRITE_REG_PC;
*((unsigned int*)(usb_data+2)) = value;
opensourcebdm_usb_send_ep0(usb_data);
}
/* writes SP */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_sp(unsigned int value) {
usb_data[0]=3; /* send 3 bytes */
usb_data[1]=CMD_WRITE_REG_SP;
*((unsigned int*)(usb_data+2)) = value;
opensourcebdm_usb_send_ep0(usb_data);
}
/* writes H:X (HCS08) or IX (HC12) */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_x(unsigned int value) {
usb_data[0]=3; /* send 3 bytes */
usb_data[1]=CMD_WRITE_REG_X;
*((unsigned int*)(usb_data+2)) = value;
opensourcebdm_usb_send_ep0(usb_data);
}
#if SELAHCS08
// no IY in HCS08
#else
/* writes IY (HC12 only) */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_y(unsigned int value) {
usb_data[0]=3; /* send 3 bytes */
usb_data[1]=CMD_WRITE_REG_Y;
*((unsigned int*)(usb_data+2)) = value;
opensourcebdm_usb_send_ep0(usb_data);
}
#endif
/* writes B:A (HC12) or A (HCS08) */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_d(unsigned int value) {
usb_data[0]=3; /* send 3 bytes */
usb_data[1]=CMD_WRITE_REG_D;
*((unsigned int*)(usb_data+2)) = value;
opensourcebdm_usb_send_ep0(usb_data);
}
/* writes CCR */
void WINAPI __declspec(dllexport) opensourcebdm_write_reg_ccr(unsigned int value) {
usb_data[0]=3; /* send 3 bytes */
usb_data[1]=CMD_WRITE_REG_CCR;
*((unsigned int*)(usb_data+2)) = value;
opensourcebdm_usb_send_ep0(usb_data);
}
#if SELAHCS08
unsigned char WINAPI __declspec(dllexport) opensourcebdm_read_status(void) {
usb_data[0]=2;
usb_data[1]=CMD_READ_STATUS;
opensourcebdm_usb_recv_ep0(usb_data);
return(usb_data[1]);
}
void WINAPI __declspec(dllexport) opensourcebdm_write_control(unsigned char value) {
usb_data[0]=2; ///send 2 bytes
usb_data[1]=CMD_WRITE_CONTROL;
usb_data[2] = value; //place full word
print("Start WRITE CONTROL %5x\r\n", value);
opensourcebdm_usb_send_ep0(usb_data);
print("End WRITE CONTROL\r\n");
}
void WINAPI __declspec(dllexport) opensourcebdm_write_bkpt(unsigned int value) {
usb_data[0]=3; ///send 3 bytes
usb_data[1]=CMD_WRITE_BKPT;
*((unsigned int*)(usb_data+2)) = value; //place full word
print("Start WRITE BKPT %5x\r\n", value);
opensourcebdm_usb_send_ep0(usb_data);
//printdump(usb_data, 3);
print("End WRITE BKPT\r\n");
}
unsigned int WINAPI __declspec(dllexport) opensourcebdm_read_bkpt(void) {
usb_data[0]=3; //get 3 bytes
usb_data[1]=CMD_READ_BKPT;
print("Start READ BKPT\r\n");
opensourcebdm_usb_recv_ep0(usb_data);
print("End READ BKPT %2x %2x %2x \r\n",usb_data[0],usb_data[1],usb_data[2] );
//return(usb_data[1]);
return((*((unsigned int *)(usb_data+1))&0xffff));
}
#endif
BOOL WINAPI __declspec(dllexport) LibMain(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved) {
char path[MAX_PATH];
char *charp;
time_t time_now;
switch (fdwReason) {
case DLL_PROCESS_ATTACH:
opensourcebdm_usb_init(); /* initialise USB */
#ifdef LOG
GetModuleFileName(NULL,path,sizeof(path));
charp=strchr(path,'\\');
if (charp!=NULL) {
while (strchr(charp+1,'\\')) charp=strchr(charp+1,'\\'); /* find the last backslash */
strcpy(charp+1,"OpenSourceBDM_dll.log");
log_file=fopen(path,"wb");
}
print("Log file path: %s\r\n",path);
print("Open Source BDM DLL v%1d.%1d. Compiled on %s, %s.\r\n",opensourcebdm_DLL_VERSION/16,opensourcebdm_DLL_VERSION&0x0f,__DATE__,__TIME__);
time(&time_now);
print("Log file created on: %s\r", ctime(&time_now));
#endif
break;
case DLL_PROCESS_DETACH:
#ifdef LOG
time(&time_now);
print("End of log file: %s\r", ctime(&time_now));
fclose(log_file);
#endif
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -