📄 masmber_c0.cpp
字号:
SegPt->SegLc += pt->Token2; // 段计数器增加
return OK_no_Err;
} // end TknIsDSDoSth
//---------------------------------------------------------------------------
#define ErrInDBITExp 1
#define ErrInDBITTyp 2
#define ErrInDBITSeg 3
//---------------------------------------------------------------------------
// DBIT指令不能计算前向参考式。
// 计算该DBIT语句占用的字节数。设置汇编行占用字节数长度,段计数器增加。
// This work is done in Pass1&2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsDBITDoSth(Tokenfield* pt)
{ ERR err;
const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt);
if(err)
{ OutputErr(ExpSyrErr); return ErrInDBITExp; } // endif
if( t->rseg || t->typ != LB_NUM || t->rel !='A' )
{ OutputErr(ExpTypNotMatchErr); return ErrInDBITTyp; } // endif
if(SegPt->GetSegType() != SEG_BIT ) // !!!!!
{ OutputErr(SegNotMatchErr); return ErrInDBITSeg; } // endif
if(not16bit(t->val))
{ OutWarning(DataBeTrun16Warn); } // endif
pt->Token2 = (int16u)(t->val); // pt->Value = DBIT数值
//if(SegPt->SegType != SEG_BIT)
// { pt->Token2 = pt->Token2/8 + 1; } // endif
SegPt->SegLc += pt->Token2; // 段计数器增加
return OK_no_Err;
} // end TknIsDBITDoSth
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到RSEG指令,pt->Token==REG, pt->next->Name存有段名。
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsRSEG_Do(Tokenfield* pt)
{ if(Pass) // Pass1
{ JLabelNode* tp;
if( !LabMger->SearchLabel(pt->next->Name, tp) ) // 带回tp
{ OutputErr(RSegNameErr); return Have_Errs; } // endif
// 根据段名找到了所需段。
SegPt = tp->RefSeg; // 换成所选择的新段
Ln->sgpt = SegPt; // 设置行的所属段
} // endif
else // Pass2
{ SegPt->UpdateSegSize(); // 根据SegLc更新段大小,保存上一段的最大地址
SegPt->CloseCurrentSegTrp(Ln); // 结束当前段的当前片.
SegPt = Ln->sgpt; // 换成所选择的新段
Ln->lc = SegPt->SegLc; // 汇编行更新地址偏移
SegPt->AddSegTrp(Ln); // 在新选择的新段中增加新片。
Ln->Enable = false; // 禁用该RSEG行
pt->Token = pt->Token2; // Token升级
} // end else
return OK_no_Err;
} // end TknIsRSEG_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 在第二遍扫描时,根据pt所指向的参数表达式更新当前段(由汇编行所属段指定)。
// 所要更新的段一定要是绝对段!
// 注意,SegPt和Ln需设置好。pt可以是NULL。
// value 返回表达式的TriVal的值。
//---------------------------------------------------------------------------
ERR MacroAsmber::Pass2UpdateCurSeg(Tokenfield* pt, int16u &value)
{ SegPt->UpdateSegSize(); // 根据SegLc更新段大小,保存上一段的最大地址
SegPt->CloseCurrentSegTrp(Ln); // 结束当前段的当前片.
SegPt = Ln->sgpt; // 换成所选择的新段
Ln->lc = SegPt->SegLc; // 汇编行更新地址偏移
if(pt && pt->Token == ExpresnKn)
{ DebugMsg(printf("\n Cseg has Expr...");)
ERR err;
const TriVal* t = LabMger->CalExpression(err, pt->ExpPt); // 带err返回。
if(err)
{ OutputErr(ORGdataCalErr); return Have_Errs; } // endif
if( t->typ > LB_NUM ) // (LB_NUM==5)
{ OutputErr(ExpTypNotMatchErr); return Have_Errs; } // endif
if( t->rseg && t->rseg != SegPt )
{ OutputErr(SegNotMatchErr); return Have_Errs; } // endif
if( t->rel != 'A' )
{ OutputErr(NotAbsAddrErr); return Have_Errs; } // endif
if(not16bit(t->val))
{ OutWarning(DataBeTrun16Warn); } // endif
SegPt->SegLc = (int16u)(t->val); // 重新设置段计数器, 不产生新段
Ln->lc = SegPt->SegLc; // 汇编行更新地址偏移
value = SegPt->SegLc; // !!! value值保存偏移量!!!
} // endif
else
{ DebugMsg(printf("\n No cseg expr...");) } // end else
SegPt->AddSegTrp(Ln); // 在新选择的新段中增加新片。
return OK_no_Err;
} // end Pass2UpdateCurSeg
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 第一次是换段,第二次是换段且改偏移值。
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsCSEG_Do(Tokenfield* pt)
{ if(Pass_1) // Pass1
{ SegPt = JModulePt->GetAbsCodeSeg();
Ln->sgpt = SegPt; // 设置行的所属段
return OK_no_Err;
} // endif
else // Pass2
{ Ln->Enable = false; // 禁用该CSEG行
pt->Token = pt->Token2; // Token升级
return Pass2UpdateCurSeg(pt->next, pt->Token2);
} // end else
} // end TknIsCSEG_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsDSEG_Do(Tokenfield* pt)
{ if(Pass_1) // Pass1
{ SegPt = JModulePt->GetAbsDataSeg();
Ln->sgpt = SegPt; // 设置行的所属段
return OK_no_Err;
} // endif
else // Pass2
{ Ln->Enable = false; // 禁用该CSEG行
pt->Token = pt->Token2; // Token升级
return Pass2UpdateCurSeg(pt->next, pt->Token2);
} // end else
} // end TknIsDSEG_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsXSEG_Do(Tokenfield* pt)
{ if(Pass_1) // Pass1
{ SegPt = JModulePt->GetAbsXdataSeg();
Ln->sgpt = SegPt; // 设置行的所属段
return OK_no_Err;
} // endif
else // Pass2
{ Ln->Enable = false; // 禁用该CSEG行
pt->Token = pt->Token2; // Token升级
return Pass2UpdateCurSeg(pt->next, pt->Token2);
} // end else
} // end TknIsXSEG_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsISEG_Do(Tokenfield* pt)
{ if(Pass_1) // Pass1
{ SegPt = JModulePt->GetAbsIdataSeg();
Ln->sgpt = SegPt; // 设置行的所属段
return OK_no_Err;
} // endif
else // Pass2
{ Ln->Enable = false; // 禁用该CSEG行
pt->Token = pt->Token2; // Token升级
return Pass2UpdateCurSeg(pt->next, pt->Token2);
} // end else
} // end TknIsISEG_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// This work is done both in Pass1 and Pass2.
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsBSEG_Do(Tokenfield* pt)
{ if(Pass_1) // Pass1
{ SegPt = JModulePt->GetAbsBitSeg();
Ln->sgpt = SegPt; // 设置行的所属段
return OK_no_Err;
} // endif
else // Pass2
{ Ln->Enable = false; // 禁用该CSEG行
pt->Token = pt->Token2; // Token升级
return Pass2UpdateCurSeg(pt->next, pt->Token2);
} // end else
} // end TknIsBSEG_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 注意,USING伪指令在两次扫描时都有效。
//---------------------------------------------------------------------------
ERR MacroAsmber::TknIsUsing_Do(Tokenfield* pt)
{ ERR err;
const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt);
if(err) { OutputErr(ExpSyrErr); return Have_Errs; } // endif
if( t->rseg || t->typ != LB_NUM || t->rel !='A' )
{ OutputErr(ExpTypNotMatchErr); return Have_Errs; } // endif
if(t->val < 0)
{ OutputErr(NegDatNotAllowErr); return Have_Errs; } // endif
if(t->val > 3)
{ OutputErr(UsingWrongErr); return Have_Errs; } // endif
pt->Token2 = (int8u)(t->val); // pt->Value = USING 数值。
register int8u Addr = (int8u)(pt->Token2);
JModulePt->setUseBank(Addr); // 0~3
Addr <<= 3; // 000 ~ 111
JLabelNode* pb;
if(LabMger->SearchLinkList("AR7",pb)) // 找到AR7。
{ for( register int8 i = 7; i >= 0; --i ) // 修改AR0~AR7。
{ pb->Value = Addr + i; pb = pb->next; } // end for
} // endif
return OK_no_Err;
} // end TknIsUsing_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到IF语句要做的事。需要使用Ln。
// 流程:
// (1)计算IF所带的表达式的值。
// (2)判断该值是否合法。
// (3)保存该结果到pt节点的Token2域。
// (4)把(当前的IFstate,表达式的值)状态压栈!!
// (5)pt->loc[1] 暂存IF语句的嵌套层数
// (6)返回。
//---------------------------------------------------------------------------
ERR MacroAsmber::Tkn_IF_Do(Tokenfield* pt)
{ ERR err = OK_no_Err;
Ln->Enable = false;
pt->Token = IF_Kn; // Token升级!
IfElseNest_inc(err);
if(err) { return Have_Errs; } // endif
pt->Token2 = 0; // 清零。
pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数
if(IfStack.GetXorTop()) { return OK_no_Err; } // endif 如果上层状态被ban
// Now, 上层状态不被ban
const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt); // 带err返回。
if(err)
{ OutputErr(IFexprErr); return ErrInIfElseS; } // endif
if( t->typ != LB_NUM ) // (LB_NUM==5)
{ OutWarning(IFexprWarn); } // endif
if(t->val < 0)
{ OutWarning(NegContPosWarn); } // endif
if(not16bit(t->val))
{ OutWarning(DataBeTrun16Warn); } // endif
pt->Token2 = (int16u)t->val; // 保存结果。
IfStack.push( true, (bool)pt->Token2 ); // 把状态压栈!!
return OK_no_Err;
} // end Tkn_IF_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 遇到ELSEIF语句要做的事。需要使用Ln。
//---------------------------------------------------------------------------
ERR MacroAsmber::Tkn_ELSEIF_Do(Tokenfield* pt)
{ Ln->Enable = false;
pt->Token = ELSEIF_Kn; // Token升级!
pt->Token2 = 0;
pt->loc[1] = IfElseNest; // 暂存IF语句的嵌套层数
if(IfElseNest > IfStack.getSP()) { return OK_no_Err; } // 如果ELSEIF是不属于本层的
// Now, ELSEIF确实是属于本层的
if( IfStack.getB() ) // 如果ELSEIF上面的IF语句中的表达式为真的话
{ IfStack.settop(false, true); return OK_no_Err; } // endif
// ELSEIF上面的IF语句没有执行,即IF表达式的值为假
ERR err;
const TriVal* t = LabMger->CalExpression(err, pt->next->ExpPt); // 带err返回。
if(err)
{ OutputErr(IFexprErr); return Have_Errs; } // endif
if( t->typ != LB_NUM ) // (LB_NUM==5)
{ OutWarning(IFexprWarn); } // endif
if(t->val < 0)
{ OutWarning(NegContPosWarn); } // endif
if(not16bit(t->val))
{ OutWarning(DataBeTrun16Warn); } // endif
pt->Token2 = (int16u)t->val; // 保存表达式结果。
IfStack.settop(true,(bool)pt->Token2); // 改变状态!!
return OK_no_Err;
} // end Tkn_ELSEIF_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// end MAsmber_C0.cpp
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -