?? picddxhi-tech.c
字號:
int cr;
//將輸入串復制到新空間
buf =HeapAlloc(Heap1,0,strlen(instr));
strcpy(buf, instr);
p =strstr(buf, scmp);
if(!p){ //assigned注釋是否有效
HeapFree(Heap1, 0, buf);
return 0;
}
p +=strlen(scmp); //找到符號名
p1 =strtok(buf, " \t\n");
p1 +=strlen(p1) +1;
p1 =strtok(NULL, " \t\n");
strcpy(item->variable, p1); //輸出變量名
p1 =strtok(p -1, " \t\n");
strcpy(item->symbo, p1); //輸出符號名
HeapFree(Heap1, 0, buf);
return 1;
}
//翻譯一個assigned注釋到新串
int TranslateAssigned(char *instr, PARRAY *SymbolTable, char *outstr)
{
const char scmp[] =" assigned to ";
char *p, *p1;
char buf[1024];
char s[32];
long i;
SYMBOITEM *symp;
int cr;
char c;
//將輸入串復制到新空間
strcpy(buf, instr);
p =strstr(buf, scmp);
if(!p){ //assigned注釋是否有效
return 0;
}
p +=strlen(scmp); //找到符號名
p1 =strtok(buf, " \t\n");
p1 +=strlen(p1) +1;
p1 =strtok(NULL, " \t\n");
strcpy(outstr, ",,, ;");
strcat(outstr, p1); //輸出變量名
strcat(outstr, " address: ");
p1 =strpbrk(p, "+-");
c =p1[0];
p1[0] =0;
//找到對應符號名
for(i =0; i <SymbolTable->cnt; i++){
symp =SymbolTable->p[i];
cr =strcmp(p, symp->name);
if(!cr){
sprintf(s, "%04lX", symp->address);
strcat(outstr, s); //輸出相應地址
p1[0] =c;
strcat(outstr, p1);
return 1;
}
}
return 0;
}
//置換符號名到變量名
int CovertSymbo(char *instr, char *outstr)
{
int i;
ASSIGNEDITEM *agnp;
char *sp, *sp1;
char buf[256];
strcpy(outstr, instr);
for(i =0; i <gAssignedTable.cnt; i++){
agnp =gAssignedTable.p[i];
sp =strstr(outstr, agnp->symbo);
if(sp){
sp1 =sp +strlen(agnp->symbo); //找到符號名尾
strcpy(buf, sp1);
sp[0] =0; //從符號名前截斷串
strcat(outstr, agnp->variable); //補上變量名
strcat(outstr, buf);
break;
}
}
return 1;
}
//輸出到文件
int fPutToFile(char *buf, FILE *file)
{
#ifdef _PUTINFO
fprintf(stderr, buf);
#endif
fputs(buf, file);
return 1;
}
void debugout(char *s)
{
fprintf(stderr,"%s",s);
}
//翻譯一行文本到.SDI文件
void TranslateLine(FILE *outfile,char *buffer)
{
const char sCH[] ="////";
static char slable[256] ={0}; //保存前一個跳轉標號
char savebuf[1027];
char buf[256];
char *bp;
int r;
MATERIAL matl;
ASSIGNEDITEM *pagnitem;
r =AnalyseLine(buffer, &matl);
switch(r){
case 1: //指令,文本包括:行號,地址,機器碼,指令
//生成一行調試信息
sprintf(savebuf,"%06X",matl.Address); //Address
strcat(savebuf,",");
strcat(savebuf,matl.Code); //Code
strcat(savebuf,",");
if(strlen(slable)){
strcat(savebuf,slable); //Lable
strcat(savebuf,",");
strcat(savebuf,slable); //在匯編語句前添加跳轉標號
strcat(savebuf,":");
slable[0] =0; //清除跳轉標號
}else{
strcat(savebuf,",");
}
if(gAssignedTable.cnt) CovertSymbo(matl.Text, buf); //當有符號定義時進行符號置換
else strcpy(buf, matl.Text); //Operation
strcat(savebuf, buf);
if(savebuf[strlen(savebuf) -1] !='\n') strcat(savebuf, "\n");
fPutToFile(savebuf, outfile);
break;
case 2: //跳轉標號,文本包括:行號,地址,標識符
if(!strnicmp(matl.Text, "ds", 2)){ //處理ds標識
sprintf(buf,"%06X",matl.Address); //Address
strcpy(savebuf,",,,");
strcat(savebuf,sCH);
strcat(savebuf,";");
strcat(savebuf,slable); //在變量前添加標號
strcat(savebuf," address: ");
slable[0] =0; //清除標號
strcat(savebuf,buf);
strcat(savebuf," ");
strcat(savebuf,matl.Text);
fPutToFile(savebuf, outfile);
}
else strcpy(slable, matl.Text);
break;
case 3: //陳述,文本包括:行號,陳述
switch(AnalyseComment(matl.Text)){
case 1: //普通注釋
strcpy(savebuf,",,,");
strcat(savebuf,sCH);
strcat(savebuf, matl.Text);
fPutToFile(savebuf, outfile);
break;
case 3: //assigned注釋
TranslateAssigned(matl.Text, &gSymboTable, savebuf);
pagnitem =HeapAlloc(Heap1,0,sizeof(ASSIGNEDITEM));
if(!pagnitem){
fprintf(stderr, "Can't alloc memory.");
exit(2);
}
TranslateAssignedToItem(matl.Text, &gAssignedTable, pagnitem);
PArrayAdd(&gAssignedTable, pagnitem);
fPutToFile(savebuf, outfile);
break;
}
break;
case 4: //接上一行,文本包括:起始空格,文本
fseek(outfile, -2, SEEK_CUR); //接上一行文本
strcpy(savebuf, matl.Text);
if(savebuf[strlen(savebuf) -1] !='\n') strcat(savebuf, "\n");
fPutToFile(savebuf, outfile);
break;
case 5: //說明,文本包括:無起始空格的說明
strcpy(savebuf,",,,");
strcat(savebuf, matl.Text);
fPutToFile(savebuf, outfile);
break;
case 7: //FNSIZE陳述
#ifdef _PUTINFO
PutAssignedTable(&gAssignedTable);
#endif
PArrayClear(&gAssignedTable); //清除置換表,為下一個程序作準備
break;
}
}
//分開完全文件名的各個部分
typedef struct tagSEPARATEFULLNAME{
char path[MAX_PATH]; //路徑
char name[MAX_PATH]; //主文件名
char ext[MAX_PATH]; //擴展名
} SEPARATEFULLNAME;
void SeparateFullName(char *buffer, SEPARATEFULLNAME *spname)
{
char buf[MAX_PATH];
char *cp, *cp1;
strcpy(buf, buffer);
//分離短文件名
cp =strrchr(buf, '\\');
if(!cp) cp =buf;
else cp++;
//分離擴展文件名
cp1 =strrchr(cp, '.');
if(cp1){
*cp1 =0;
cp1++;
strcpy(spname->ext, cp1);
}else strcpy(spname->ext, "");
//分離主文件名
strcpy(spname->name, cp);
//分離路徑
if(cp ==buf) strcpy(spname->path, "");
else{
cp--;
*cp =0;
strcpy(spname->path, buf);
}
}
typedef struct tagLSTINFO{
char Name[MAX_PATH]; //文件名
long Address; //起始地址
} LSTINFO;
#define MAX_LST 32 //最大.LST文件數
char sdifilename[MAX_PATH];
LSTINFO *LstInfoTable[MAX_LST]; //.LST文件信息結構數據(LSTINFO)指針數組
int fcnt; //.LST文件數量
LSTINFO *pLstInfo;
PARRAY gSymboTable; //符號表
//Main route
int main(int argc,char *argv[])
{
const char sAS[] ={"HI-TECH Software PICC Macro Assembler"};
char buffer[1024];
char lastbuf[1024];
int i, j;
int lc = 0; //The total that lines in input file.
int rt;
char *cp, *cp1;
WIN32_FIND_DATA FindFileData;
HANDLE fh;
SEPARATEFULLNAME spname;
char sOrgPath[MAX_PATH];
MATERIAL matl;
if (argc < 2)
{
Usage(argv[0]);
return 1;
}
/* handle the program options */
HandleOptions(argc,argv);
Heap1 =HeapCreate(0, 4*1024*1024, 0);
if(!Heap1) fprintf(stderr, "Can't create Heap.");
//得到所有.LST文件名
fcnt =0;
SeparateFullName(argv[1], &spname);
strcpy(buffer, spname.path);
if(strlen(buffer)) strcat(buffer, "\\*.lst"); //若有路徑名則添加'\'
else strcpy(buffer, "*.lst");
fh =FindFirstFile(buffer, &FindFileData); //尋找第一個.LST文件
if(fh ==INVALID_HANDLE_VALUE){
fprintf(stderr, "Can not find .LST file.");
return 1;
}
LstInfoTable[fcnt] =HeapAlloc(Heap1,0,sizeof(LSTINFO));
if(strlen(spname.path)){ //若有路徑名則合并成完全文件名
strcpy(LstInfoTable[fcnt]->Name, spname.path);
strcat(LstInfoTable[fcnt]->Name, "\\");
strcat(LstInfoTable[fcnt]->Name, FindFileData.cFileName);
}else
strcpy(LstInfoTable[fcnt]->Name, FindFileData.cFileName);
fcnt++;
while(FindNextFile(fh, &FindFileData)){ //尋找接下來的.LST文件
LstInfoTable[fcnt] =HeapAlloc(Heap1,0,sizeof(LSTINFO));
if(strlen(spname.path)){
strcpy(LstInfoTable[fcnt]->Name, spname.path);
strcat(LstInfoTable[fcnt]->Name, "\\");
strcat(LstInfoTable[fcnt]->Name, FindFileData.cFileName);
}else
strcpy(LstInfoTable[fcnt]->Name, FindFileData.cFileName);
fcnt++;
}
//獲得.LST文件首地址
for(i =0; i< fcnt; i++){
lstfile = fopen(LstInfoTable[i]->Name,"rt"); /* Open input file. */
if(!lstfile){
fprintf(stderr,"Can not get .lst file.\n");
return 1;
}else{
fprintf(stderr,"Check %s file.\n", LstInfoTable[i]->Name);
}
LstInfoTable[i]->Address = fGetFirstAddress(lstfile, buffer);
fclose(lstfile);
}
//根據首地址將.LST文件信息表排序(冒泡排序)
for(j =fcnt; j >1; j--){
for(i =0; i< j -1; i++){
if(LstInfoTable[i]->Address > LstInfoTable[i +1]->Address){ //元素比較
//元素位置交換
pLstInfo =LstInfoTable[i];
LstInfoTable[i] =LstInfoTable[i +1];
LstInfoTable[i +1] =pLstInfo;
}
}
}
//根據可執行程序參數生成.SDI文件名
strcpy(buffer, argv[1]);
cp =strrchr(buffer, '\\');
if(!cp) cp =buffer;
else cp++;
strcpy(sdifilename, cp);
//改變文件名
cp1 =strrchr(sdifilename, '.'); //去掉擴展名
if(cp1){
*cp1 =0;
}
strcat(sdifilename,".SDI"); //改變擴展名
//生成完全文件名
cp =strrchr(buffer, '\\');
if(!cp) cp =buffer;
else cp++;
*cp =0; //去掉原始文件名的路徑
strcat(buffer, sdifilename);
strcpy(sdifilename, buffer);
//創建輸出的.SDI文件
if((sdifile = fopen(sdifilename, "wt"))==NULL){
fprintf(stderr, "Don't create %s file.\n", sdifilename);
return 1;
}else{
fprintf(stderr, "Create %s file.\n", sdifilename);
}
sprintf(buffer,"000000,0000,startup,startup\n"); //復位地址
fPutToFile(buffer, sdifile);
rt =PArrayInit(&gSymboTable); //初始化符號表指針數組
if(!rt) return 2;
rt =PArrayInit(&gAssignedTable); //初始化符號置換表指針數組
if(!rt) return 2;
//依次轉換.LST文件到.SDI文件
for(i =0; i< fcnt; i++){
//打開.LST文件
lstfile = fopen(LstInfoTable[i]->Name,"rt"); //打開.SDI輸出文件
if(!lstfile){
fprintf(stderr,"Can not open .lst file.\n");
return 1;
}else{
fprintf(stderr,"Open %s file to covert.\n", LstInfoTable[i]->Name);
}
fGetSymboTable(lstfile, &gSymboTable); //得到符號表
#ifdef _PUTINFO
PutSymboTable(&gSymboTable); //輸出符號表
#endif
//開始轉換
lc =0;
fseek(lstfile, 0, SEEK_SET);
sprintf(buffer, "\n,,,/****;FILE: %s****/\n\n", LstInfoTable[i]->Name); //輸出文件名
fPutToFile(buffer, sdifile);
while(1){
rt = fgetline(lstfile, buffer);
if(!strncmp(buffer,sAS,strlen(sAS))) break; //到達匯編開始位置
}
rt = fgetline(lstfile, lastbuf); //讀入第一行
do{
rt = fgetline(lstfile, buffer);
lc++;
if(!strncmp(lastbuf,sAS,strlen(sAS))) break; //到達匯編結束位置
//連接不連續的行文本
if(AnalyseLine(buffer, &matl) ==4){
lastbuf[strlen(lastbuf) -1] =0; //截去換行符
cp =strtok(buffer, " ");
if(cp[strlen(cp) -1]!='\n') cp[strlen(cp)]=' ';
strcat(lastbuf, cp);
}else{
TranslateLine(sdifile,lastbuf);
strcpy(lastbuf, buffer);
}
}while(rt != 0);
fclose(lstfile);
}
fclose(sdifile);
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -