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

📄 talk.x

📁 一个用自己写的编译器编译的操作系统内核. 有包含中断和不包含中断两个版本. 还有简单的用户应用程序。 因为该代码原目的是下载到硬件上使用
💻 X
字号:
const		int			limit		=		200;
const		int			limitbuffer	=		70;

char[limit] outputmem, tempinput;
char* inputmem;
char[limitbuffer] buffer;

int outputstart, inputstart;

void sys_putchar(char c)
{
	%asm {
		%writereg("r2", c);
		%asm("LI", "r0", "1");
		%asm("INT", "3");
		%asm("BNEZ", "r1", "-2");
		%asm("NOP");
	};
}

void puts(char *s)
{
	int i;
	for (i=0;*(s+i)!=0;i++)
		sys_putchar(s[i]);
}

void puthex(int num)
{
	int i,j;
	for (i=0;i<4;i++)
	{
		j = ((num & 0xF000) >> 12);
		num = (num << 4);
		if (j < 10)
			sys_putchar((char)(j+48));
		else sys_putchar((char)(j+55));
	}
}

int sys_getchar()
{
	int ret;
	%asm {
		%asm("LI", "r0", "2");
		%asm("INT", "3");
		%asm("BNEZ", "r1", "-2");
		%asm("NOP");
		%readreg("r2", ret);
	};
	sys_putchar((char) ret);
	return ret;
}

int getchar(char* c)
{
	int ret, retch;
	%asm {
		%asm("LI", "r0", "2");
		%asm("INT", "3");
		%readreg("r1", ret);
		%readreg("r2", retch);
	};
	*c = (char) retch;
	return (int)(ret == 0);
}

int gethex()
{
	char ch;
	while ((ch = (char)sys_getchar()) <= 32);
	int ret; ret = 0;
	while (ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'F')
	{
		ret = (ret << 4);
		if (ch >= '0' && ch <= '9')
			ret = ret + (int)ch - 48;
		else
			ret = ret + (int)ch - 55;
		ch = (char)sys_getchar();
	}
	return ret;
}

int main()
{
	int i, cnt;
	for (i = 0; i < limit; i ++) outputmem[i] = (char)0;
	outputstart = 0; inputstart = 0;
	puts("My uID = "); puthex((int)&outputmem);
	puts("\nInput uID of correspondent = "); inputmem = (char *) gethex();
	puts(">>"); buffer[i = 0] = (char)0;
	while (1)
	{
		char ch;
		if (getchar(&ch))
		{
			if (ch != '\n')
			{
				if (ch == 8)
				{
					if (i != 0)
					{
						i --;
						sys_putchar((char)8);
						sys_putchar(' ');
						sys_putchar((char)8);
						buffer[i] = (char)0;
					}
				}
				else
				{
					if (i < limitbuffer - 1)
					{
						sys_putchar(ch);
						buffer[i++] = ch;
						buffer[i] = (char)0;
					}
				}
			}
			else if (i != 0)
			{
				int j; 
				j = outputstart; cnt = 0;
				for (; buffer[cnt]; cnt ++)
				{
					outputmem[j] = (char)0;
					j ++;
					if (j == limit) j = 0;
				};
				outputmem[j] = (char)0; outputstart = j;
				for (; cnt > 0; )
				{
					cnt --;
					if (j == 0) j = limit - 1; else j --;
					outputmem[j] = buffer[cnt];
				}
				puts("\nSend : ");
				puts(buffer);
				puts("\n>>");
				buffer[i = 0] = (char)0;
			}
		}
		if (inputmem[inputstart] != 0)
		{
			int j;
			cnt = 0; j = inputstart;
			for (; inputmem[j] && cnt < limit; cnt ++)
			{
				tempinput[cnt] = inputmem[j];
				j ++;
				if (j == limit) j = 0;
			}
			inputstart = j;
			tempinput[cnt] = (char)0;
			puts("\nReceived : ");
			puts(tempinput);
			puts("\n>>");
			puts(buffer);
		}
	}
}

⌨️ 快捷键说明

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