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

📄 uasm.cpp

📁 模拟了tec2000的所有功能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	j=(j+1)%8;
	addr++;
	if(j==0)
	{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";}
	if(sign[addr-address]==1)
	{	
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW ";
		if((int)ADR_H<0x10)out_file<<"0"<<hex<<(int)ADR_H;
		else out_file<<hex<<(int)ADR_H;
		if(int(ADR_L)<0x10)
		    out_file<<"0"<<(int)ADR_L;
	    else
		    out_file<<(int)ADR_L;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
}
void CUasm::stra(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	byte_t ADR_L;
	byte_t ADR_H;
	byte_t sd;
	int SR;
	in_file.read((char*) &sd,sizeof(byte_t));
	SR=(sd&(0x0f));
	in_file.read((char*)&ADR_H,sizeof(byte_t));
    in_file.read((char*)&ADR_L,sizeof(byte_t));
	
	
	if(j==0)
	{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";}
	if(sign[addr-address]==1)
	{	out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tSTRA  ";
	if(int(ADR_H)<0x10||int(ADR_H)>=0xa0)
		out_file<<'['<<hex<<"0"<<(int)ADR_H;
	else
		out_file<<'['<<hex<<(int)ADR_H;
	if(int(ADR_L)<0x10)
		out_file<<"0"<<(int)ADR_L;
	else
		out_file<<(int)ADR_L;
	out_file<<"h"<<']'<<" , ";
	out_file<<"  R"<<dec<<SR<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW E7";
		if((int)sd<0x10)out_file<<"0"<<hex<<(int)sd;
		else out_file<<hex<<(int)sd;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
	if(j==0)
	{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";}
	if(sign[addr-address]==1)
	{	
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW ";
		if((int)ADR_H<0x10)out_file<<"0"<<hex<<(int)ADR_H;
		else out_file<<hex<<(int)ADR_H;
		if(int(ADR_L)<0x10)
		    out_file<<"0"<<(int)ADR_L;
	    else
		    out_file<<(int)ADR_L;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
}
void CUasm::iret(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	byte_t single;//
	in_file.read((char*)&single,sizeof(byte_t));
	
	
	if(j==0)
	{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";}
	if(sign[addr-address]==1)
	{	out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tIRET"<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW EF";
		if((int)single<0x10)out_file<<"0"<<hex<<(int)single;
		else out_file<<hex<<(int)single;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
}





///////////////////////////////////////////////////////////
void CUasm::get_addr_and_len(ifstream& in_file)
{
	byte_t STT;//cod文件开始的01
	in_file.read((char*) &STT, sizeof(byte_t));//读过01//加头文件鉴别
	in_file.read((char*) &addr,sizeof(word_t));//读出首地址
    in_file.read((char*) &length,sizeof(word_t));//读length,以便于主函数中取第一个操作码
}


bool CUasm::perform(ifstream &in_file,ofstream& out_file,ofstream&out_file1,word_t head,word_t tail)
{
	if(head<addr){
		//cout<<"首地址是"<<hex<<addr<<endl;
		j=0;}
	if(addr+length<head){
		//cout<<"首地址越界,出错!!"<<endl;
		return false;}
	byte_t word;
	j=0;
    while(!in_file.eof()&&addr<head)
	{
		in_file.read((char *) &word,sizeof(byte_t));
		in_file.read((char *) &word,sizeof(byte_t));
		
		
		if(j==0)
		{out_file1<<'\n'<<hex<<setfill('0')<<setw(4)<<addr<<":   ";}
	    out_file1<<"   ";
		j=(j+1)%8;
        addr++;
	}
	
	out_file<<"ORG "<<hex<<setfill('0')<<setw(4)<<addr<<'h'<<endl;
	while(!in_file.eof()&&addr<=tail)
	{
		byte_t instr;//用于存储指令
		in_file.read((char*) &instr,sizeof(byte_t));//获得指令
		if (!in_file.eof())
		{
				//errLine++;
				switch (instr)
				{
				case 0x00:add(in_file,out_file,out_file1);
					break;
				case 0x01:sub(in_file,out_file,out_file1);
					break;
				case 0x02:and(in_file,out_file,out_file1);
					break;
				case 0x03:cmp(in_file,out_file,out_file1);
					break;
				case 0x04:xor(in_file,out_file,out_file1);
					break;
				case 0x05:test(in_file,out_file,out_file1);
					break;
				case 0x06:or(in_file,out_file,out_file1);
					break;
				case 0x07:mvrr(in_file,out_file,out_file1);
					break;
				case 0x08:Dec(in_file,out_file,out_file1);
					break;
				case 0x09:inc(in_file,out_file,out_file1);
					break;
				case 0x0A:shl(in_file,out_file,out_file1);
					break;
				case 0x0B:shr(in_file,out_file,out_file1);
					break;
				case 0x41:jr(in_file,out_file,out_file1);
					break;
				case 0x44:jrc(in_file,out_file,out_file1);
					break;
				case 0x45:jrnc(in_file,out_file,out_file1);
					break;
				case 0x46:jrz(in_file,out_file,out_file1);
					break;
				case 0x47:jrnz(in_file,out_file,out_file1);
					break;
				case 0x80:jmpa(in_file,out_file,out_file1);
					break;
				case 0x81:ldrr(in_file,out_file,out_file1);
					break;
				case 0x82:in(in_file,out_file,out_file1);
					break;
				case 0x83:strr(in_file,out_file,out_file1);
					break;
				case 0x84:pshf(in_file,out_file,out_file1);
					break;
				case 0x85:push(in_file,out_file,out_file1);
					break;
				case 0x86:out(in_file,out_file,out_file1);
					break;
				case 0x87:pop(in_file,out_file,out_file1);
					break;
				case 0x88:mvrd(in_file,out_file,out_file1);
					break;
				case 0x8c:popf(in_file,out_file,out_file1);
					break;
				case 0x8f:ret(in_file,out_file,out_file1);
					break;
				case 0xce:cala(in_file,out_file,out_file1);
					break;
				case 0x20:adc(in_file,out_file,out_file1);
					break;
				case 0x21:sbb(in_file,out_file,out_file1);
					break;
				case 0x2a:rcl(in_file,out_file,out_file1);
					break;
				case 0x2b:rcr(in_file,out_file,out_file1);
					break;
				case 0x2c:asr(in_file,out_file,out_file1);
					break;
				case 0x2d:not(in_file,out_file,out_file1);
					break;
				case 0x60:jmpr(in_file,out_file,out_file1);
					break;
				case 0x64:jrs(in_file,out_file,out_file1);
					break;
				case 0x65:jrns(in_file,out_file,out_file1);
					break;
				case 0x6c:clc(in_file,out_file,out_file1);
					break;
				case 0x6d:stc(in_file,out_file,out_file1);
					break;
				case 0x6e:ei(in_file,out_file,out_file1);
					break;
				case 0x6f:di(in_file,out_file,out_file1);
					break;
				case 0xe0:calr(in_file,out_file,out_file1);
					break;
				case 0xe4:ldra(in_file,out_file,out_file1);
					break;
				case 0xe5:ldrx(in_file,out_file,out_file1);
					break;
				case 0xe6:strx(in_file,out_file,out_file1);
					break;
				case 0xe7:stra(in_file,out_file,out_file1);
					break;
				case 0xef:iret(in_file,out_file,out_file1);
					break;
                default:dw(in_file,out_file,out_file1,instr);
					break;
				}
		}
		else
			break;
	}
    out_file<<"END"<<endl;
    in_file.close();
    out_file.close();
	out_file1.close();
    return true;

}





bool CUasm::exec(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
    //errLine =0;
	while(!in_file.eof())
	{
		byte_t instr;//用于存储指令
		in_file.read((char*) &instr,sizeof(byte_t));//获得指令
		if (!in_file.eof())
		{
				//errLine++;
				switch (instr)
				{
				case 0x00:add(in_file,out_file,out_file1);
					break;
				case 0x01:sub(in_file,out_file,out_file1);
					break;
				case 0x02:and(in_file,out_file,out_file1);
					break;
				case 0x03:cmp(in_file,out_file,out_file1);
					break;
				case 0x04:xor(in_file,out_file,out_file1);
					break;
				case 0x05:test(in_file,out_file,out_file1);
					break;
				case 0x06:or(in_file,out_file,out_file1);
					break;
				case 0x07:mvrr(in_file,out_file,out_file1);
					break;
				case 0x08:Dec(in_file,out_file,out_file1);
					break;
				case 0x09:inc(in_file,out_file,out_file1);
					break;
				case 0x0A:shl(in_file,out_file,out_file1);
					break;
				case 0x0B:shr(in_file,out_file,out_file1);
					break;
				case 0x41:jr(in_file,out_file,out_file1);
					break;
				case 0x44:jrc(in_file,out_file,out_file1);
					break;
				case 0x45:jrnc(in_file,out_file,out_file1);
					break;
				case 0x46:jrz(in_file,out_file,out_file1);
					break;
				case 0x47:jrnz(in_file,out_file,out_file1);
					break;
				case 0x80:jmpa(in_file,out_file,out_file1);
					break;
				case 0x81:ldrr(in_file,out_file,out_file1);
					break;
				case 0x82:in(in_file,out_file,out_file1);
					break;
				case 0x83:strr(in_file,out_file,out_file1);
					break;
				case 0x84:pshf(in_file,out_file,out_file1);
					break;
				case 0x85:push(in_file,out_file,out_file1);
					break;
				case 0x86:out(in_file,out_file,out_file1);
					break;
				case 0x87:pop(in_file,out_file,out_file1);
					break;
				case 0x88:mvrd(in_file,out_file,out_file1);
					break;
				case 0x8c:popf(in_file,out_file,out_file1);
					break;
				case 0x8f:ret(in_file,out_file,out_file1);
					break;
				case 0xce:cala(in_file,out_file,out_file1);
					break;
				case 0x20:adc(in_file,out_file,out_file1);
					break;
				case 0x21:sbb(in_file,out_file,out_file1);
					break;
				case 0x2a:rcl(in_file,out_file,out_file1);
					break;
				case 0x2b:rcr(in_file,out_file,out_file1);
					break;
				case 0x2c:asr(in_file,out_file,out_file1);
					break;
				case 0x2d:not(in_file,out_file,out_file1);
					break;
				case 0x60:jmpr(in_file,out_file,out_file1);
					break;
				case 0x64:jrs(in_file,out_file,out_file1);
					break;
				case 0x65:jrns(in_file,out_file,out_file1);
					break;
				case 0x6c:clc(in_file,out_file,out_file1);
					break;
				case 0x6d:stc(in_file,out_file,out_file1);
					break;
				case 0x6e:ei(in_file,out_file,out_file1);
					break;
				case 0x6f:di(in_file,out_file,out_file1);
					break;
				case 0xe0:calr(in_file,out_file,out_file1);
					break;
				case 0xe4:ldra(in_file,out_file,out_file1);
					break;
				case 0xe5:ldrx(in_file,out_file,out_file1);
					break;
				case 0xe6:strx(in_file,out_file,out_file1);
					break;
				case 0xe7:stra(in_file,out_file,out_file1);
					break;
				case 0xef:iret(in_file,out_file,out_file1);
					break;
                default:dw(in_file,out_file,out_file1,instr);
					break;
				}
		}
		else
			break;
	}
		
		out_file<<"END"<<endl;
		in_file.close();
		out_file.close();
		out_file1.close();
		return true;
	  
}
/*
bool CUasm::StartUasm(char* infile,char*outfile,int ink)
{
	int pink=ink; 
    infile[pink]='.';outfile[pink]='.';
	infile[pink+1]='c';outfile[pink+1]='a';
	infile[pink+2]='o';outfile[pink+2]='s';
	infile[pink+3]='d';outfile[pink+3]='m';
	infile[pink+4]=outfile[pink+4]='\0';
    cout<<infile<<endl;
	ifstream in_file(infile,ios::binary);//建立输入文件对象
	if(!in_file)
	{return false;}
    ofstream out_file(outfile);        //建立输出文件对象
	if(!out_file)
	{return false;}
	get_addr_and_len(in_file);
	out_file<<"ORG "<<hex<<addr<<'h'<<endl;
	if(!exec(in_file,out_file))
		return false;
	return true;
}
*/

bool  CUasm::uuasm(char *infile)
{
	char outfile[100];
	char outfile1[100];
	strcpy(outfile,infile);
	strcpy(outfile1,infile);
	int length1=strlen(infile);
	outfile[length1-4]='!';
	outfile[length1-3]='.';outfile[length1-2]='a';
	outfile[length1-1]='s';outfile[length1]='m';
	outfile[length1+1]='\0';
	outfile1[length1-4]='#';
	outfile1[length1-3]='.';outfile1[length1-2]='a';
	outfile1[length1-1]='s';outfile1[length1]='m';
	outfile1[length1+1]='\0';

    ifstream in_file(infile,ios::binary);//建立输入文件对象
	if(!in_file){return false;}
    ofstream out_file(outfile);        //建立输出文件对象
    if(!out_file){return false;}
	ofstream out_file1(outfile1);
	if(!outfile1){return false;}
    get_addr_and_len(in_file);
	out_file<<"ORG "<<hex<<setfill('0')<<setw(4)<<addr<<'h'<<endl;
	j=0;
	if(!exec(in_file,out_file,out_file1))
		return false;
	return true;
}




bool CUasm::uuuasm(char *infile,word_t head,word_t tail)
{
	if(head>=tail){
		//cout<<"首地址小于末地址出错!"<<endl;
		return false;}
	char outfile[100];
	char outfile1[100];
	strcpy(outfile,infile);
	strcpy(outfile1,infile);
	int length1=strlen(infile);
	outfile[length1-4]='-';
	outfile[length1-3]='.';outfile[length1-2]='a';
	outfile[length1-1]='s';outfile[length1]='m';
	outfile[length1+1]='\0';
	outfile1[length1-4]='&';
	outfile1[length1-3]='.';outfile1[length1-2]='a';
	outfile1[length1-1]='s';outfile1[length1]='m';
	outfile1[length1+1]='\0';
	cout<<infile<<length1<<outfile<<endl;
	ifstream in_file(infile,ios::binary);//建立输入文件对象
	if(!in_file){return false;}
    ofstream out_file(outfile);        //建立输出文件对象
    if(!out_file){return false;}
	ofstream out_file1(outfile1);
	if(!outfile1){return false;}
	get_addr_and_len(in_file);
	   
	if(!perform(in_file,out_file,out_file1,head,tail))
		return false;
	return true;
}

/*  

bool CUasm::outcod(char *infile)
{
	char outfile[100];
	char outfile1[100];
	strcpy(outfile,infile);
	strcpy(outfile1,infile);
    int length1=strlen(infile);
	outfile[length1-3]='t';outfile[length1-2]='x';
	outfile[length1-1]='t';outfile[length1]='\0';
	outfile1[length1-4]='#';
	outfile1[length1-3]='.';outfile1[length1-2]='a';

⌨️ 快捷键说明

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