?? masmber_c4.cpp
字號:
Tokenfield* p = pt->next; // Now, s->Token==Operand.
OPset* setPt = pt->Opset; // 指令格式
int8u length = setPt->len; // 指令長度
Dat4ary& Ndatry = *new Dat4ary; // 創建新結點
Ndatry.dat[3] = length;
Ndatry.dat[0] = setPt->OPobj; // 指令目標碼
TriVal Trv[3]; // 三個操作數TriVal, 來自三個Expr。
for( int8u c = 0;
p && c < 3; // conditions
p = p->next, c++ )
{ // At first, p->Token == Operand.
Tokenfield* s = p->ExpPt; // 從Operand 下降到 Expression
switch(s->Token)
{ case '#': // no breaking!
case '@': // no breaking!
case '/': s = s->next; // 指針前移
// no default!
} // end switch
// Now, s->Token==Expression
s = s->ExpPt; // 從Expression下降到Expression頭
register const TriVal* tt = LabMger->CalExpression(err, s); // 給TriVal賦值
if(err) { OutputErr(WrongOperandsErr+c); return c+1; } // endif
Trv[c] = *tt;
if(Trv[c].rseg == NULL)
{ Trv[c].rseg = JModulePt->GetAbsCodeSeg(); } // endif
} // end for p & c
// 多余的Operand被忽略。
// 至此,三個TriVal(Trv[])已經設置好。
if(length > 1)
{ if(OpandAction(Ndatry, 1, Trv, setPt->act1)) { err = 4; } // 第二個字節出錯
} // endif length>1
if(!err && length > 2)
{ if(OpandAction(Ndatry, 2, Trv, setPt->act2)) { err = 5; } // 第三個字節出錯
} // endif length>2
TokenOper::DelOPNDList(pt->next); // 刪除其后的Operand表。
pt->next = NULL;
pt->Token = InstCode; // Token的進化!!
pt->D4ary = &Ndatry; // 接入結點
return err;
} // end Translate
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 根據act,對dary的第pos個字節進行操作。Trv[]裝有源數。
//---------------------------------------------------------------------------
ERR MacroAsmber::OpandAction(Dat4ary &dary, int8u pos, TriVal* trv, int8 act)
{ ERR err ;
switch(act) // 在KnownInst中,dary.dat[0]的Loc對應Ln->lc。
{ case BRef_1 : { err = OPAct_BRef_Do(Ln->lc + pos, dary, pos, trv[0]);
break; // 把第一操作數d1寫入pos位置
} // end case
case BRef_2 : { err = OPAct_BRef_Do(Ln->lc + pos, dary, pos, trv[1]);
break; // 把第二操作數d2寫入pos位置
} // end case
case BRef_3 : { err = OPAct_BRef_Do(Ln->lc + pos, dary, pos, trv[2]);
break; // 把第三操作數d3寫入pos位置
} // end case
case Wrel_1 : { err = OPAct_Wrel_Do(Ln->lc + pos, dary, pos, trv[0]);
break; // 把第一操作數d1換成相對偏移,然后寫入pos位置
} // end case
case Wrel_2 : { err = OPAct_Wrel_Do(Ln->lc + pos, dary, pos, trv[1]);
break; // 把第二操作數d2換成相對偏移,然后寫入pos位置
} // end case
case Wrel_3 : { err = OPAct_Wrel_Do(Ln->lc + pos, dary, pos, trv[2]);
break; // 把第三操作數d3換成相對偏移,然后寫入pos位置
} // end case
case JJudge : // 同下。
case H8L8_1 : { err = OPAct_H8L8_Do(Ln->lc + pos, dary, pos, trv[0]);
break;
} // end case
case H8L8_2 : { err = OPAct_H8L8_Do(Ln->lc + pos, dary, pos, trv[1]);
break;
} // end case
case 0 : { err = OK_no_Err; break; // 空操作
} // end case
case H3L8_0 : { err = OPAct_H3L8_Do(Ln->lc + pos, dary, trv[0]);
break;
} // end case
default : { err = Have_Errs;
EThrows(printf("\nOpandAction out of run!"); Debugkey;); // debug
} // end defualt
} // end switch
return err;
} // end OpandAction
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 由TriVal(trv)給dary的第pos個字節賦值。
//---------------------------------------------------------------------------
ERR MacroAsmber::
OPAct_BRef_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv)
{ if( not8bit(trv.val) && trv.fix == 0 )
{ OutWarning(DataBeTrun8Warn); } // endif
if( dary.BytePosSettle(trv, pos, loc) )
{ DebugKit(printf("\nErr in ByteSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
return OK_no_Err;
} // end OPAct_BRef_Do
//---------------------------------------------------------------------------
#pragma argsused
//---------------------------------------------------------------------------
// 由TriVal(trv)給dary的第pos個字節賦rel值。
//---------------------------------------------------------------------------
ERR MacroAsmber::
OPAct_Wrel_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv)
{ if( not16bit(trv.val) )
{ OutWarning(DataBeTrun16Warn); } // endif
if(trv.rseg != Ln->sgpt) // 當前匯編行所在的段
{ OutputErr(SegNotMatchErr); return Have_Errs; } // error!
int8u vval; // 供下面調用.
if(Cal_rel((int16u)trv.val, vval)) { return Have_Errs; } // error!
// 計算相對位移。
switch(trv.rel)
{ case 'A': case 'R': { dary.dat[pos] = vval; return OK_no_Err; } // end case
case 'E': { OutputErr(SegNotMatchErr); return Have_Errs; } // end case
default : { EThrows(printf("\nOPAct_WRef_Do out of run!"); Debugkey;); // debug
return Have_Errs;
} // default
} // end switch
} // end OPAct_BRef_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// 由TriVal(trv)給dary的第pos個字節賦WORD值。
//---------------------------------------------------------------------------
inline ERR MacroAsmber::
OPAct_H8L8_Do(int16u loc, Dat4ary &dary, int8u pos, const TriVal &trv)
{ if( not16bit(trv.val) )
{ OutWarning(DataBeTrun16Warn); } // endif
if( dary.WordPosSettle(trv, pos, loc) )
{ DebugKit(printf("\nErr in WordSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
return OK_no_Err;
} // end OPAct_H8L8_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
inline ERR MacroAsmber::
OPAct_H3L8_Do(int16u loc, Dat4ary &dary, const TriVal &trv)
{ if( not16bit(trv.val) )
{ OutWarning(DataBeTrun16Warn); } // endif
if( dary.H3L8Settle(trv, loc) )
{ DebugKit(printf("\nErr in WordSettle.\n"); Debugkey;); // debug
return Have_Errs;
} // endif
return OK_no_Err;
} // end OPAct_H3L8_Do
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// loc和len必須預先設置好,輸入str為轉移地址字符串
//---------------------------------------------------------------------------
ERR MacroAsmber::Cal_rel(int16u addr,int8u &val)
{ DebugKit(printf("\nIn cal rel, addr=%xh",addr);); // debug
register int16 address = addr - Ln->lc - Ln->len;
if(address>127 || address<-128)
{ OutputErr(RelativeAddrErr); return Have_Errs; } // endif
val = (int8u)address; // 會丟棄高位
return OK_no_Err;
} // end Cal_rel
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// end MAsmber_C4.cpp
//---------------------------------------------------------------------------
// Written by JamesyFront. ZLGmcu Dev.Co.Ltd. 2002.
//---------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -