📄 listfile_c.cpp
字号:
} // end switch
} // endif
else
{ PRLineLOC(OutputFile,Cursor,CurAsmLn->lc); } // end else
return true;
} // end GenALeftLine
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 次要控制指令执行子程序。
//---------------------------------------------------------------------------
void LISTFile::MinorCtrlAct(AsmLine* line)
{ register Tokenfield* p;
for( p = line->head->next;
p && p->Token == Dog_Ctrl;
p = p->next )
{ switch(p->Token2)
{ case LI_Tn : { setn.List = true; break; } // end case
case NOLI_Tn : { setn.List = false; break; } // end case
case GEN_Tn : { setn.Gen = true; break; } // end case
case NOGEN_Tn : { setn.Gen = false; break; } // end case
case SAV_Tn : { pool_16 pz;
pz.lowbyte = setn.Gen; pz.highbyte = setn.List;
SaRs_Stk.push(pz.pot16);
break;
} // end case
case RSTO_Tn : { if(SaRs_Stk.empty())
{ masm.OutWarning(SaRsStkRstorWarn);
fprintf(OutputFile,"\n*** WARNING(%s, LINE %u): %s",
(const char*)masm.AsmFn->FileName, line->LineNo,
ErrWarnMsg::warnmsg[SaRsStkRstorWarn]);
} // endif
else // 栈不空
{ pool_16 pz;
pz.pot16 = SaRs_Stk.pop();
setn.Gen = pz.lowbyte; setn.List = pz.highbyte;
} // end else
break;
} // end case
case EJECT_Tn : fprintf(OutputFile,"\n"); GenPageHeader(); break;
case Dog_Skip : break;
default: { EThrows(printf("\n ??? $ here. ???"); Debugkey;); } // end default
} // end switch
} // end for
} // end MinorCtrlAct
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 当遇到EJECT命令时做。
//---------------------------------------------------------------------------
void LISTFile::GenPageHeader()
{ ++PageCount;
fprintf(OutputFile,"\nLOC OBJ LINE SOURCE Page %u",PageCount);
} // end GenPageHeader
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void LISTFile::GenOBJList()
{ fprintf(OutputFile,"\n%s List begin %s%s",hebk,hebk,hebk);
GenPageHeader();
CurTextLn = 1;
CurAsmLn = masm.AsmFn->FirstLine();
Tokenfield* ErrWarnPt = masm.AsmFn->FirstErrWarnPt();
for( ; CurAsmLn; )
{ if(CurAsmLn->hideln) { CurAsmLn = CurAsmLn->next; continue; } // endif
if(setn.List)
{ if(CurAsmLn->NestNo > 0 && !setn.Gen) {} // endif
else
{ Cursor = 1; putc('\n', OutputFile); } // end else
} // endif
if(CurAsmLn->LineNo <= CurTextLn)
{ if( setn.List && GenALeftLine() ) { GenSrcText(); } // endif
if(ErrWarnPt && ErrWarnPt->loc[1] == CurAsmLn->LineNo) // 打印错误信息
{ PrintTheErrWarn(ErrWarnPt); } // endif
if(CurAsmLn->HeadToken()== MacroCTRLn)
{ MinorCtrlAct(CurAsmLn); } // endif
CurAsmLn = CurAsmLn->next;
} // endif
else
{ if(setn.List)
{ IFinMacro(); GenSrcText(); } // endif
// if(CurAsmLn->HeadToken()== MacroCTRLn)
// { MinorCtrlAct(CurAsmLn); } // endif
} // end else
} // end for
fprintf(OutputFile,"\n%s List end %s%s\n\n",hebk,hebk,hebk);
} // end GenAPageList
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void LISTFile::PrintTheErrWarn(Tokenfield* &pt)
{ int16u Lno = pt->loc[1];
do
{ switch(pt->Token)
{ case WarningKn:
{ fprintf(OutputFile,"\n*** WARNING(%s, LINE %u): %s",
(const char*)masm.AsmFn->FileName, pt->loc[1],
ErrWarnMsg::warnmsg[pt->loc[0]]);
break;
} // end case
case NormalERR:
{ fprintf(OutputFile,"\n*** ERROR(%s, LINE %u): %s",
(const char*)masm.AsmFn->FileName, pt->loc[1],
ErrWarnMsg::errmsg[pt->loc[0]]);
break;
} // end case
default : EThrows(printf("\nPrintTheErrWarn out of run!"); Waitkey;);
} // end switch
pt = pt->next;
} while(pt && pt->loc[1] == Lno);
} // end PrintTheErrWarn
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 为指定的文件产生一个寄存器组使用情况表。
//---------------------------------------------------------------------------
void LISTFile::GenRegBankUsed()
{ fprintf(OutputFile,"\nRegister Bank(s) used:");
for( int8u i = 0, ch = masm.JModulePt->GetRegBankUsedInfo();
i < 4;
++i, ch >>= 1 )
{ if(ch & 0x01) { fprintf(OutputFile," %d",i); } // endif
} // end for
} // end GenRegBankUsed
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void LISTFile::GenListHeader()
{ fprintf(OutputFile,"MACRO ASSEMBLER A51 宏汇编器 V%s 周立功单片机发展有限公司 2002.\n", MyVersion);
fprintf(OutputFile,"\n%s << %s >> %s\n",Debk,(const char*)Title,Debk);
fprintf(OutputFile,"%04u/%02u/%02u", jdate.year, jdate.month, jdate.day);
struct time ta; gettime(&ta);
fprintf(OutputFile," %02u:%02u:%02u",ta.ti_hour,ta.ti_min,ta.ti_sec);
} // end GenListHeader
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void LISTFile::PrintSymbolTable()
{ static char TypConv[] = "CXDIBN ?";
static const char* TypText[] =
{ "ADDR","ADDR","ADDR","ADDR","ADDR","NUMB","SEG ","REG ","??" };
static const char* RelText[] =
{ "ABS","UNIT","BITABLE","INPAGE","INBLOCK","PAGE","??" };
static const char* REGtxt[] =
{ "R0 ","R1 ","R2 ","R3 ","R4 ","R5 ","R6 ","R7 ",
"A ","DPTR","PC ","AB ","C ","??? " };
//.....................................................................
if(!setn.symbols) { return; } // endif
fprintf(OutputFile,"\n%s << Symbol Table Listing >> %s",Debk,Debk);
fprintf(OutputFile,"\nName Type Value attribute");
fprintf(OutputFile,"\n%s%s%s%s",hebk,hebk,hebk,hebk);
JLabelNode* lb = masm.LabMger->head->next; //SearchLinkList("CY",pt);
for( ; lb; lb = lb->next )
{ if( lb->LnPt == NULL && !lb->evenUse ) { continue; } // endif
DebugKit(lb->Show(); Debugkey;);
char buf[40]= ".......................................";
register const char* str = (const char*)lb->LName;
register int16u k = lb->LName.getLen();
if( k < 39) { memcpy(buf, str, k ); } // endif
else { memcpy(buf, str, 39); } // end else
fprintf(OutputFile, "\n%s ", buf);
int8u Ltyp = lb->vv.LBLTyp;
if(Ltyp != LB_SEG)
{ fprintf(OutputFile, "%c %s",TypConv[Ltyp], TypText[Ltyp]); } // endif
else
{ fprintf(OutputFile, "%c %s",TypConv[lb->RefSeg->GetSegType()], TypText[Ltyp]); } // end else
if(lb->Attrb == 'R')
{ if(lb->vv.LBLTyp == LB_SEG)
{ fprintf(OutputFile," %4.4XH ",(int16u)lb->Value); } // endif
else
{ fprintf(OutputFile, " %4.4XH ", lb->LnPt->lc); } // end else
} // endif
else
{ if(Ltyp == LB_REG)
{ register int16u n = (int16u)(lb->Value) - _R0;
if(n > 13) { n = 13; } // endif // 下标不能越界!
fprintf( OutputFile, " %s ", REGtxt[n] );
} // endif
else { fprintf(OutputFile," %4.4XH ",(int16u)lb->Value); } // end else
} // end else
putc(lb->Attrb,OutputFile); // 'A', 'R', 'E'
switch(lb->Attrb)
{ //case 'A': { break; } // end case
case 'R': { if(Ltyp == LB_SEG)
{ fprintf(OutputFile," rel=%s",(lb->RefSeg) ?
RelText[lb->RefSeg->GetSegType()]:"NULL");
} // endif
else
{ fprintf(OutputFile," rel=%s",(lb->RefSeg) ?
((const char*)lb->RefSeg->Name):"NULL");
} // end else
break;
} // end case
case 'E': { fprintf(OutputFile," EXT[%4.4d]",lb->ExtID); break; } // end case
default : { fprintf(OutputFile," "); } // end default
} // end switch
if(lb->LnPt != NULL) // 创建该标号的行号。
{ fprintf(OutputFile," #[%d]",lb->LnPt->LineNo); } // endif
if(!lb->evenUse)
{ fprintf(OutputFile,"(never used)"); } // endif
} // endfor
fprintf(OutputFile,"\n%s%s%s%s",hebk,hebk,hebk,hebk);
} // end PrintSymbolTable
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
const char* LISTFile::hebk = "------------------";
const char* LISTFile::Debk = "==================";
//---------------------------------------------------------------------------
// end ListFile_C.cpp
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -