📄 dasm153.cpp
字号:
//=====================================================================================
//
// 模块: 反汇编EM78P153S代码!
//
// 版本: 1.00
//
// 日期: 2007-07-10
//
// 作者: 施探宇
//
// 说明: dasm153 -n rom.bin src.asm
//
//=====================================================================================
#include "stdafx.h"
// 保存标号个数
#define MAX_LABELS 256
// 代码地址上限
#define MAX_ADDRESS 0x400
// 最长代码字节数
#define CODE_MAX_BYTES 4
// 普通代码长度
#define CODE_BYTES 2
// 代码位数
#define CODE_BITS (CODE_BYTES * 8)
// 长整型,所有指令都要改长,这样改成别语言就方便;
typedef unsigned long UINT64;
typedef unsigned int UINT32;
typedef unsigned short UINT16;
typedef unsigned char UINT8;
typedef unsigned char BYTE;
//-----------------------------------------------------------------------------------
// 列表
//-----------------------------------------------------------------------------------
typedef struct tagDASM
{
// 代码值
UINT64 CodeData;
// 代码位
UINT64 CodeMask;
// 寄存器位
UINT64 RegsMask;
// 比特位
UINT64 BitsMask;
// 数据位
UINT64 DataMask;
// 输出格式
_TCHAR *pCodeFmt;
}DASM_TBL;
//-----------------------------------------------------------------------------------
// 代码转换有优先顺序:格式为 printf("CODE %S,%S,%S",REG,BIT,DAT)
//-----------------------------------------------------------------------------------
DASM_TBL tblCode[]=
{
// CODE CO-MASK RG-MASK BI-MASK DA-MASK FORMAT
{ 0x0000, 0xffff, 0x0000, 0x0000, 0x0000, _T("NOP")},
{ 0x0001, 0xffff, 0x0000, 0x0000, 0x0000, _T("DAA")},
{ 0x0002, 0xffff, 0x0000, 0x0000, 0x0000, _T("CONTW")},
{ 0x0003, 0xffff, 0x0000, 0x0000, 0x0000, _T("SLEP")},
{ 0x0004, 0xffff, 0x0000, 0x0000, 0x0000, _T("WDTC")},
{ 0x0000, 0xfff0, 0x000f, 0x0000, 0x0000, _T("IOW %s")},
{ 0x0010, 0xffff, 0x0000, 0x0000, 0x0000, _T("ENI")},
{ 0x0011, 0xffff, 0x0000, 0x0000, 0x0000, _T("DISI")},
{ 0x0012, 0xffff, 0x0000, 0x0000, 0x0000, _T("RET")},
{ 0x0013, 0xffff, 0x0000, 0x0000, 0x0000, _T("RETI")},
{ 0x0014, 0xffff, 0x0000, 0x0000, 0x0000, _T("CONTR")},
{ 0x0010, 0xfff0, 0x000f, 0x0000, 0x0000, _T("IOR %s")},
{ 0x0040, 0xffc0, 0x003f, 0x0000, 0x0000, _T("MOV %s,A")},
{ 0x0080, 0xffff, 0x0000, 0x0000, 0x0000, _T("CLRA")},
{ 0x00C0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("CLR %s")},
{ 0x0100, 0xffc0, 0x003f, 0x0000, 0x0000, _T("SUB A,%s")},
{ 0x0140, 0xffc0, 0x003f, 0x0000, 0x0000, _T("SUB %s,A")},
{ 0x0180, 0xffc0, 0x003f, 0x0000, 0x0000, _T("DECA %s")},
{ 0x01C0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("DEC %s")},
{ 0x0200, 0xffc0, 0x003f, 0x0000, 0x0000, _T("OR A,%s")},
{ 0x0240, 0xffc0, 0x003f, 0x0000, 0x0000, _T("OR %s,A")},
{ 0x0280, 0xffc0, 0x003f, 0x0000, 0x0000, _T("AND A,%s")},
{ 0x02c0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("AND %s,A")},
{ 0x0300, 0xffc0, 0x003f, 0x0000, 0x0000, _T("XOR A,%s")},
{ 0x0340, 0xffc0, 0x003f, 0x0000, 0x0000, _T("XOR %s,A")},
{ 0x0380, 0xffc0, 0x003f, 0x0000, 0x0000, _T("ADD A,%s")},
{ 0x03c0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("ADD %s,A")},
{ 0x0400, 0xffc0, 0x003f, 0x0000, 0x0000, _T("MOV A,%s")},
{ 0x0440, 0xffc0, 0x003f, 0x0000, 0x0000, _T("MOV %s,%s")},
{ 0x0480, 0xffc0, 0x003f, 0x0000, 0x0000, _T("COMA %s")},
{ 0x04c0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("COM %s")},
{ 0x0500, 0xffc0, 0x003f, 0x0000, 0x0000, _T("INCA")},
{ 0x0540, 0xffc0, 0x003f, 0x0000, 0x0000, _T("INC %s")},
{ 0x0580, 0xffc0, 0x003f, 0x0000, 0x0000, _T("DJZA %s")},
{ 0x05C0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("DJZ %s")},
{ 0x0600, 0xffc0, 0x003f, 0x0000, 0x0000, _T("RRCA %s")},
{ 0x0640, 0xffc0, 0x003f, 0x0000, 0x0000, _T("RRC %s")},
{ 0x0680, 0xffc0, 0x003f, 0x0000, 0x0000, _T("RLCA %s")},
{ 0x06c0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("RLC %s")},
{ 0x0700, 0xffc0, 0x003f, 0x0000, 0x0000, _T("SWAPA %s")},
{ 0x0740, 0xffc0, 0x003f, 0x0000, 0x0000, _T("SWAP %s")},
{ 0x0780, 0xffc0, 0x003f, 0x0000, 0x0000, _T("JZA %s")},
{ 0x07c0, 0xffc0, 0x003f, 0x0000, 0x0000, _T("JZ %s")},
{ 0x0800, 0xfe00, 0x003f, 0x01C0, 0x0000, _T("BC %s,%s")},
{ 0x0A00, 0xfe00, 0x003f, 0x01C0, 0x0000, _T("BS %s,%s")},
{ 0x0C00, 0xfe00, 0x003f, 0x01C0, 0x0000, _T("JBC %s,%s")},
{ 0x0E00, 0xfe00, 0x003f, 0x01C0, 0x0000, _T("JBS %s,%s")},
{ 0x1000, 0xfc00, 0x0000, 0x0000, 0x03ff, _T("CALL %s")},
{ 0x1400, 0xfc00, 0x0000, 0x0000, 0x03ff, _T("JMP %s")},
{ 0x1800, 0xff00, 0x0000, 0x0000, 0x00ff, _T("MOV A,%s")},
{ 0x1900, 0xff00, 0x0000, 0x0000, 0x00ff, _T("OR A,%s")},
{ 0x1A00, 0xff00, 0x0000, 0x0000, 0x00ff, _T("AND A,%s")},
{ 0x1B00, 0xff00, 0x0000, 0x0000, 0x00ff, _T("XOR A,%s")},
{ 0x1C00, 0xff00, 0x0000, 0x0000, 0x00ff, _T("RETL %s")},
{ 0x1D00, 0xff00, 0x0000, 0x0000, 0x00ff, _T("SUB A,%s")},
{ 0x1E00, 0xff00, 0x0000, 0x0000, 0x00ff, _T("INT")},
{ 0x1F00, 0xff00, 0x0000, 0x0000, 0x00ff, _T("ADD A,%s")},
};
//-----------------------------------------------------------------------------------
// 寄存器名称
//-----------------------------------------------------------------------------------
_TCHAR *arrRegs[]=
{
/*0x00*/ _T("R0"),
/*0x01*/ _T("TCC"),
/*0x02*/ _T("PC"),
/*0x03*/ _T("STATUS"),
/*0x04*/ _T("RSR"),
/*0x05*/ _T("P5"),
/*0x06*/ _T("P6"),
/*0x07*/ _T("R_7"),
/*0x08*/ _T("R_8"),
/*0x09*/ _T("R_9"),
/*0x0A*/ _T("R_A"),
/*0x0B*/ _T("IOCB"),
/*0x0C*/ _T("IOCC"),
/*0x0D*/ _T("IOCD"),
/*0x0E*/ _T("WTD"),
/*0x0F*/ _T("RF"),
};
//-----------------------------------------------------------------------------------
// 状态位
//-----------------------------------------------------------------------------------
_TCHAR *arrStatus[]=
{
/*0x00*/ _T("C"),
/*0x01*/ _T("DC"),
/*0x02*/ _T("Z"),
/*0x03*/ _T("P"),
/*0x04*/ _T("T"),
/*0x05*/ _T("GP0"),
/*0x06*/ _T("GP1"),
/*0x07*/ _T("RST"),
};
//-----------------------------------------------------------------------------------
// 默认文件名称
//-----------------------------------------------------------------------------------
_TCHAR *pStart = _T("");
_TCHAR *pBinFile = _T("rom.bin");
_TCHAR *pSrcFile = _T("src.asm");
_TCHAR buff[]=_T("0x0000");
// 文件指针
FILE *fpBin;
FILE *fpSrc;
// 默认起始地址:
int iCodeStart = 0;
// 参数序号
int idArgv = 1;
// 指令缓冲区
BYTE pCodeBuff[CODE_MAX_BYTES];
// 存储标号和函数地址
UINT64 useLabels[MAX_LABELS];
UINT64 posLabels = 0;
// 显示帮助
void ShowHelp();
// 状态名
_TCHAR *GetStatuName(UINT64 nBits);
// 寄存器名
_TCHAR *GetRegname(UINT64 nReg);
// 登记标号
int Preparse(UINT64 lCode);
// 代码分析
int ParseCode(UINT64 lLine,UINT64 lCode,FILE *fpOut);
// 查找已登记标号
int FindLabel(UINT64 lLine);
// 文件分析
int ParseFile(int iStart, FILE *pIn,FILE *pOut);
//=====================================================================================
// 开始函数
//=====================================================================================
int main(int argc, _TCHAR* argv[])
{
// 判断参数
if(argc < 2 || argc > 4)
{
ShowHelp();
#ifdef _DEBUG
getchar();
#endif
return -1;
}
// 默认指向第一个参数
idArgv = 1;
pStart = argv[idArgv];
// 是否有地址参数?
if(pStart[0] == '-')
{
iCodeStart = atoi(&pStart[1]);
idArgv ++;
}
if(argc > idArgv )
{
pBinFile = argv[idArgv ];
}
if(argc > idArgv + 1)
{
pSrcFile = argv[idArgv +1];
}
fpBin = fopen(pBinFile,"rb");
if(!fpBin)
{
printf("Can't open bin file: %s!\n",pBinFile);
#ifdef _DEBUG
getchar();
#endif
return -1;
}
fpSrc = fopen(pSrcFile,"w+a");
if(!fpSrc)
{
fclose(fpBin);
printf("Can open src file: %s!\n",pSrcFile);
#ifdef _DEBUG
getchar();
#endif
return -1;
}
// 显示抬头
printf(_T(" EM78P153S DISASM TOOLS(C) Version 1.00\n"));
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" Code start: %x.\n"),iCodeStart);
printf(_T(" Input file: %s.\n"),pBinFile);
printf(_T(" Output file: %s.\n"),pSrcFile);
printf(_T("---------------------------------------------------------------\n"));
printf(_T(" QQ:190376601,TEL:13751152175 --Aleck.Shi\n"));
// 分析文件
ParseFile(iCodeStart,fpBin,fpSrc);
fclose(fpBin);
fclose(fpSrc);
// 处理完毕!
printf(_T(" Processed done!\n"));
#ifdef _DEBUG
getchar();
#endif
return 0;
}
//=====================================================================================
// 显示帮助
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -