📄 listfile_c.cpp
字号:
//---------------------------------------------------------------------------
//-------- ListFile_C.cpp ---------------------------------------------------
//---------------------------------------------------------------------------
#include <dos.h>
#include "ListFile_H.h"
#include "Dat4ary_H.h"
#include "MAsmber_H.h"
//---------------------------------------------------------------------------
//
// 列表文件生成器
//
//---------------------------------------------------------------------------
#define DebugKit(str) DebugMsg(str)
//------ 构造器 -------------------------------------------------------------
LISTFile::LISTFile(MacroAsmber& msm, const Jstring &filename)
: masm(msm), CurAsmLn(msm.Ln),
OutputFile(NULL),
CurTextLn(0), TknPt(NULL),Cursor(0),
PageLength(132), PageWidth(120),
LineCount(0),PageCount(0)
{ setn.symbols = true;
setn.Xref = true;
setn.List = true;
setn.Gen = true;
setn.LastOK = true;
setn.SrcEnd = false;
setn.InMacro = false;
FileName = filename + ".lst";
Title = filename;
struct date dea; getdate(&dea);
jdate.year = dea.da_year; jdate.month = dea.da_mon; jdate.day = dea.da_day;
} // end constructor
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 如果LastOK为真,产生一个右栏上的源文本。
// LastOK不为真,只产生一个换行。
// 操作对象是CurAsmLn。不改变CurAsmLn。
// 用到的变量:LastOK, Cursor(!), CurAsmLn, CurTextLn(!).
//---------------------------------------------------------------------------
void LISTFile::GenSrcText()
{ if(CurAsmLn->NestNo > 0 && !setn.Gen) { return; } // endif
if(setn.LastOK) // 新行
{ TABtheSRC(OutputFile, Cursor); // 宏调用。
// Move the cursor
if( CurAsmLn &&
(CurAsmLn->GetNestNo() > 0 || CurAsmLn->Includ) ) // In Macro...
{ fprintf(OutputFile,"%5d+%-2d %s",CurTextLn-1,
CurAsmLn->GetNestNo(),(const char*)CurAsmLn->head->Name);
} // endif
else
{ if(masm.AsmFn->FileEnd())
{ setn.SrcEnd = true; } // endif
else
{ fprintf(OutputFile,"%5d %s",CurTextLn, masm.AsmFn->ReadALine());
++CurTextLn;
} // end else
} // end else
} // endif
// LastOK = false, 换行。
// putc('\n',OutputFile);
} // end GenSrcText
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define InstCodeDo(); \
PRLineLOC(OutputFile,Cursor,CurAsmLn->lc); \
for(register int8u i = 0; i < CurAsmLn->len; ++i) \
{ fprintf(OutputFile,"%2.2X",TknPt->D4ary->dat[i]); \
Cursor += 2; \
} \
if(TknPt->D4ary->Fix) { PRFixChar(OutputFile,Cursor); }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
#define EQUValueShow(); \
if(TknPt->LabPt->getTyp() != LB_REG) \
{ fprintf(OutputFile," (%4.4X)", (int16u)TknPt->LabPt->Value); \
Cursor += 7; \
for( ; Cursor < 10; ++Cursor) { putc(' ',OutputFile); } \
fprintf(OutputFile, TknPt->LabPt->LabelTypeStr() ); Cursor += 6; \
} \
else \
{ fprintf(OutputFile, TknPt->LabPt->LabelTypeStr() ); Cursor += 6; \
for( ; Cursor < 12; ++Cursor) { putc(' ',OutputFile); } \
fprintf(OutputFile,"REG"); Cursor += 3; \
}
//---------------------------------------------------------------------------
#define DBCodeListPrint(tp,pt,cur,Ln); \
int16u i = 0; bool f = false; bool pr = true; \
for(pt = pt->next; pt; pt = pt->next) \
{ switch(pt->Token) \
{ case StrDataKn : case LongCharn : \
{ JdatBlock &bk = *(pt->DatPt); \
register const int8u* p = (const char*)(bk); \
for(int8u c = 0; c<(bk).GetLen(); c++ ) \
{ if(i%4==0) \
{ if(!pr) { cur = 1; putc('\n',tp); } \
PRLineLOC(tp,cur,(Ln->lc+i)); } \
fprintf(tp,"%2.2X",*p++); cur += 2; i++; \
if(i%4==0) \
{ if(f) { PRFixChar(tp,cur); f = false; } \
if(pr) { GenSrcText(); pr = false; } \
} \
} \
break; \
} \
case ObjcodeKn : \
{ if(i%4==0) \
{ if(!pr) { cur = 1; putc('\n',tp); } \
PRLineLOC(tp,cur,(Ln->lc+i)); } \
fprintf(tp,"%2.2X",pt->D4ary->dat[0]); cur += 2; i++; \
if(pt->D4ary->Fix) { f = true; } \
if(i%4==0) \
{ if(f) { PRFixChar(tp,cur); f = false; } \
if(pr) { GenSrcText(); pr = false; } \
} \
break; \
} \
default : { EThrows(printf("\nWrong list!"); Waitkey;); } \
} \
} \
if(i<4 && f) { PRFixChar(tp,cur); } \
if(pr) { GenSrcText(); } \
//---------------------------------------------------------------------------
// pt->Token == DWObjCode
//---------------------------------------------------------------------------
#define DWobjCodePrint(); \
fprintf(OutputFile,"%2.2X%2.2X ",TknPt->D4ary->dat[0], \
TknPt->D4ary->dat[1]); \
Cursor += 9; \
if(TknPt->D4ary->Fix) { PRFixChar(OutputFile,Cursor); }
//---------------------------------------------------------------------------
#define DWCodeListPrint(); \
PRLineLOC(OutputFile,Cursor,CurAsmLn->lc); \
TknPt = TknPt->next; \
DWobjCodePrint(); \
GenSrcText(); \
TknPt = TknPt->next; \
for(int16u i = 2; TknPt; TknPt = TknPt->next) \
{ Cursor = 1; putc('\n',OutputFile); \
fprintf(OutputFile,"%4.4X ",CurAsmLn->lc +i); \
Cursor += 6; i += 2; \
DWobjCodePrint(); }
//---------------------------------------------------------------------------
#define IFinMacro(); \
if(setn.InMacro) { fprintf(OutputFile," |"); Cursor += 4; }
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 显示一个汇编行的左栏
// 输入:当前汇编行指针CurAsmLn。 LastOK Cursor TknPt
// 返回false表示遇到END。否则返回true。
// CurAsmLn不能为空!
//---------------------------------------------------------------------------
bool LISTFile::GenALeftLine()
{ if(masm.AsmFn->runCount < 3) { return true; } // endif
if(CurAsmLn->NestNo > 0 && !setn.Gen) { return true; } // endif
if(CurAsmLn->HeadToken()== MacroCTRLn) { return true; } // endif
if(CurAsmLn->Unsm) // 如果该行不被汇编的话
{ fprintf(OutputFile," ;; "); Cursor +=12; return true; } // endif
TknPt = CurAsmLn->FirstTkn();
if(TknPt != NULL) // 该汇编行不是空行
{ switch(TknPt->Token)
{ case InstCode : { InstCodeDo(); break; } // end case
case DBObjCode : { DBCodeListPrint(OutputFile,TknPt,Cursor,CurAsmLn);
return false; } // end case
case DWObjCode : { DWCodeListPrint();
return false; } // end case
case EQUsDefken : // 同下。
case BITsDefken : // 同下。
case CODEDefKen : // 同下。
case DATADefKen : // 同下。
case XDATADefKn : // 同下。
case SETsDefken : // 同下。
case IDATADefKn : { EQUValueShow(); break; } // end case
case CSEG : // 同下。
case DSEG : // 同下。
case ISEG : // 同下。
case XSEG : // 同下。
case BSEG : // 同下。
case ORG : { fprintf(OutputFile,"%4.4X ----", TknPt->Token2);
Cursor += 10; break; } // show addr
case DS : // 同下。
case DBIT : { PRLineLOC(OutputFile,Cursor,CurAsmLn->lc);
break; } // LOC
case RSEG : { fprintf(OutputFile,"---- ----");
Cursor += 10; break; } // end case
case END : { fprintf(OutputFile,"%4.4X", CurAsmLn->lc);
Cursor += 4;
return true; // It means file is ended.
} // end case
case MacroDefkn : case ReptDefkn: case IRPTkn: case IRPCTkn:
{ fprintf(OutputFile," --Macro--"); Cursor += 10;
setn.InMacro = true;
break; } // end case
case ENDMTkn : { fprintf(OutputFile," --EndM--"); Cursor += 9;
setn.InMacro = false;
break; } // end case
case SEGMTDefkn : { fprintf(OutputFile,"--SegDef--");
Cursor += 10; break; } // end case
case PseudoWord : { break; } // end case
case MroCalling : { PRLineLOC(OutputFile,Cursor,CurAsmLn->lc);
fprintf(OutputFile,"[Macro]"); Cursor += 7;
break;
} // end case
case IF_Kn : case ELSEIF_Kn :
{ fprintf( OutputFile," (%04X) %s/%02u",
TknPt->Token2, TknPt->Token2 ? "True ":"False",
TknPt->loc[1] );
Cursor += 16; break;
} // end case
case ELSE_Kn:
{ fprintf( OutputFile," %s/%02u",
TknPt->Token2 ? "False":"True ",
TknPt->loc[1] );
Cursor += 16; break;
} // end case
case ENDIF_Kn:
{ fprintf( OutputFile," -%%%%- /%02u", TknPt->loc[1] );
Cursor += 16; break;
} // end case
default : { IFinMacro(); } // end default
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -