📄 dpic.cpp
字号:
fprintf(fpOut,_T(";//=====================================================================================\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 模块: <模块名称>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 版本: <版本号>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 日期: <日期>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 作者: <作者>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";// 说明: <模块说明>\n"));
fprintf(fpOut,_T(";//\n"));
fprintf(fpOut,_T(";//=====================================================================================\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T("W EQU H'0000'\n"));
fprintf(fpOut,_T("F EQU H'0001'\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";----- Register Files -----------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T("INDF EQU H'0000'\n"));
fprintf(fpOut,_T("TMR0 EQU H'0001'\n"));
fprintf(fpOut,_T("PCL EQU H'0002'\n"));
fprintf(fpOut,_T("STATUS EQU H'0003'\n"));
fprintf(fpOut,_T("FSR EQU H'0004'\n"));
fprintf(fpOut,_T("PORTA EQU H'0005'\n"));
fprintf(fpOut,_T("PORTB EQU H'0006'\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";----- STATUS Bits --------------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T("PA2 EQU H'0007'\n"));
fprintf(fpOut,_T("PA1 EQU H'0006'\n"));
fprintf(fpOut,_T("PA0 EQU H'0005'\n"));
fprintf(fpOut,_T("NOT_TO EQU H'0004'\n"));
fprintf(fpOut,_T("NOT_PD EQU H'0003'\n"));
fprintf(fpOut,_T("Z EQU H'0002'\n"));
fprintf(fpOut,_T("DC EQU H'0001'\n"));
fprintf(fpOut,_T("C EQU H'0000'\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";----- OPTION Bits --------------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T("T0CS EQU H'0005'\n"));
fprintf(fpOut,_T("T0SE EQU H'0004'\n"));
fprintf(fpOut,_T("PSA EQU H'0003'\n"));
fprintf(fpOut,_T("PS2 EQU H'0002'\n"));
fprintf(fpOut,_T("PS1 EQU H'0001'\n"));
fprintf(fpOut,_T("PS0 EQU H'0000'\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T(";// 常量定义:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T(";// 变量定义:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T(";// 代码开始:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("\t\tORG 0x00\n"));
// 查找起始地址
fseek(fpIn,iStart,SEEK_SET);
// 登记标号!
posLabels = 0;
lCodePos = 0;
while(!feof(fpIn))
{
fread(pCodeBuff,1,CODE_BYTES,fpIn);
// 转换代码
lCode = pCodeBuff[0];
lCode |= pCodeBuff[1] << 8;
// 登记标号
Preparse(lCode);
lCodePos ++;
// 地址上限检查
if(lCodePos >= MAX_ADDRESS)
break;
}
// 查找起始地址
fseek(fpIn,iStart,SEEK_SET);
lCodePos = 0;
while(!feof(fpIn))
{
// 读取数据
fread(pCodeBuff,1,CODE_BYTES,fpIn);
// 转换代码
lCode = pCodeBuff[0];
lCode |= pCodeBuff[1] << 8;
// 代码生成
ParseCode(lCodePos,lCode,fpOut);
lCodePos ++;
// 地址上限检查
if(lCodePos >= MAX_ADDRESS)
break;
}
fprintf(fpOut,_T("\t\tEND\n"));
fprintf(fpOut,_T(";//=====================================================================================\n"));
fprintf(fpOut,_T(";// 文件结束. <END OF FILE> \n"));
fprintf(fpOut,_T(";//=====================================================================================\n"));
return 0;
}
//=====================================================================================
// 行号,标号分析
//=====================================================================================
int Preparse(UINT64 lCode)
{
UINT64 i = 0;
UINT64 lCount = sizeof(tblCode) / sizeof(DASM_TBL);
UINT64 lLine = 0;
// 初始化
for( i = 0; i < lCount; i++ )
{
// 寻找跳转: JMP k,CALL k
if(((tblCode[i].CodeData == CODE_CALL_ID)||(tblCode[i].CodeData == CODE_GOTO_ID))&&(posLabels < MAX_LABELS))
{
// 匹配指令集
if(((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData))
{
// 行号
lLine = lCode & tblCode[i].DataMask;
// 登记标号
if(!FindLabel(lLine))
{
useLabels[posLabels] = lLine;
#ifdef _DEBUG
printf("useLabels[%d] = %04x\n",posLabels,lLine);
#endif
posLabels++;
return 1;
}
}
}
}
return 0;
}
//=====================================================================================
// 是否登记行号
//=====================================================================================
int FindLabel(UINT64 lLine)
{
UINT64 i = 0;
for( i = 0; i < posLabels; i++ )
{
// 登记标号
if(useLabels[i] == lLine)
return 1;
}
return 0;
}
//=====================================================================================
// 取得寄存器名称!
//=====================================================================================
_TCHAR *GetRegname(UINT64 nReg)
{
if(nReg < (sizeof(arrRegs) / sizeof(arrRegs[0])))
{
return arrRegs[nReg];
}
else
{
// reg name
sprintf(buff,_T("0x%02x"),nReg);
}
return buff;
}
//=====================================================================================
// 取得状态位名称
//=====================================================================================
_TCHAR *GetStatuName(UINT64 nBits)
{
if(nBits < 8)
{
return arrStatus[nBits];
}
return NULL;
}
//=====================================================================================
// 代码分析
//=====================================================================================
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut)
{
UINT64 i = 0;
UINT64 lCount = sizeof(tblCode) / sizeof(DASM_TBL);
_TCHAR buff1[64];
_TCHAR buff2[64];
for( i = 0; i < lCount; i++ )
{
// 匹配指令集
if((tblCode[i].CodeMask & lCode) == tblCode[i].CodeData)
{
// 有需要的才标号,需要查表
if(FindLabel(lLine))
{
// 标号格式
fprintf(fpOut,_T("lab_%04x:\n"),lLine);
}
// 开始空点位置!
fprintf(fpOut,_T("\t\t"));
// 类似:BC r,b
if(tblCode[i].RegsMask && tblCode[i].BitsMask)
{
strcpy(buff1,GetRegname(tblCode[i].RegsMask & lCode));
// 状态寄存器 (STATUS == REG_STATUS_ID)
if((tblCode[i].RegsMask & lCode) == REG_STATUS_ID)
{
strcpy(buff2,GetStatuName((tblCode[i].BitsMask & lCode) >> 6));
}
else
{
// 判断方向位
if(tblCode[i].BitsMask == 0x0020)
{
if(tblCode[i].BitsMask & lCode)
sprintf(buff2,_T("%s"),_T("F"));
else
sprintf(buff2,_T("%s"),_T("W"));
}
else
{
sprintf(buff2,_T("%d"),(tblCode[i].BitsMask & lCode) >> 6);
}
}
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1,buff2);
}
// 类似:INC r
else if(tblCode[i].RegsMask)
{
// 寄存器名称
strcpy(buff1,GetRegname(tblCode[i].RegsMask & lCode));
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
// 类似 JMP k,CALL k
else if(tblCode[i].DataMask)
{
// 是否函数或标号?
if((tblCode[i].CodeData == CODE_CALL_ID) || (tblCode[i].CodeData == CODE_GOTO_ID))
{
sprintf(buff1,_T("lab_%04x"),tblCode[i].DataMask & lCode);
}
else
{
// 立即数处理
sprintf(buff1,_T("H'%04X'"),tblCode[i].DataMask & lCode);
}
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt,buff1);
}
// 类似 WDTC,CLRA
else if(!tblCode[i].DataMask && !tblCode[i].BitsMask && !tblCode[i].RegsMask)
{
fprintf(fpOut,(const char*)tblCode[i].pCodeFmt);
}
// 错误的匹配!
else
{
fprintf(fpOut,_T(";Error Code:%04x\n"), lCode);
printf(_T("Error Code:%04x\n"),lCode);
}
// 换行
fprintf(fpOut,_T("\n"));
break;
}
}
// 错误的指令
if(i >= lCount)
{
fprintf(fpOut,_T(";Unknow Code:%04x\n"),lCode);
printf(_T("Unknow Code:%04x\n"),lCode);
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -