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

📄 simulator.cpp

📁 一个用C++实现的C的Compiler。 代码风格良好。 原作者自己写了这个编译器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	}
	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 == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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 == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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[])
{
	if (argc == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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;
	for (int 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;
	word temp = 0xFFFF;
	for (unsigned int i=0;i<sizeof(IDList)/sizeof(AsmID);i++)
	{
		if (strcmp(IDList[i].name,argv[0]) == 0)
		{
			temp = IDList[i].id;
			break ;
		}
	}
	if (temp == 0xFFFF)
	{
		if (strcmp("ADDIU",argv[0]) == 0)
		{
			if (argc == 3)
				temp = 9;
			else if (argc == 4)
				temp = 8;
			else return -1;
		}
		else if (strcmp("ADDSP",argv[0]) == 0)
		{
			if (argc == 3)
				temp = 0;
			else if (argc == 2)
				temp = 12;
			else return -1;
		}
		else return -1;
	}
	int value;
	code = temp;
	switch (temp)
	{
	case 0: //5 r3 i8
	case 4:
	case 5:
	case 9:
	case 10:
	case 11:
	case 13:
	case 14:
	case 18:
	case 26:
		if (argc != 3)
			return -1;
		if ((value = get_regs_id(argv[1])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_number(argv[2],8)) < 0) return value;
		code <<= 8;
		code |= (word)value;
		break;
	case 1: //5 i11
		if (argc != 2)
			return -1;
		if ((value = get_number(argv[1],11)) < 0) return value;
		code <<= 11;
		code |= (word)value;
		break;
	case 6: //5 r3 r3 i3 c2
		if (argc != 4)
			return -1;
		if ((value = get_regs_id(argv[1])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_regs_id(argv[2])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_number(argv[3],3)) < 0) return value;
		code <<= 3;
		code |= (word)value;
		code <<= 2;
		if (strcmp("SLL",argv[0]) == 0)
			code |= 0;
		else if (strcmp("SRL",argv[0]) == 0)
			code |= 2;
		else if (strcmp("SRA",argv[0]) == 0)
			code |= 3;
		else return -1;
		break;
	case 8: //5 r3 r3 c1 i4
		if (argc != 4)
			return -1;
		if ((value = get_regs_id(argv[1])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_regs_id(argv[2])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		code <<= 1;
		if ((value = get_number(argv[3],4)) < 0) return value;
		code <<= 4;
		code |= (word)value;
		break;
	case 12: //5 c3 i8 ; 5 c3 r3 c2 r3
		if (argv[0][0] != 'M')
		{
			if (argc != 2)
				return -1;
			code <<= 3;
			switch (argv[0][3])
			{
			case 'Q': break;
			case 'E': code |= 1; break;
			case 'R': code |= 2; break;
			case 'S': code |= 3; break;
			}
			if ((value = get_number(argv[1],8)) < 0) return value;
			code <<= 8;
			code |= (word)value;
		}
		else
		{
			if (argc != 3)
				return -1;
			code <<= 3;
			code |= 7;
			if ((value = get_regs_id(argv[1])) < 0) return value;
			code <<= 3;
			code |= (word)value;
			code <<= 2;
			if ((value = get_regs_id(argv[2])) < 0) return value;
			code <<= 3;
			code |= (word)value;
		}
		break;
	case 19: //5 r3 r3 i5
	case 27:
		if (argc != 4)
			return -1;
		if ((value = get_regs_id(argv[1])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_regs_id(argv[2])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_number(argv[3],5)) < 0) return value;
		code <<= 5;
		code |= (word)value;
		break;
	case 28: //5 r3 r3 r3 c2
		if (argc != 4)
			return -1;
		if ((value = get_regs_id(argv[1])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_regs_id(argv[2])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		if ((value = get_regs_id(argv[3])) < 0) return value;
		code <<= 3;
		code |= (word)value;
		code <<= 2;
		switch (argv[0][0])
		{
		case 'A': code |= 1; break;
		case 'S': code |= 3; break;
		}
		break;
	case 29: //5 c3 c3 c5 ; 5 r3 c3 c5 ; 5 r3 r3 c5
		if (argc == 1 && strcmp("JR",argv[0]) == 0)
		{
			code <<= 11;
			code |= 32;
		}
		else if (argc == 2)
		{
			if ((value = get_regs_id(argv[1])) < 0) return value;
			code <<= 3;
			code |= (word)value;
			if (strcmp("JR",argv[0]) == 0)
				code <<= 8;
			else
			{
				code <<= 8;
				if (strcmp (argv[0],"JALR") == 0)
					code |= 192;
				else if (strcmp(argv[0],"MFHI") == 0)
					code |= 16;
				else if (strcmp(argv[0],"MFLO") == 0)
					code |= 18;
				else if (strcmp(argv[0],"MFPC") == 0)
					code |= 64;
				else return -1;
			}
		}
		else if (argc == 3)
		{
			if ((value = get_regs_id(argv[1])) < 0) return value;
			code <<= 3;
			code |= (word)value;
			if ((value = get_regs_id(argv[2])) < 0) return value;
			code <<= 3;
			code |= (word)value;
			code <<= 5;
			switch (strlen(argv[0]))
			{
			case 2: 
				if (strcmp(argv[0],"OR") != 0)
					return -1;
				code |= 13; break;
			case 3:
				switch (argv[0][0])
				{
				case 'S': code |= 2; break;
				case 'C': code |= 10; break;
				case 'N':
					if (argv[0][1] == 'E')
						code |= 11;
					else code |= 15;
					break;
				case 'A': code |= 12; break;
				case 'X': code |= 14; break;
				case 'D': code |= 26; break;
				}
				break;
			case 4:
				if (strcmp("SLTU",argv[0]) == 0)
					code  |= 3;
				else if (strcmp("SLLV",argv[0]) == 0)
					code  |= 4; 
				else if (strcmp("SRLV",argv[0]) == 0)
					code  |= 6; 
				else if (strcmp("SRAV",argv[0]) == 0)
					code  |= 7; 
				else if (strcmp("MFHI",argv[0]) == 0)
					code  |= 16; 
				else if (strcmp("MFLO",argv[0]) == 0)
					code  |= 18; 
				else if (strcmp("MULT",argv[0]) == 0)
					code  |= 24; 
				else if (strcmp("DIVU",argv[0]) == 0)
					code  |= 27;
				break;
			case 5: code |= 25; break;
			}
		}
		else return -1;
		break;
	}
	mem.write_mem(addr,code);
	return 0;
}


void run_edit_asm(int argc,char *argv[])
{
	if (argc == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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);
				}
			}

⌨️ 快捷键说明

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