⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cacrocomp.h

📁 模拟了tec2000的所有功能
💻 H
📖 第 1 页 / 共 2 页
字号:
				  }
			      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 + -