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

📄 cacrocomp.h

📁 模拟了tec2000的所有功能
💻 H
📖 第 1 页 / 共 2 页
字号:
#pragma once
#include<iostream.h> 
#include<string.h> 
#include<fstream.h>
#include<stdio.h>
#include "DataBase.h"         //基础数据类
#include "ErrorReport.h"      //出错处理类
#include "Pseudoins.h"        //标号处理类
#include "Instructions.h"     //指令类
#include "TEC2000.h"
#include "MainFrm.h"
#define  MAXSIZE 1024
#define  MEDIUMSIZE 512
class CAcroComp{
private:
	int flag;                 //用以指明第几次扫描.asm文件
	int Line;                 //源汇编语句某行
	int p;                    //写.cod文件用指针
	char chg[3];              
	int Endcount;             //统计END的个数
	int Orgcount;             //统计ORG的个数
	ifstream inf,infcod,infmem;
	WORD *memory;
	ofstream outf,outftxt;
	InsList insList;          //指令节点链表类对象
	PseudoinsTable Pstable;   //标号节点链表类对象
	char buffer[MAXSIZE];     //读取.asm文件一行到buffer
	char * tobuffer;          //复制buffer到tobuffer 
	int argN;                 //源.asm文件某行汇编语句的段数
	char  arg[MEDIUMSIZE][MEDIUMSIZE];  //arg[i]为分割后形成的大写代码段
    char  par[MEDIUMSIZE][MEDIUMSIZE];  //par[i]为分割后形成的大,小写代码段
	int Realtimeaddr;                   //处理时的实时字地址
	ErrorReport report;                 //出错对象链表类对象
////////////////////////////////////////////////////////////////////////////////////	
	int CompareString(char * ,char * );    //字符串比较函数
	char Ttwo(char * );                    //Rx中的x化为十六进制数
	int Decsum(char *);                    //十进制求和函数
   	bool FileIsEnd(void);                  //判文件是否结束 
	int Evaluate(char *);                  //计算表达式的值
    bool OpenSoueceFile(char *,char *);    //打开源文件函数
	bool Getbuffer(void);                  //源文件一行传到buffer
	bool Analyzebuffer(void);              //解析buffer,分解到arg[i]
	int Process(void);                     //主要函数,处理各伪命令
    int Calculate(char *);                 //计算十六/十进制数的值,可调用int Decsum(char *) 
	int ReadChar(int);                     //从.cod文件读 
	void WriteChar(char, int );            //往.cod文件写
	void WriteHex(char, int );             //往.txt文件写十六进制代码(char型表示)
	bool INS(InsNode * );                  //指令处理函数	
	int ReadCharmem(int);
////////////////////////////////////////////////////////////////////////////////////
public:
	CAcroComp(){}
	~CAcroComp(){inf.close();outf.close();outftxt.close();}
	bool Handle(char *);                      //作为接口函数,主要函数
	bool WritehexChar(char *,char *);         //.cod文件转化为16进制字符串形式	
	ErrorReport * GetErrorReport(void){return &report;} 
    char * Getchg(void){return chg;}
	bool WriteToMem(char *);
 };
int CAcroComp::CompareString(char * s1,char * s2){  //字符串匹配函数
	if(strcmp(s1,s2)==0) return 1;
	else return -1;     //不匹配
}
char CAcroComp::Ttwo(char * ch){               //
	if(ch[0]=='R'){
		if(ch[1]>='0' && ch[1]<='9' && ch[2]=='\0')return ch[1];
		if(ch[1]=='1' && ch[2]>='0' && ch[2]<='5' && ch[3]=='\0')return 'A'-'0'+ch[2];
	}
	return '#';
}
int CAcroComp::Decsum(char * ch){             //
	int l=strlen(ch);
	int suma=1,sumb=0;
    ch[l]='\0';
	for(int m=1;m<l;m++){
		if(ch[m] < '0' || ch[m] >'9'){return -2000;} //不可计算,返回-2000
	}
	for(int n=0;n<l;n++){
		  for(int z=0;z<l-n-1;z++){suma*=10;}
          sumb+=((int)ch[n]-48)*suma;
		  suma=1;
			}
	     return sumb;                                //可计算,返回其值
}
int CAcroComp::ReadChar(int o){
	infcod.seekg(o);
	return (int)infcod.get();
}
void CAcroComp::WriteChar(char ch,int o){
	outf.seekp(o);
	outf.put(ch);
}
int CAcroComp::ReadCharmem(int o){
	infmem.seekg(o);
	return (int)infmem.get();
}

void CAcroComp::WriteHex(char ch, int o){
	outftxt.seekp(o);
	outftxt.put(ch);
}
bool CAcroComp::WritehexChar(char * cod,char * txt){
	 infcod.open(cod, ios::binary);
	 if(!infcod){return false;}
	 outftxt.open(txt);
	 if(!outftxt){return false;}
	 HexArray Haa2(2); 
	 Haa2.SetValue(ReadChar(0));
     char chg=Haa2.GetArray()[0].GetChar();
	 WriteHex(chg,0); 
     chg=Haa2.GetArray()[1].GetChar();
     WriteHex(chg,1);
     WriteHex(' ',2);
	 int op=3;    
     while(infcod.eof()==0){
		 int chgg=(2*op-1)/5;
         Haa2.SetValue(ReadChar(chgg));         //化为16进制数形式
		 chg=Haa2.GetArray()[0].GetChar();
	     WriteHex(chg,op++); 
		 chg=Haa2.GetArray()[1].GetChar();
		 WriteHex(chg,op++);
		 Haa2.SetValue(ReadChar(chgg+1));
		 chg=Haa2.GetArray()[0].GetChar();
	     WriteHex(chg,op++); 
		 chg=Haa2.GetArray()[1].GetChar();
		 WriteHex(chg,op++);
		 WriteHex(' ',op++);
	 }
    return true;
}
bool CAcroComp::WriteToMem(char * cod){

	CTEC2000App *pApp;
    pApp=(CTEC2000App *)AfxGetApp();
	memory=pApp->memory;

	infmem.open(cod,ios::binary);
	if(!infmem){return false;}
    int j=ReadCharmem(2)*256+ReadCharmem(1);
    int i=5;
    while(infmem.eof()==0){
	memory[j]=ReadCharmem(i)*256+ReadCharmem(i+1);
	i+=2;
	j++;
	}
	return true;
}
bool CAcroComp::OpenSoueceFile(char * in,char * out){
   inf.open(in);
	if(!inf){
		report.AddError(0,0);
		return false;
	}
	outf.open(out,ios::binary);
	return true;
}
bool CAcroComp::FileIsEnd(void){
	if(inf.eof()==0) return false;
	else return true;
}
bool CAcroComp::Getbuffer(){
     inf.getline(buffer,MAXSIZE,'\n');
	 if(strlen(buffer)==0) return false; 
	 buffer[strlen(buffer)]='\0';
	 for(int iob=0;iob<=(int)strlen(buffer);iob++){
		 if(buffer[iob]==';'){
			 buffer[iob]='\0';
		 }
	 }
	 return true;
}
bool CAcroComp::Analyzebuffer(void){
	tobuffer=new char[strlen(buffer)+1];
    strcpy(tobuffer,buffer);
	int lencount=0;
    for( int h=0; h<=(int)strlen(tobuffer); h++){
	   if(tobuffer[h]!=' ' && tobuffer[h]!=',' && tobuffer[h]!='\t' 
		   && tobuffer[h]!='\0'){lencount++;}
	}
	if(lencount==0)return false;
    int j=0, k=0, bp=0;       //bp统计单引号的数目
	argN=0;
    for( int i=0; i<=(int)strlen(tobuffer); i++){
	   if(tobuffer[i]==' ' || tobuffer[i]==',' || tobuffer[i]=='\t' 
		  ||  tobuffer[i]=='\0')
	   {  
		  if(bp%2==1 && tobuffer[i]!='\0'){buffer[j++]=tobuffer[i];continue;}//修正
	      else{
		      if(j==0){continue;}
		      else{              
		           buffer[j]='\0';
				   strcpy(par[k],buffer);
		           for(int len=0; len<(int)strlen(buffer); len++){CharUpperCase(buffer[len]);}
		           strcpy(arg[k],buffer);
		           j=0;
		           k++;
		           argN++;
			  }
		  }
		}
	    else
		{
         if(tobuffer[i]=='\'')bp++;
		 buffer[j]=tobuffer[i];
		 j++;
         if(tobuffer[i]==':' && k==0){
              buffer[j]='\0';
		      strcpy(par[k],buffer);
		      for(int len=0; len<(int)strlen(buffer); len++){CharUpperCase(buffer[len]);}
		      strcpy(arg[k],buffer);
		      j=0;
		      k++;
		      argN++;
		 }		 
		}
	}
	tobuffer[0]='\0';
	return true;
}
int CAcroComp::Calculate(char * ch){  //不可计算返回-2000,可计算返回其值
	HexArray ha4(8);
	int l=strlen(ch);
	if(ch[0]=='\'' || ch[l-1]=='\''){
		if(ch[0]!=ch[l-1]){if(flag==1)report.AddError(Line,2);return -2000;}//
		else if(l==2){return 0;}
		else if(l==3){return (int)ch[1];}                    //'a'
		else if(l==4){return (int)ch[1]*256+(int)ch[2];}     //'Ab'
		else {if(flag==1)report.AddError(Line,3);return -2000;}             //''以及'abc'等
	}
	else if(ch[l-1]=='H' || ch[l-1]=='h'){
        for(int len=0; len<(int)strlen(ch); len++){CharUpperCase(ch[len]);}
		for(int gg=0; gg<(int)strlen(ch)-1; gg++){
            if((ch[gg]<'0' || ch[gg]>'9') && (ch[gg]<'A' || ch[gg]>'F'))
				{return -2000;}
		}
		ch[l-1]='\0';
		if(!ha4.SetString(ch)){return -2000;}
	    return ha4.GetValue();
	}
	else if(ch[l-1]=='D' || ch[l-1]=='d'){
		for(int len=0; len<(int)strlen(ch); len++){CharUpperCase(ch[len]);}
        if(ch[0]<'0' || ch[0]>'9'){return -2000;}
      	ch[l-1]='\0';
		return Decsum(ch);
	}
    else if(ch[0]>='0' && ch[0]<='9' && ch[l-1]>='0' && ch[l-1]<='9' ){
		 return Decsum(ch);}
  	return -2000;
}
int CAcroComp::Evaluate(char * expression){
	int sum=0,temp2,l;
	char part[40][40];
	char partp[40][40];
	char symbol[20];
	char * Expbuffer;
	char xbuffer[40];
	Expbuffer=new char[strlen(expression)+1];
    strcpy(Expbuffer,expression);
    int j=0, k=0, h=0, cp=0;
	int partN=0;
    for( int i=0; i<=(int)strlen(Expbuffer); i++){
      if(Expbuffer[i]=='+' || Expbuffer[i]=='-' || Expbuffer[i]=='*' 
		  ||  Expbuffer[i]=='/' || Expbuffer[i]=='\0')
	  {  if(cp%2==1 && Expbuffer[i]!='\0'){xbuffer[j++]=Expbuffer[i];continue;}
	     else{
		   symbol[h++]=Expbuffer[i];
		   if(j==0){continue;}
		   else{              
		   xbuffer[j]='\0';
		   strcpy(partp[k],xbuffer);//partp[k]可能有小写
           for(int len=0; len<(int)strlen(xbuffer); len++){CharUpperCase(xbuffer[len]);}
		   strcpy(part[k],xbuffer);//part[k]均为大写
		   j=0;
		   k++;
		   partN++;
		   }
		 }
	   }
	   else
	   {   if(Expbuffer[i]=='\'')cp++;
		   xbuffer[j]=Expbuffer[i];
		   j++;
	   }
	}
	symbol[h]='\0';
    sum=Calculate(partp[0]);//可能有如'Ab'型数
	if(sum==-2000){sum=Pstable.SearchPseudoins(part[0]);} //
    if(sum==-1000 && flag==1){report.AddError(Line,21);return -1000;} //在Pstable中没找到,即将表达式赋值为-1000
    for(l=0;l<(int)strlen(symbol);l++){                                  //
		temp2=Calculate(partp[l+1]);//可能有如'Ab'型数                   //
		if(temp2==-2000){temp2=Pstable.SearchPseudoins(part[l+1]);}
    	if(temp2==-1000 && flag==1){report.AddError(Line,21); return -1000;} //在Pstable中没找到,即将表达式赋值为-1000        
		switch(symbol[l]){
		case '+':sum+=temp2;break;
	    case '-':sum-=temp2;break;
		case '*':sum*=temp2;break;
	    case '/':sum/=temp2;break;
		}	
	}
    return sum;
}
int CAcroComp::Process(void){
	InsNode * insNode;          //指令节点类对象
	int high,low,temp,i,j=0;
LEAP:
		if(CompareString(arg[0],"END")==1){
			Endcount++;
			if(argN!=1){if(flag==1)report.AddError(0,13);return -1;}
            return 1;
		}
		else if(CompareString(arg[0],"ORG")==1){
			Orgcount++;
            if(argN==1){ 
				WriteChar((char)0,p++);
			    WriteChar((char)0,p++);
		        p+=2;
				Realtimeaddr=0;
				return 1;}
			else if(argN>2){if(flag==1)report.AddError(Line,15);return -1;}
			if(Orgcount==1){
                  temp=Evaluate(par[argN-1]);
			      Realtimeaddr=temp;               //expression calculate
			      low=temp%256;
		          high=(temp-low)/256;
		          WriteChar((char)low,p++);
			      WriteChar((char)high,p++);
		        	p+=2;
			}
			else if(Orgcount>=2){
				j=Evaluate(par[argN-1]);        //两个以上org
			    if(j<Realtimeaddr){
				  if(flag==1)report.AddError(Line,17);return -1;
				}
                p+=2*(j-Realtimeaddr);
				Realtimeaddr=j;                 //修正
            }
		  return 1;	
		}
        else if(insList.SearchName(arg[0])!=NULL){
			 insNode=insList.SearchName(arg[0]);
			 if(argN-1 != insNode->GetParaNum()){
			    if(flag==1)report.AddError(Line,28); 
				return -1;
			}
			else{
			     INS(insNode);
			}
		}
		else if(CompareString(arg[0],"DW")==1){
			 if(argN<2){if(flag==1)report.AddError(Line,18);return -1;}
		     for(int f=1;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++;
					   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -