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

📄 uasm.cpp

📁 模拟了tec2000的所有功能
💻 CPP
📖 第 1 页 / 共 5 页
字号:
// 
//
#include "Stdafx.h"
#include "Uasm.h"
#include "stdio.h"
#include<string.h> 
// ////////////////////////单字无操作数////////////////////////////

void CUasm::pshf(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	byte_t single;
	in_file.read((char*)&single,sizeof(byte_t));//取出单字无操作数操作码后的8个0
     
	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<<": \tPSHF"<<endl;  
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 84";
		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::popf(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<<": \tPOPF"<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 8c";
		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::ret(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<<": \tRET"<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 8f";
		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::Dec(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int DR;                                 //存放所用的积存器号
	byte_t sd;
	in_file.read((char*) &sd, sizeof(byte_t));//将DR0000一起取出存在sd中
	DR=(sd&(0xf0))>>4;                      //按位与之后右移四位即可得DR

	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<<": \tDEC   R"<<dec<<DR<<endl;
	    out_file1<<"p  ";
	}
    else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 08";
		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++;
	
}


void CUasm::inc(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int DR;
	byte_t sd;
	in_file.read((char*) &sd, sizeof(byte_t));
	DR=(sd&(0xf0))>>4;

	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<<": \tINC   R"<<dec<<DR<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 09";
		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++;
	
}

void CUasm::shl(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int DR;
	byte_t sd;
	in_file.read((char*) &sd, sizeof(byte_t));
	DR=(sd&(0xf0))>>4;	
	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<<": \tSHL   R"<<dec<<DR<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 0A";
		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++;
	
}

void CUasm::shr(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int DR;
	byte_t sd;
	in_file.read((char*) &sd, sizeof(byte_t));
	DR=(sd&(0xf0))>>4;
	
	
	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<<": \tSHR   R"<<dec<<DR<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 0B";
		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++;
	
}

void CUasm::push(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int SR;
	byte_t sd;
	in_file.read((char*) &sd, sizeof(byte_t));
	SR=sd&(0x0f);
	
	
	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<<": \tPUSH  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 85";
		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++;
	
}


void CUasm::pop(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	
	int DR;
	byte_t sd;
	in_file.read((char*) &sd, sizeof(byte_t));
	DR=(sd&(0xf0))>>4;
	
	
	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<<": \tPOP  R"<<dec<<DR<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 87";
		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++;
	
}




//
void CUasm::jr(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	char OFFSET;                                 //OFFSET用于存放跳转偏移量
	in_file.read((char*) &OFFSET,sizeof(byte_t));
    char myout[4];
	unsigned short my=OFFSET+addr+1;
	sprintf(myout,"%4.4X",my);
	
	
	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<<": \tJR    "<<myout<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 41";
		if((int)OFFSET<0x10)out_file<<"0"<<hex<<(int)OFFSET;
		else out_file<<hex<<(int)OFFSET;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
	
}

void CUasm::jrc(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	char OFFSET;                                 //OFFSET用于存放跳转偏移量
	in_file.read((char*) &OFFSET,sizeof(byte_t));
	char myout[4];
	unsigned short my=OFFSET+addr+1;
	sprintf(myout,"%4.4X",my);
	
	
	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<<": \tJRC    "<<myout<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 44";
		if((int)OFFSET<0x10)out_file<<"0"<<hex<<(int)OFFSET;
		else out_file<<hex<<(int)OFFSET;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
	
}

void CUasm::jrnc(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	char OFFSET;                                 //OFFSET用于存放跳转偏移量
	in_file.read((char*) &OFFSET,sizeof(byte_t));
    char myout[4];
	unsigned short my=OFFSET+addr+1;
	sprintf(myout,"%4.4X",my);
	
	
	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<<": \tJRNC    "<<myout<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 45";
		if((int)OFFSET<0x10)out_file<<"0"<<hex<<(int)OFFSET;
		else out_file<<hex<<(int)OFFSET;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
	
}

void CUasm::jrz(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	char OFFSET;                                 //OFFSET用于存放跳转偏移量
	in_file.read((char*) &OFFSET,sizeof(byte_t));
    char myout[4];
	unsigned short my=OFFSET+addr+1;
	sprintf(myout,"%4.4X",my);
	
	
	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<<": \tJRZ    "<<myout<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 46";
		if((int)OFFSET<0x10)out_file<<"0"<<hex<<(int)OFFSET;
		else out_file<<hex<<(int)OFFSET;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
}

void CUasm::jrnz(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	char OFFSET;                                 //OFFSET用于存放跳转偏移量
	in_file.read((char*) &OFFSET,sizeof(byte_t));
	char myout[4];
	unsigned short my=OFFSET+addr+1;
	sprintf(myout,"%4.4X",my);
	
	
	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<<": \tJRNZ    "<<myout<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 47";
		if((int)OFFSET<0x10)out_file<<"0"<<hex<<(int)OFFSET;
		else out_file<<hex<<(int)OFFSET;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
	
}



//
void CUasm::in(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	
	byte_t PORT;                                   //PORT用于存放端口号
	in_file.read((char*) &PORT,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<<": \tIN    "<<hex<<(int)PORT<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 82";
		if((int)PORT<0x10)out_file<<"0"<<hex<<(int)PORT;
		else out_file<<hex<<(int)PORT;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
	
}

void CUasm::out(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	byte_t PORT;
	in_file.read((char*) &PORT,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<<": \tOUT   "<<hex<<(int)PORT<<'h'<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 86";
		if((int)PORT<0x10)out_file<<"0"<<hex<<(int)PORT;
		else out_file<<hex<<(int)PORT;
		out_file<<"h"<<endl;
	}
	else out_file1<<"#  ";
	j=(j+1)%8;
	addr++;
}




///////////////////////////单字双操作数基本指令////////////////////////////////
void CUasm::add(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int DR;
	int SR;
	byte_t sd;
	in_file.read((char*)&sd,sizeof(byte_t));
	DR=(sd&0xf0)>>4;
	SR=sd&0x0f;                           //sd与0x0f按位与之后即得SR
	 
	
	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<<": \tADD   R"<<dec<<DR<<", R"<<SR<<endl;
	    out_file1<<"p  ";
	}
	else if(sign[addr-address]==2)
	{
		out_file1<<"w  ";
		out_file<<hex<<setfill('0')<<setw(4)<<addr<<": \tDW 00";
		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++;
	
}

void CUasm::sub(ifstream& in_file,ofstream& out_file,ofstream& out_file1)
{
	int DR;

⌨️ 快捷键说明

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