📄 obj_viewer_c.cpp
字号:
//---------------------------------------------------------------------------
//-------- OBJ_Viewer_C.cpp -------------------------------------------------
//---------------------------------------------------------------------------
#include "OBJ_Viewer_H.h"
#include <time.h>
//---------------------------------------------------------------------------
const char* OBJ_Viewer::ppline =
"\n---------------------------------------------------------------------------";
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 把内容写到DiskFile上,NULL表示写到屏幕上。
//---------------------------------------------------------------------------
ERR OBJ_Viewer::ViewBy(const char* ObjFile, const char* DiskFile)
{ printf("\nHello! OBJ ANALIZER.");
if(!Open(ObjFile))
{ printf("\nOpen file %s error!", ObjFile); return Have_Errs; } // endif
if(!SetOutput(DiskFile))
{ printf("\nOpen file %s error!", DiskFile); return Have_Errs; } // endif
fprintf(DesPt,ppline);
fprintf(DesPt,"\nOpening file %s...",ObjFile);
int8u pre = fgetc(SrcPt); // 预读
while (!feof(SrcPt))
{ ungetc(pre,SrcPt); //
fprintf(DesPt, ppline); //
FindREC(); // 不断的找记录
pre = fgetc(SrcPt); // 预读
} // end while
fprintf(DesPt,ppline);
fprintf(DesPt,"\nEnd of %s.",ObjFile);
fprintf(DesPt,ppline);
if(Close())
{ printf("\nView file has been written to %s.",DiskFile?DiskFile:"screen"); } // endif
return OK_no_Err;
} // end ViewBy
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::FindREC()
{ int8u ch, typ, chksum; int16u len;
typ = fgetc(SrcPt);
ch = fgetc(SrcPt);
len = fgetc(SrcPt);
chksum = typ + ch + len;
len = ( len << 8 ) + ch;
for( register int16u i = 0; i < len; ++i )
{ buf[i] = fgetc(SrcPt);
chksum += buf[i];
} // end for
fprintf(DesPt, "\nREC TYPE=[%2.2XH] Len=[%4.4XH] ", typ, len);
fprintf(DesPt, "CHKSUM=[%2.2XH] [%s]\n",buf[len-1], chksum ? "Error!" : "OK!");
if(chksum != 0)
{ fprintf(DesPt, "Please check this record! ..."); return; } // endif
switch(typ)
{ case 0x02: show02(buf); break;
case 0x04: show04(buf); break;
case 0x06: show06(buf,len); break;
case 0x07: show07(buf,len); break;
case 0x09: show09(buf,len); break;
case 0x0f: show0F(buf,len); break;
case 0x10: show10(buf); break;
case 0x12: show12(buf,len); break;
case 0x17: show17(buf,len); break;
case 0x19: show19(buf,len); break;
case 0x23: show23(buf,len); break;
case 0x24: show24(buf); break;
case 0x70: show70(buf); break;
default : { fprintf(DesPt, "\n[???????????????????????????]"); } // end default
} // end switch
if(Origin) { fprintf(DesPt,"\n"); PRrec(buf, len); } // endif
} // end FindREC
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 把十六进制数转换成ASCII字符码,并显示。
//---------------------------------------------------------------------------
void OBJ_Viewer::PR_Bin2Asc(int8u* buf, int8u len)
{ fprintf(DesPt, " [");
for( register int8u k = 0; k < len; ++k )
{ register int8u t = buf[k];
if( t < ' ' || t > 0x7f )
{ fprintf(DesPt, "%c",0x06); } // endif
else
{ fprintf(DesPt, "%c",t); } // end else
} // end for k
fprintf(DesPt, "]\n");
} // end PR_Bin2Asc
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define gekai(x) if(!(((x)+1)%4)) { fprintf(DesPt, " "); }
//---------------------------------------------------------------------------
// 把一条记录以十六进制数显示出来。(右栏上显示ASCII字符)
//---------------------------------------------------------------------------
void OBJ_Viewer::PRrec(int8u buf[],int16u len)
{ int16u i;
fprintf(DesPt, "\n");
for(i = 0; i < len; ++i)
{ fprintf(DesPt, "%2.2X ",buf[i]); gekai(i);
if( !((i+1)%16) ) { PR_Bin2Asc(buf + i - 15, 16); } // endif
} // end for i
int8u k = i % 16; // k 是余数。
if(k == 0) { return; } // endif
for(register int8u j = k; j < 16; ++j )
{ fprintf(DesPt, " "); gekai(j); } // end for j
i -= k; PR_Bin2Asc(buf + i, k);
} // end PRrec
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::showSEGINFO(int8u buf)
{ if( buf & 0x80 )
{ fprintf(DesPt, "\n\t[E=1] Enpty segment."); } // endif
else
{ fprintf(DesPt, "\n\t[E=0] Not empty segment."); } // end else
if( buf & 0x40 )
{ fprintf(DesPt, "\t\t\t[bit6=1]"); } // endif
else
{ fprintf(DesPt, "\t\t\t[bit6=0]"); } // end else
if( buf & 0x20 )
{ fprintf(DesPt, "\n\t[OVL=1] The segment is overlayable."); } // endif
else
{ fprintf(DesPt, "\n\t[OVL=0] The segment is NOT overlayable."); } // end else
fprintf(DesPt, "\n\t[SEG REG]= register bank #%d",(buf & 0x18)>>3);
fprintf(DesPt, "\n\t[SEG TYPE]=");
switch(buf & 0x07)
{ case 0 : fprintf(DesPt, "CODE(0)"); break;
case 1 : fprintf(DesPt, "XDATA"); break;
case 2 : fprintf(DesPt, "DATA"); break;
case 3 : fprintf(DesPt, "IDATA"); break;
case 4 : fprintf(DesPt, "BIT"); break;
default: fprintf(DesPt, "???");
} // end switch
} // end showSEGINFO
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::showSYMINFO(int8u buf)
{ if( buf & 0x80 )
{ fprintf(DesPt, "\n\t[IND=1]Procedure is indirecly_callable."); } // endif
else
{ fprintf(DesPt, "\n\t[IND=0]Procedure is NOT indirecly_callable."); } // end else
if( buf & 0x40 )
{ fprintf(DesPt, "\n\t[VAR=1]Public symbol is a variable."); } // endif
else
{ fprintf(DesPt, "\n\t[VAR=0]Public symbol is NOT a variable."); } // end else
if( buf & 0x20 )
{ fprintf(DesPt, "\n\t[RBF=1]SYM REG field is valid."); } // endif
else
{ fprintf(DesPt, "\n\t[RBF=0]SYM REG field is NOT valid."); } // end else
fprintf(DesPt, "\tSYM REG=#%d",(buf & 0x18)>>3);
fprintf(DesPt, "\tUSAGE TYPE=");
switch(buf & 0x07)
{ case 0 : fprintf(DesPt, "CODE(0)"); break;
case 1 : fprintf(DesPt, "XDATA"); break;
case 2 : fprintf(DesPt, "DATA"); break;
case 3 : fprintf(DesPt, "IDATA"); break;
case 4 : fprintf(DesPt, "BIT"); break;
case 5 : fprintf(DesPt, "NUMBER"); break;
default: fprintf(DesPt, "???");
} // end switch
} // end showSYMINFO
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
int8u OBJ_Viewer::showStr(const int8u *buf)
{ for(int16u i = 1; i <= *buf; i++) // buf[0] 是长度
{ fprintf(DesPt, "%c", buf[i]); } // end for
return *buf+1;
} // end showStr
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//
//
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define buf16(i) (buf[i+1]<<8)+buf[i]
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::show02(int8u buf[])
{ fprintf(DesPt, "\n[Module Header Record 02H]");
fprintf(DesPt, "\n [module name]=");
int16u i = showStr(buf); // buf[0] 是长度
fprintf(DesPt, "\n [TRN ID]=%2.2XH",buf[i]);
Astring ge;
switch(buf[i])
{ case 0xfd : ge = "ASM51"; break;
case 0xfe : ge = "PL/M-51"; break;
case 0xff : ge = "RL51"; break;
default : ge = "Unknown";
} // end switch
fprintf(DesPt, "\t(This module is generated by %s.)",(const char*)ge);
++i;
fprintf(DesPt, "\t[unused byte]=%2.2XH",buf[i]);
} // end show02
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::show04(int8u buf[])
{ fprintf(DesPt, "\n[Module End Record 04H]");
fprintf(DesPt, "\n [module name]=");
int16u i = showStr(buf); // buf[0] 是长度
fprintf(DesPt, "\t\t[unused byte]=%2.2XH %2.2XH", buf[i],buf[i+1]);
i += 2;
fprintf(DesPt, "\n [REG MSK]=%2.2XH",buf[i]);
if(buf[i])
{ fprintf(DesPt, " Used bank");
if(buf[i] & 0x01) { fprintf(DesPt, " #0"); }
if(buf[i] & 0x02) { fprintf(DesPt, " #1"); }
if(buf[i] & 0x04) { fprintf(DesPt, " #2"); }
if(buf[i] & 0x08) { fprintf(DesPt, " #3"); }
if(buf[i] & 0xf0) { fprintf(DesPt, " #?"); }
fprintf(DesPt, ".");
} // endif
else { fprintf(DesPt, " Not use any bank?"); } // end else
++i;
fprintf(DesPt, "\t\t[unused byte]=%2.2XH",buf[i]);
} // end show04
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::show06(int8u buf[], int16u rlen)
{ fprintf(DesPt, "\n[Content Record 06H]");
int16u i = 0;
fprintf(DesPt, "\n [SEG ID]=%2.2X",buf[i]); ++i;
fprintf(DesPt, "\t\t [Offset]=%4.4X",buf16(i)); i+=2;
fprintf(DesPt, "\n [DAT]");
for( ; i < rlen-1 && i<12; i++)
{ fprintf(DesPt, " %2.2X", buf[i]); } // endfor
if(i>=12) { fprintf(DesPt, " ...... %2.2X",buf[rlen-2]); } // endif
} // end show06
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::show07(int8u buf[], int16u rlen)
{ fprintf(DesPt, "\n[Content Record 07H]");
int16u i = 0;
fprintf(DesPt, "\n [SEG ID]=%4.4X",buf16(i)); i+=2;
fprintf(DesPt, "\t\t [Offset]=%4.4X",buf16(i)); i+=2;
fprintf(DesPt, "\n [DAT]");
for( ; i < rlen-1 ; ++i)
{ fprintf(DesPt, " %2.2X", buf[i]);
if(!Detail && i>=12) { break; } // endif
} // end for
if(!Detail) { fprintf(DesPt, " ...... %2.2X",buf[rlen-2]); } // endif
} // end show07
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void OBJ_Viewer::show09(int8u buf[], int16u rlen)
{ fprintf(DesPt, "\n[Fixup Record 09H]");
int16u i = 0;
while(i < rlen-1)
{ fprintf(DesPt, "\n [Ref Loc]=%4.4X", buf16(i)); i+=2;
fprintf(DesPt, "\t[REF TYP]=%2.2X", buf[i]);
switch(buf[i])
{ case 0 : fprintf(DesPt, "(LOW)"); break;
case 1 : fprintf(DesPt, "(BYTE)"); break;
case 2 : fprintf(DesPt, "(REL)"); break;
case 3 : fprintf(DesPt, "(HIGH)"); break;
case 4 : fprintf(DesPt, "(WORD)"); break;
case 5 : fprintf(DesPt, "(INBLK)");break;
case 6 : fprintf(DesPt, "(BIT)"); break;
case 7 : fprintf(DesPt, "(CONV)"); break;
default: fprintf(DesPt, "(????)");
} // end switch
++i;
fprintf(DesPt, "\n [OPERAND]: [ID BLK]=%2.2X",buf[i]);
switch(buf[i])
{ case 0 : fprintf(DesPt, "(seg)"); break;
case 1 : fprintf(DesPt, "(rel)"); break;
case 2 : fprintf(DesPt, "(ext)"); break;
default : fprintf(DesPt, "(???)");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -