📄 cacrocomp.h
字号:
}
else {
int mark=Evaluate(par[f]); //'Abc'
int lows=mark%256;
int highs=(mark-lows)/256;
WriteChar((char)highs,p++);
WriteChar((char)lows,p++);
Realtimeaddr++;
}
}
return 1;
}
else if(CompareString(arg[1],"DW")==1){ //
if(argN<3){if(flag==1)report.AddError(Line,18);return -1;}
Pstable.AddPseudoins(arg[0],Realtimeaddr);
for(int f=2;f<argN;f++){
if(par[f][0]=='\'' || par[f][strlen(par[f])-1]=='\'')
{
if(par[f][0]!=par[f][strlen(par[f])-1]){
if(flag==1)report.AddError(Line,20);return -1;}
for(int k=1;k<(int)strlen(par[f])-1;k++){
WriteChar((char)0,p++);
WriteChar(par[f][k],p++);
Realtimeaddr++;
}
}
else {
int mark=Evaluate(par[f]); //'Abc'
int lows=mark%256;
int highs=(mark-lows)/256;
WriteChar((char)highs,p++);
WriteChar((char)lows,p++);
Realtimeaddr++;
}
}
return 1;
}
else if(arg[0][strlen(arg[0])-1]==':'){
arg[0][strlen(arg[0])-1]='\0';
par[0][strlen(par[0])-1]='\0';
if(strlen(arg[0])==0){if(flag==1)report.AddError(Line,21);return -1;}
Pstable.AddPseudoins(arg[0], Realtimeaddr);
if(argN!=1){
argN--;
for(i=0;i<argN;i++){
arg[i][0]='\0';
par[i][0]='\0';
strcpy(arg[i],arg[i+1]);
strcpy(par[i],par[i+1]);
}
goto LEAP;
}
else {
return 2;//标号独占一行
}
}
else if(CompareString(arg[1],"EQU")==1 || CompareString(arg[1],"=")==1){
if(argN!=3){if(flag==1)report.AddError(Line,23);return -1;}
int temsum=Evaluate(par[argN-1]);
if(temsum==-1000){if(flag==1)report.AddError(Line,23);return -1;}
Pstable.AddPseudoins(arg[0],temsum);
return 1;
}
else{if(flag==1)report.AddError(Line,25);}
return -1;
}
bool CAcroComp::INS(InsNode * insNode){
int m,valueSum,highAddress,lowAddress,offset,address,tempt,temps;
char ch,c,tmp1,tmp2,tmp3;
Hex h;
HexArray ha4(4),ha2(2);
bool success=true;
WriteChar((char)(insNode->GetOp()->GetValue()),p++);
Realtimeaddr+=(int)insNode->GetInsLength();
valueSum=0;
switch(insNode->GetGramaSort()){
case 3:WriteChar(0,p++);break; //无操作数单字指令,完
case 23: //单操作数单字指令,op dr,完
ch=Ttwo(arg[1]);
if(ch=='#'){
if(flag==1)report.AddError(Line,28);
if(flag==1)report.AddError(Line,33);
success=false;
}
h.SetChar(ch);
WriteChar((char)h.GetValue()*16,p++);
break;
case 22: //单操作数单字指令,op sr,完
ch=Ttwo(arg[1]);
if(ch=='#'){
if(flag==1)report.AddError(Line,28);
if(flag==1)report.AddError(Line,34);
success=false;
}
h.SetChar(ch);
WriteChar((char)h.GetValue(),p++);
break;
case 21: //单操作数单字指令,op byte,完
temps=Evaluate(arg[argN-1]);
WriteChar((char)temps,p++);
break;
case 5: // 单操作数单字转移指令op offset pc+1+offset 此类暂搞定(剩 jr mark; mark: )
tempt=Evaluate(arg[argN-1]);
offset=tempt-Realtimeaddr;
WriteChar((char)offset,p++);
break;
case 1: //双操作数单字指令,完
ch=Ttwo(arg[1]);
if(ch=='#'){
if(flag==1)report.AddError(Line,28);
success=false;
}
h.SetChar(ch);
valueSum=h.GetValue()*16;
ch=Ttwo(arg[2]);
if(ch=='#'){
if(flag==1)report.AddError(Line,28);
success=false;
}
if(!success && flag==1)report.AddError(Line,35);
h.SetChar(ch);
valueSum+=h.GetValue();
WriteChar((char)valueSum,p++);
break;
case 12: //OP DR, [SR],完
if(arg[2][0]!='[' || arg[2][strlen(arg[2])-1]!=']')success=false;
tmp1=arg[2][1]; tmp2=arg[2][2];
tmp3=arg[2][3];
if(tmp3==']')tmp3='\0';
arg[2][0]=tmp1;
arg[2][1]=tmp2;
arg[2][2]=tmp3;
arg[2][3]='\0';
ch=Ttwo(arg[1]);
c=Ttwo(arg[2]);
if(ch== '#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(c=='#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(!success && flag==1)report.AddError(Line,39);
h.SetChar(ch);
valueSum=h.GetValue()*16;
h.SetChar(c);
valueSum+=h.GetValue();
WriteChar((char)valueSum,p++);
break;
case 13: //OP [DR], SR, 完
if(arg[1][0]!='[' || arg[1][strlen(arg[1])-1]!=']')success=false;
tmp1=arg[1][1]; tmp2=arg[1][2]; tmp3=arg[1][3];
if(tmp3==']')tmp3='\0';
arg[1][0]=tmp1;
arg[1][1]=tmp2;
arg[1][2]=tmp3;
arg[1][3]='\0';
ch=Ttwo(arg[1]);
c=Ttwo(arg[2]);
if(ch== '#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(c=='#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(!success && flag==1)report.AddError(Line,40);
h.SetChar(ch);
valueSum=h.GetValue()*16;
h.SetChar(c);
valueSum+=h.GetValue();
WriteChar((char)valueSum,p++);
break;
case 6: //单操作数双字转移指令, 完
WriteChar(0,p++);
address=Evaluate(arg[argN-1]);
lowAddress=address%256;
highAddress=(address-lowAddress)/256;
WriteChar((char)highAddress,p++);
WriteChar((char)lowAddress,p++);
break;
case 411: //双操作数双字指令,op dr data,完
ch=Ttwo(arg[1]);
if(ch=='#'){
if(flag==1)report.AddError(Line,28);
if(flag==1)report.AddError(Line,41);
success=false;
}
h.SetChar(ch);
WriteChar((char)h.GetValue()*16,p++);
address=Evaluate(par[argN-1]);
lowAddress=address%256;
highAddress=(address-lowAddress)/256;
WriteChar((char)highAddress,p++);
WriteChar((char)lowAddress,p++);
break;
case 412: //双操作数双字指令,OP DR,[ADDR]
if(arg[2][0]!='[' || arg[2][strlen(arg[2])-1]!=']')success=false;
m=0;
while(arg[2][m+1]!='\0'){arg[2][m]=arg[2][m+1];m++;}
arg[2][m-1]='\0';
ch=Ttwo(arg[1]);
if(ch=='#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(!success && flag==1)report.AddError(Line,43);
h.SetChar(ch);
WriteChar((char)h.GetValue()*16,p++);
address=Evaluate(arg[argN-1]);
lowAddress=address%256;
highAddress=(address-lowAddress)/256;
WriteChar((char)highAddress,p++);
WriteChar((char)lowAddress,p++);
break;
case 413: //双操作数双字指令, OP [ADDR],SR
if(arg[1][0]!='[' || arg[1][strlen(arg[1])-1]!=']')success=false;
m=0;
while(arg[1][m+1]!='\0'){arg[1][m]=arg[1][m+1];m++;}
arg[1][m-1]='\0';
ch=Ttwo(arg[2]);
if(ch=='#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(!success && flag==1)report.AddError(Line,44);
h.SetChar(ch);
WriteChar((char)h.GetValue(),p++);
address=Evaluate(arg[1]);
lowAddress=address%256;
highAddress=(address-lowAddress)/256;
WriteChar((char)highAddress,p++);
WriteChar((char)lowAddress,p++);
break;
case 42: //OP DR, OFFSET[SR]
if(arg[2][strlen(arg[2])-1]!=']')success=false;
static char offsetsr[12];
static char sr[10];
m=0;
while(arg[2][m]!='[' && arg[2][m]!=']'){offsetsr[m]=arg[2][m]; m++;}
if(arg[2][m]==']')success=false;
offsetsr[m]='\0';
int srl=0;
m++;
while(arg[2][m]!=']'){sr[srl]=arg[2][m]; m++; srl++;}
sr[srl]='\0';
ch=Ttwo(sr);
c=Ttwo(arg[1]);
if(ch=='#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(c=='#'){
if(success && flag==1)report.AddError(Line,28);
success=false;
}
if(!success && flag==1)report.AddError(Line,45);
h.SetChar(c);
valueSum=h.GetValue()*16;
h.SetChar(ch);
valueSum+=h.GetValue();
WriteChar((char)valueSum,p++);
address=Evaluate(offsetsr);
lowAddress=address%256;
highAddress=(address-lowAddress)/256;
WriteChar((char)highAddress,p++);
WriteChar((char)lowAddress,p++);
break;
}
return success;
}
bool CAcroComp::Handle(char * CAcroCompname){
int k; //
int Pcount; //
char foname[200]; //
char fotxt[200]; //
HexArray Haa2(2); //
int slenth=strlen(CAcroCompname);
strcpy(foname,CAcroCompname);
strcpy(fotxt,CAcroCompname);
foname[slenth-3]='C';foname[slenth-2]='O';
foname[slenth-1]='D';foname[slenth]='\0';
fotxt[slenth-4]='+';fotxt[slenth-3]='.';fotxt[slenth-2]='A';
fotxt[slenth-1]='S';fotxt[slenth]='M';fotxt[slenth+1]='\0';
OpenSoueceFile(CAcroCompname,foname); //打开asm及cod文件
for(flag=0;flag<2;flag++){ //两次扫描源文件,第一次主要扫描标号,第二次进行处理
Pcount=0;
p=0; // 指针
Endcount=0; // end
Line=0; // 某行
Orgcount=0; // org
WriteChar(1,p++); //.cod文件中第一个字节为01,p指针后移
while(!FileIsEnd()){ //循环取asm文件一行到buffer,进行处理
if(!Getbuffer()){Line++; continue; } //某行没有任何字符,跳过此行继续,否则第一个分号写\0,得到buffer
if(!Analyzebuffer()){Line++;continue;} //某行为空格,tab,\0,逗号,跳过此行继续,否则分解buffer
Pcount=Process(); //处理buffer分解后的各字段,写.cod文件
if(Pcount==2) { Line++;continue; } //标号为一行时,跳过并维护Line指针
else if(Pcount==4){break;} //遇到第二个org,跳出不进行处理
Line++; //此行处理完,转下一行
}
inf.clear(); //inf标志重新设定
inf.seekg(0); //inf指针重新指向文件开头
}
p-=5;
p/=2;
k=p%256;
int pk=(p-k)/256;
WriteChar((char)k,3);
WriteChar((char)pk,4);
if(Endcount==0)report.AddError(0,26); //判是否end结束
if(Endcount>1)report.AddError(0,14); //判end是否多余
if(report.GetErrorCount()==0){
WritehexChar(foname,fotxt);
Haa2.SetValue(pk); //化为16进制数形式
chg[0]=Haa2.GetArray()[0].GetChar();
WriteHex(chg[0],10);
chg[1]=Haa2.GetArray()[1].GetChar();
WriteHex(chg[1],11);
chg[2]='\0';
CString OK=foname;
OK+="\r\n";
OK+="编译成功!";
CTEC2000App *pApp;
pApp=(CTEC2000App *)AfxGetApp();
CMainFrame *pFrm;
pFrm=(CMainFrame *)pApp->GetMainWnd();
CWnd *pStatusDlg=pFrm->m_wndCStatusDlg.GetDlgItem(IDC_STATUSEDIT);
CEdit * ph=(CEdit *)pStatusDlg;
ph->SetWindowText(OK);
return true;
}
CString error;
error=report.ToString();
CTEC2000App *pApp;
pApp=(CTEC2000App *)AfxGetApp();
CMainFrame *pFrm;
pFrm=(CMainFrame *)pApp->GetMainWnd();
CWnd *pStatusDlg=pFrm->m_wndCStatusDlg.GetDlgItem(IDC_STATUSEDIT);
CEdit * ph=(CEdit *)pStatusDlg;
ph->SetWindowText(error);
WritehexChar(foname,fotxt); //有错误,提示出错信息
Haa2.SetValue(pk); //化为16进制数形式
chg[0]=Haa2.GetArray()[0].GetChar();
WriteHex(chg[0],10);
chg[1]=Haa2.GetArray()[1].GetChar();
WriteHex(chg[1],11);
chg[2]='\0';
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -