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

📄 simulator.cpp

📁 一个可以模拟MIPS汇编语言在硬件上运行的模拟器。 该模拟器对于43条最常用的指令进行了实现。而且实现了端口通信
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	else
	{
		printf("\n\n");
		exit(0);
	}
}

void run_setbreak(int argc,char *argv[])
{
	int len;
	if (argc < 2)
	{
		printf ("\n Not enough arguments.\n");
		return;
	}
	if ((len = strlen(argv[1])) > 4)
	{
		printf ("\n Unknown control identifier `%s'.\n", argv [1]);
		return ;
	}
	int value = get_number(argv[1],16);
	if (value == -1)
	{
		printf ("\n Unknown control identifier `%s'.\n", argv [1]);
		return ;
	}
	word addr = (word)value;
	breakstack.binsert(addr);
}

void run_infobreak(int argc,char *argv[])
{
	if (argc != 1)
	{
		printf ("\n Unknown control identifier `%s'.\n", argv [1]);
		return ;
	}
	breakstack.list_break();
}

void run_delbreak(int argc,char *argv[])
{
	if (argc < 2)
	{
		printf ("\n Not enough arguments.\n");
		return;
	}
	int len = strlen(argv[1]);
	int index = 0;
	char ch;
	for (int i=0;i<len;i++)
	{
		ch = argv[1][i];
		if (ch <= '9' && ch >= '0')
		{
			index *= 10;
			index += (ch-'0') & 0xF;
		}
		else 
		{
			printf ("\n Unknown control identifier `%s'.\n", argv [1]);
			return ;
		}
	}
	breakstack.delbp(index);
}

void run_regs(int argc,char *argv[])
{
	if (argc != 1)
	{
		printf ("\n Unknown control identifier `%s'.\n", argv [1]);
		return ;
	}
	printf("\n");
	reg.list_regs();
}

void goto_pos(int pos)
{
	HANDLE hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD scrn;
	CONSOLE_SCREEN_BUFFER_INFO sbinf;
	GetConsoleScreenBufferInfo(hstdout,&sbinf);
	if (pos == 0)
		pos = 0;
	else pos += sbinf.dwCursorPosition.X;
	if (pos < 0 || pos >= SCRN_X)
		return ;
	scrn.X = pos;
	scrn.Y = sbinf.dwCursorPosition.Y;
	SetConsoleCursorPosition(hstdout,scrn);
}

void mem_save(word addr,char buffer[])
{
	IR = 0;
	for (int i=0;i<16;i++)
	{
		IR <<= 1;
		if (buffer[i] == '1')
			IR |= 0x1;
	}
	mem.write_mem(addr,IR);
}

void run_edit_mem(int argc,char *argv[])
{
	word addr = 0;
	int len, value;
	if (argc != 1)
	{
		len = strlen(argv[1]);
		if (len > 4)
		{
			printf ("\n Unknown control identifier `%s'.\n", argv [1]);
			return ;
		}
		value = get_number(argv[1],16);
		if (value == -1)
		{
			printf ("\n Unknown control identifier `%s'.\n", argv [1]);
			return ;
		}
	}
	else value = reg.PC;
	addr = (word)value;
	if (mem.can_vst(addr) != 0) 
	{
		printf("\n   Can not read memory %04x\n",addr);
		return ;
	}
	char ch;
	char buffer[17];
	buffer[16] = '\0';
	IR = mem.read_mem(addr);
	for (int i=0;i<16;i++)
	{
		if ((IR & 0x8000) != 0)
		{
			buffer[i] = '1';
		}
		else buffer[i] = '0';
		IR <<= 1;
	}
	printf("\n   [%04x]  %s",addr,buffer);
	goto_pos(-16);
	int cur = 0;
	while (true)
	{
		ch = getch();
		if (ch == -32)
		{
			ch = getch();
			switch (ch)
			{
			case 75:
				if (cur == 0)
					break;
				cur --;
				goto_pos(-1);
				break;
			case 77:
				if (cur == 15)
					break;
				cur ++;
				goto_pos(1);
				break;
			}
		}
		else if (ch == '0')
		{
			printf("%c",'0');
			buffer[cur] = '0';
			if (cur == 15)
				goto_pos(-1);
			else cur ++;
		}
		else if (ch == '1')
		{
			printf("%c",'1');
			buffer[cur] = '1';
			if (cur == 15)
				goto_pos(-1);
			else cur ++;
		}
		else if (ch == 13)
		{
			mem_save(addr,buffer);
			addr ++;
			if (mem.can_vst(addr) != 0)
				return ;
			IR = mem.read_mem(addr);
			for (int i=0;i<16;i++)
			{
				if ((IR & 0x8000) != 0)
					buffer[i] = '1';
				else buffer[i] = '0';
				IR <<= 1;
			}
			cur = 0;
			printf("\n   [%04x]  %s",addr,buffer);
			goto_pos(-16);
		}
		else if (ch == 'm' || ch == 7)
			return ;
	}
}

int save_asm(word addr,char buffer[])
{
	char *argv[64];
	int argc = 0;
	int in_command = 0;
	int i;
	for (i=0;buffer[i] != '\0';i++)
	{
		if (buffer[i] != ' ')
		{
			if (in_command == 0)
			{
				argv[argc++] = &buffer[i];
				in_command = 1;
			}
		}
		else
		{
			buffer[i] = '\0';
			in_command = 0;
		}
	}
	if (argc == 0)
		return -1;
	word code = 0;
	const struct TASM *p = const_asm;
	for (i=0;i<asm_total;i++)
	{
		if (strcmp(argv[0],(*p).name) == 0)
			break;
		p ++;
	}
	if (i == asm_total)
		return -1;
	int value;
	code = ((*p).code & (*p).x & (*p).y & (*p).z);
	word regs[3], k;
	regs[0] = ~(*p).x;
	regs[1] = ~(*p).y;
	regs[2] = ~(*p).z;
	word num;
	for (i=0;i<3;i++)
	{
		if (regs[i] != 0)
		{
			if (argc < i+2)
				return -1;
			k = (regs[i] & (*p).code);
			if (regs[i] == k)
			{
				if ((value = get_regs_id(argv[i+1])) < 0) return -1;
				while ((regs[i] & 1) == 0)
				{
					value = (value << 1);
					regs[i] = (regs[i] >> 1);
				}
				code |= value;
			}
			else
			{
				num = regs[i];
				while ((num & 1) == 0) num = (num >> 1);
				if ((value = get_number(argv[i+1],num,1)) < 0) return -1;
				while ((regs[i] & 1) == 0)
				{
					value = (value << 1);
					regs[i] = (regs[i] >> 1);
				}
				code |= value;
			}
		}
		else
		{
			if (argc != i+1)
				return -1;
			break ;
		}
	}
	mem.write_mem(addr,code);
	return 0;
}


void run_edit_asm(int argc,char *argv[])
{
	int len;
	char ch;
	word addr = 0;
	if (argc == 1)
		addr = reg.PC;
	else
	{
		len = strlen(argv[1]);
		if (len > 4)
		{
			printf ("\n Unknown control identifier `%s'.\n", argv [1]);
			return ;
		}
		for (int i=0;i<len;i++)
		{
			addr <<=4;
			ch = argv[1][i];
			if (ch <= '9' && ch >= '0')
				addr |= (ch-'0');
			else if (ch <= 'F' && ch >= 'A')
				addr |= (ch-'A'+10);
			else if (ch <= 'f' && ch >= 'a')
				addr |= (ch-'a'+10);
			else
			{
				printf ("\n Unknown control identifier `%s'.\n", argv [1]);
				return ;
			}
		}
	}
	if (mem.can_vst(addr) != 0) 
	{
		printf("\n   Can not read memory %04x\n",addr);
		return ;
	}
	len = 0;
	int cur = 0;
	char buffer[65];
	buffer[len] = buffer[64] = '\0';
	printf("\n   [%04x]  ",addr);
	while (true)
	{
		ch = getch();
		if (ch == 8)
		{
			if (cur != 0)
			{
				if (cur == len)
				{
					buffer[--len] = '\0';
					cur --;
					goto_pos(-1);
						printf(" ");
					goto_pos(-1);
				}
				else
				{
					memcpy(&buffer[cur-1],&buffer[cur],len-cur);
					buffer[--len] = '\0';
					printf("\b%s ",&buffer[--cur]);
					goto_pos(cur-len-1);
				}
			}
		}
		else if (ch == -32)
		{
			ch = getch();
			switch (ch)
			{
			case 75:
				if (cur != 0)
				{
					cur --;
					goto_pos(-1);
				}
					break;
			case 77:
				if (cur != len)
				{
					goto_pos(1);
						cur ++;
				}
				break;
			case 83:
				if (cur != len)
				{
					len --;
					memcpy(&buffer[cur],&buffer[cur+1],len-cur);
						buffer[len] = '\0';
					printf("%s ",&buffer[cur]);
					goto_pos(cur-len-1);
				}
				break;
			}
		}
		else if (ch == 13)
		{
			if (len == 0)
					return ;
			if (save_asm(addr,buffer) == 0)
			{
				addr ++;
				if (mem.can_vst(addr) != 0)
						return ;
			}
			cur = len = 0;
			buffer[len] = '\0';
			printf("\n   [%04x]  %s",addr,buffer);
		}
		else if ((ch <= '9' && ch >= '0') || ch == '-' || (ch <= 'Z' && ch >= 'A') || ch == ' ' || (ch <= 'z' && ch >= 'a'))
		{
			if (len != 64)
			{
				if (ch <= 'z' && ch >= 'a')
					ch -= 32;
				if (cur == len)
				{
					buffer[cur++] = ch;
					buffer[++len] = '\0';
					printf("%c",ch);
				}
				else
				{
					len ++;
					memcpy(&buffer[cur+1],&buffer[cur],len-cur);
					buffer[cur] = ch;
					printf("%s",&buffer[cur++]);
					goto_pos(cur-len);
				}
			}
		}
	}
}

void view_bincode(word code)
{
	word j = 0x8000;
	for (int i=0;i<16;i++)
	{
		if ((j & code) != 0)
			printf("1");
		else printf("0");
		j >>= 1;
	}
	printf("    <%04x>",code);
}

void run_view_bincode(int argc,char *argv[])
{
	int steps = 10;
	int value;
	if (argc == 1)
		PC = reg.PC;
	else if (argc >= 2)
	{
		value = get_number(argv[1],16);
		if (value == -1)
		{
			if (strcmp(argv[1],"sp") == 0 || strcmp(argv[1],"SP") == 0)
				value = reg.SP;
			else 
			{	
				printf ("\n Unknown control identifier `%s'.\n", argv[1]);
				return ;
			}
		}
		PC = (word)value;
	}
	if (argc > 2)
	{
		value = get_number(argv[2],16);
		if (value == -1)
		{
			printf ("\n Unknown control identifier `%s'.\n", argv[1]);
			return ;
		}
		if (steps < value)
			steps = value;
	}
	
	for (int i=0;i<steps && mem.can_vst(PC) == 0;i++)
	{
		printf("\n        [%04x] ",PC);
		IR = mem.read_mem(PC++);
		view_bincode(IR);
	}
}

void run_uasm(int argc,char *argv[])
{
	if (argc == 1)
	{
		PC = reg.PC;
		for (int i=0;i<10 && mem.can_vst(PC) == 0;i++)
		{
			printf("\n        [%04x] ",PC);
			IR = mem.read_mem(PC++);
			pc_decode(IR);
		}
		return ;
	}
	int steps = 10;
	int value = get_number(argv[1],16);
	if (value == -1)
	{
		printf ("\n Unknown control identifier `%s'.\n", argv[1]);
		return ;
	}
	PC = value;
	if (argc == 3)
	{
		value = get_number(argv[2],16);
		if (value == -1)
		{
			printf ("\n Unknown control identifier `%s'.\n", argv[2]);
			return ;
		}
		if (steps < value)
			steps = value;
	}
	for (int i=0;i<steps && mem.can_vst(PC) == 0;i++)
	{
		printf("\n        [%04x] ",PC);
		IR = mem.read_mem(PC++);
		pc_decode(IR);
	}
}

void run_reset(int argc,char *argv[])
{
	reg.PC = 0x0001;
	reg.SP = 0xDFFF;
	for (int i=0;i<8;i++)
		reg.regh[i] = 0x0000;
	reg.T = 0;
	reg.HI = reg.LO = 0;
	if (argv != NULL)
		run_regs(1,argv);
}

void run_load(int argc,char *argv[])
{
	if (argc == 1)
	{
		t = mem.load_mem("code.cod");
		run_reset(1,NULL);
	}
	else
	{
		if ((t = mem.load_mem(argv[1])) != 0 )
			printf("\n    Can not load file %s...\n",argv[1]);
	}
}

void run_save(int argc,char *argv[])
{
	if (argc == 1)
		mem.save_mem("rom.dat");
	else mem.save_mem(argv[1]);
}

void run_saveFormat(int argc,char *argv[])
{
	int PC = reg.PC;
	if(argc == 1)
		mem.save_memFormat("romFormat.dat",PC);
	else mem.save_memFormat(argv[1],PC);
}

void run_restart(int argc,char *argv[])
{
	reg.PC = 0x0001;
	run_continue(1,argv);
}

void run_set_reg(int argc,char *argv[])
{
	if (argc < 3)
	{
		printf ("\n Not enough arguments.\n");
		return;
	}
	if (strlen(argv[1]) != 2)
	{
		printf ("\n Unknown control identifier `%s'.\n",argv[1]);
		return ;
	}
	if (argv[1][0] == 'r')
		argv[1][0] = 'R';
	if (strlen(argv[2]) > 4)
	{
		printf ("\n Unknown control identifier `%s'.\n",argv[2]);
		return ;
	}
	word *regis = NULL;
	int value;
	if (argv[1][0] == 'R' && argv[1][1] <= '7' && argv[1][1] >= '0')
	{
		for (int i=0;i<8;i++)
		{
			if (strcmp(RegsList[i].name,argv[1]) == 0)
			{
				regis = &reg.regh[i];
				break;
			}
		}
	}
	else
	{
		if (strcmp("SP",argv[1]) == 0 || strcmp("sp",argv[1]) == 0)
			regis = &reg.SP;
	}
	if (regis == NULL)
	{
		printf ("\n Unknown control identifier `%s'.\n",argv[1]);
		return ;
	}
	value = get_number(argv[2],16);
	if (value == -1)
	{
		printf ("\n Unknown control identifier `%s'.\n",argv[2]);
		return ;
	}

⌨️ 快捷键说明

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