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

📄 simulator.cpp

📁 一个用C++实现的C的Compiler。 代码风格良好。 原作者自己写了这个编译器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		}
	}
}

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[])
{
	if (argc == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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 == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	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_load(int argc,char *argv[])
{
	if (argc == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	if (argc == 1)
		t = mem.load_mem("rom.dat");
	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 == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	if (argc == 1)
		mem.save_mem("rom.dat");
	else mem.save_mem(argv[1]);
}

void run_restart(int argc,char *argv[])
{
	if (argc == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	reg.PC = 0x0001;
	run_continue(1,argv);
}

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

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

void run_goto(int argc,char *argv[])
{
	if (argc == 2 && strcmp(argv[1],"--help") == 0)
	{
		printf("\n usage:\n");
		printf("  help\n");
		return ;
	}
	int value = get_number(argv[1],16);
	if (value == -1)
		return ;
	word addr = (word)value;
	if (mem.can_vst(addr) != 0)
		return ;
	reg.PC = addr;
	run_regs(1,argv);
}

void run_compile(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;
	}
	FILE *handle = fopen(argv[1],"rb");
	if (handle == NULL)
	{
		printf("\n     Can not find %s...\n",argv[1]);
		return ;
	}
	fclose(handle);
	printf("\n");
	char com[1024] = "dc.exe ";
	memcpy(&com[7],argv[1],strlen(argv[1])+1);
	system(com);
}

void run_help(int argc,char *argv[]);

typedef void (* Tconsole_func) (int , char *[]);

struct Tcommand
{
	Tconsole_func func;
	char *func_name;
	char *func_description;
};

Tcommand commands [] = {
	{run_continue,"c",""},
	{run_step,"s",""},		
	{run_quit,"q",""},
	{run_setbreak,"b",""},
	{run_infobreak,"lb",""},
	{run_delbreak,"db",""},
	{run_regs,"r",""},
	{run_view_bincode,"v",""},
	{run_edit_mem,"em",""},
	{run_edit_asm,"ea",""},
	{run_uasm,"u",""},
	{run_set_reg,"sr",""},
	{run_reset,"reset",""},
	{run_restart,"restart",""},
	{run_goto,"goto",""},
	{run_load,"load",""},
	{run_save,"save",""},
	{run_compile,"compile",""},
	{run_help,"help",""}
};

void run_help (int argc, char * argv [])
{
	printf ("\n   List of commands:\n");
	for (unsigned int i=0; i<sizeof(commands)/sizeof(Tcommand);i++)
	{
		printf ("      %s", commands[i].func_name);
		for (int j = strlen (commands[i].func_name);j<5;j++) printf (" ");
		printf (": %s\n", commands[i].func_description);
	}
}

struct Tconsole
{
	HANDLE hstdout;
	COORD scrn;
	CONSOLE_SCREEN_BUFFER_INFO sbinf;
	int curcom;
	int totalcom;
	int sizecom;
	char **comlist;
	Tconsole()
	{
		sizecom = 4;
		curcom = totalcom = 0;
		comlist = (char **)malloc(sizeof(char *)*sizecom);
		hstdout = GetStdHandle(STD_OUTPUT_HANDLE);
		WORD attr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_BLUE;
		SetConsoleTextAttribute(hstdout,attr);
		clearscrn();
	}	
	void clearscrn()
	{	
		int size;
		scrn.X = SCRN_X;
		scrn.Y = SCRN_Y;
		SetConsoleScreenBufferSize(hstdout,scrn);
		GetConsoleScreenBufferInfo(hstdout,&sbinf);
		size = SCRN_X*SCRN_Y;
		scrn.X = scrn.Y = 0;
		FillConsoleOutputAttribute(hstdout,sbinf.wAttributes,size,scrn,NULL);
		FillConsoleOutputCharacter(hstdout,' ',size,scrn,NULL);
		gotoxy(0,0);
	}
	void gotoxy(int xpos,int ypos)
	{
		scrn.X = xpos;
		scrn.Y = ypos;
		SetConsoleCursorPosition(hstdout,scrn);
	}
	void gotoxy_cur(int next)
	{
		if (next == 0)
			return ;
		GetConsoleScreenBufferInfo(hstdout,&sbinf);
		int pos = sbinf.dwCursorPosition.Y*SCRN_X+sbinf.dwCursorPosition.X+next;
		if (next > 0)
		{
			if (pos > SCRN_X*SCRN_Y)
				return ;
		}
		else 
		{
			if (pos < 0)
				return ;
		}
		scrn.X = pos%SCRN_X;
		scrn.Y = pos/SCRN_X;
		SetConsoleCursorPosition(hstdout,scrn);
	}
	void addcom(char *str)
	{
		comlist[totalcom] = (char *)malloc(sizeof(char)*(strlen(str)+1));
		memcpy(comlist[totalcom++],str,strlen(str)+1);
		if (totalcom == sizecom)
		{
			sizecom <<= 1;
			char **temp = (char **)malloc(sizeof(char *)*sizecom);
			for (int i=0;i<totalcom;i++)
				temp[i] = comlist[i];
			free(comlist);
			comlist = temp;
		}
		curcom = totalcom;
	}
	char *getcom(int next)
	{
		if (totalcom == 0)
			return NULL;
		switch (next)
		{
		case 0:
			if (curcom == 0)
				return NULL;
			else return comlist[--curcom];
		case 1:
			if (curcom == totalcom-1)
				return NULL;
			else return comlist[++curcom];
		case 2:
			return comlist[totalcom-1];
		default:
			return NULL;
		}
	}
	void work();
	void parse_and_run(char [], int );
};

void Tconsole::parse_and_run(char buffer[], int len)
{
	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 ;
	for (unsigned int i=0;i<sizeof(commands)/sizeof(Tcommand);i++)
	{
		if (strcmp(commands[i].func_name,argv[0]) == 0)
		{
			commands[i].func(argc,argv);
			return ;
		}
	}
	if (argc == 1)
	{
		int value = get_number_10(argv[0],16);
		if (value != -1)
		{
			printf("\n   ");
			pc_decode((word)value);
			return ;
		}
		else 
		{
			printf ("\n Unknown control identifier `%s'.\n",argv[0]);
			return ;
		}
	}
	printf("\n  ->Unknown command. Use ``help'' to list commands.\n");
}

void Tconsole::work()
{
	char *com;
	int cur = 0;
	int len = 0;
	char ch;
	char buffer[LimitConsoleBuffer+1];
	buffer[len] = '\0';
	printf(">>");
	while (true)
	{
		ch = getch();
		if (ch == 8)
		{
			if (cur != 0)
			{
				if (cur == len)
				{
					cur --;
					buffer[--len] = '\0';
					gotoxy_cur(-1);
					printf(" ");
					gotoxy_cur(-1);
				}
				else
				{
					memcpy(&buffer[cur-1],&buffer[cur],len-cur);
					buffer[--len] = '\0';
					printf("\b%s ",&buffer[--cur]);
					gotoxy_cur(cur-len-1);
				}
			}
		}
		else if (ch == -32)
		{
			ch = getch();
			switch (ch)
			{
			case 75: //left
				if (cur != 0)
				{
					cur --;
					gotoxy_cur(-1);
				}
				break;
			case 77: //right
				if (cur != len)
				{
					cur ++;
					gotoxy_cur(1);
				}
				break;
			case 72: //up
				if (curcom != 0)
				{
					for(int i=0;i<len;i++)
						buffer[i] = ' ';
					gotoxy_cur(-cur);
					printf("%s",buffer);
					gotoxy_cur(-len);
					com = getcom(0);							
					cur = len = strlen(com);
					memcpy(buffer,com,len+1);
					printf("%s",buffer);
				}
				break;
			case 80: //down
				if (totalcom != 0 && curcom < totalcom-1)
				{
					for(int i=0;i<len;i++)
						buffer[i] = ' ';
					gotoxy_cur(-cur);
					printf("%s",buffer);
					gotoxy_cur(-len);
					com = getcom(1);							
					cur = len = strlen(com);
					memcpy(buffer,com,len+1);
					printf("%s",buffer);
				}
				break;
			case 71: //home
				gotoxy_cur(-cur);
				cur = 0;
				break;
			case 79: //end
				gotoxy_cur(len-cur);
				cur = len;
				break;
			case 83: //delete
				if (cur != len)
				{
					len--;
					memcpy(&buffer[cur],&buffer[cur+1],len-cur);
					buffer[len] = '\0';
					printf("%s ",&buffer[cur]);
					gotoxy_cur(cur-len-1);
				}
				break;
			}
		}
		else if (ch == 13)
		{
			if (len != 0)
			{
				addcom(buffer);
				parse_and_run(buffer,len);
			}
			else if (totalcom != 0)
			{
				com = getcom(2);
				len = strlen(com);
				memcpy(buffer,com,len+1);
				parse_and_run(buffer,len);
			}
			printf("\n>>");
			cur = len = 0;
			buffer[len] = '\0';
		}
		else if (ch == 27)
		{
			for (int i=0;i<len;i++)
				buffer[i] = ' ';
			gotoxy_cur(-cur);
			printf("%s",buffer);
			gotoxy_cur(-len);
			cur = len = 0;
			buffer[len] = '\0';
		}
		else
		{
			if ((ch <= 'z' && ch >= 'a') || (ch <= 'Z' && ch >= 'A') || (ch <= '9' && ch >= '0') || ch == ' ' || ch == '-' || ch == '.')
			{
				if (cur == len)
				{
					if (len != LimitConsoleBuffer)
					{
						cur ++;
						buffer[len++] = ch;
						buffer[len] = '\0';
						printf("%c",ch);
					}
				}
				else
				{
					if (len == LimitConsoleBuffer)
					{
						memcpy(&buffer[cur+1],&buffer[cur],len-cur-1);
						buffer[cur] = ch;
						printf("%s",&buffer[cur++]);
						gotoxy_cur(cur-len);
					}
					else
					{
						memcpy(&buffer[cur+1],&buffer[cur],len-cur);
						buffer[++len] = '\0';
						buffer[cur] = ch;
						printf("%s",&buffer[cur++]);
						gotoxy_cur(cur-len);
					}
				}
			}
		}
	}
}

int main ()
{
	init();
	Tconsole console;
	console.work();
	return 0;
}

⌨️ 快捷键说明

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