📄 dasm153.cpp
字号:
//=====================================================================================
void ShowHelp()
{
printf(_T(" EM78P153 DISASM TOOLS(C) Version:1.00\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" usage:dasm153 [-code address] <bin file> [src file]\n"));
printf(_T(" exp:dasm153 rom.bin\n"));
printf(_T(" dasm153 -2 rom.bin\n"));
printf(_T(" dasm153 -10 rom.bin src.asm\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" QQ:190376601,TEL:13751152175 ----Aleck.Shi\n"));
}
//=====================================================================================
// 文件分析
//=====================================================================================
int ParseFile(int iStart, FILE *fpIn,FILE *fpOut)
{
UINT64 lCodePos = 0;
UINT64 lCode = 0;
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(";// 通用寄存器:\n"));
fprintf(fpOut,_T(";//-------------------------------------------------------------------------------------\n"));
fprintf(fpOut,_T("R0 == 0X00\n"));
fprintf(fpOut,_T("TCC == 0x01\n"));
fprintf(fpOut,_T("PC == 0x02\n"));
fprintf(fpOut,_T("STATUS == 0x03\n"));
fprintf(fpOut,_T("RSR == 0x04\n"));
fprintf(fpOut,_T("P5 == 0x05\n"));
fprintf(fpOut,_T("P6 == 0x06\n"));
fprintf(fpOut,_T("IOCB == 0x0B\n"));
fprintf(fpOut,_T("IOCC == 0x0C\n"));
fprintf(fpOut,_T("IOCD == 0x0D\n"));
fprintf(fpOut,_T("WTD == 0x0E\n"));
fprintf(fpOut,_T("RF == 0x0F\n"));
fprintf(fpOut,_T("\n"));
fprintf(fpOut,_T("C == 0x00\n"));
fprintf(fpOut,_T("DC == 0x01\n"));
fprintf(fpOut,_T("Z == 0x02\n"));
fprintf(fpOut,_T("P == 0x03\n"));
fprintf(fpOut,_T("T == 0x04\n"));
fprintf(fpOut,_T("GP0 == 0x05\n"));
fprintf(fpOut,_T("GP1 == 0x06\n"));
fprintf(fpOut,_T("RST == 0x07\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(";//=====================================================================================\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].DataMask == 0x03ff) && (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 < 16)
{
return arrRegs[nReg];
}
else
{
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)
{
//sprintf(buff1,_T("0x%02x"),tblCode[i].RegsMask & lCode);
strcpy(buff1,GetRegname(tblCode[i].RegsMask & lCode));
//sprintf(buff2,_T("%d"),(tblCode[i].BitsMask & lCode) >> 6);
// 状态寄存器
if((tblCode[i].RegsMask & lCode) == 3)
{
strcpy(buff2,GetStatuName((tblCode[i].BitsMask & lCode) >> 6));
}
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)
{
//sprintf(buff1,_T("0x%02x"),tblCode[i].RegsMask & lCode);
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].DataMask == 0x03ff)
{
sprintf(buff1,_T("lab_%04x"),tblCode[i].DataMask & lCode);
}
else
{
// 立即数处理
sprintf(buff1,_T("@0x%02x"),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 + -