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

📄 console.c

📁 很好的一个微型操作系统源码
💻 C
字号:
#include <platform.h>
#include <device.h>

#define CONSOLE_WIDTH 80
#define CONSOLE_HEIGHT 25
#define CONSOLE_BASSADDR 0xB8000
#define CONSOLE_DEFAULTATTRIB 0x700

int32 console_init();
pvoid console_open(int8 *path);
void console_close(pvoid device);
int32 console_write(pvoid device, uint8 *inbuf, uint32 size);
int32 console_read(pvoid device, uint8 *inbuf, uint32 size);
int32 console_ioctrl(pvoid device, uint32 command, uint8 *inbuf, uint32 insize, uint8 *outbuf, uint32 *outsize);
int32 console_status(pvoid device);

struct driver_object console_driver_object={
	console_init, 
	console_open,
	console_close,
	console_write,
	console_read,
	console_ioctrl,
	console_status,
	"console"
};

struct device_object console_device_object={
	&console_driver_object,
	NULL
};

pvoid stdout = &console_device_object;

int32 console_attrib = CONSOLE_DEFAULTATTRIB;
uint16* console_base = (uint16*)CONSOLE_BASSADDR;
int32 console_cursor = 0;

void console_setcursor(int cursor)
{
	_out(0x3d4, 14);
	_out(0x3d5, (uint8)(cursor>>8));
	_out(0x3d4, 15);
	_out(0x3d5, (uint8)cursor);
	console_cursor=cursor;
}

int32 console_init()
{
	console_setcursor(0);
	console_attrib=CONSOLE_DEFAULTATTRIB;
	return 1;
}

pvoid console_open(int8 *path)
{
	return &console_device_object;
}

void console_close(pvoid device)
{
}

void console_newline()
{
	int x=console_cursor % CONSOLE_WIDTH;
	int y=console_cursor / CONSOLE_WIDTH;

	if(y+1>=CONSOLE_HEIGHT)
	{
		uint32 *p1=(uint32 *)(CONSOLE_BASSADDR);
		uint32 *p2=(uint32 *)(CONSOLE_BASSADDR+160);
		while(p1<(uint32 *)(CONSOLE_BASSADDR+(CONSOLE_HEIGHT-1)*160))
			*p1++=*p2++;

		while(p1<(uint32 *)(CONSOLE_BASSADDR+CONSOLE_HEIGHT*160))
			*p1++ = (console_attrib<<16) + console_attrib;
		console_setcursor((CONSOLE_HEIGHT-1)*80);
	}else
	{
		y++;
		console_setcursor(y * CONSOLE_WIDTH);
	}
}

int32 console_write(pvoid device, uint8 *outbuf, uint32 size)
{
	char* c=(char*)outbuf;
	uint32 i;

	for(i=0;i<size;i++)
	{
		switch(*c)
		{
		case '\r':
			break;
		case '\n':
			console_newline();
			break;
		case '\t':
		{
			int t=(console_cursor+8) & 0xf8;
			if(t>=CONSOLE_WIDTH)
				console_newline();
			else
				console_setcursor(t);
			break;
		}
		case '\b':
			if(console_cursor)
			{
				console_setcursor(console_cursor-1);
				console_base[console_cursor] = console_attrib;
			}
			break;
		default:
			console_base[console_cursor] = *c + console_attrib;
			if((console_cursor+1) % CONSOLE_WIDTH == 0)
			{
				console_newline();
			}else
				console_setcursor(console_cursor+1);
			break;
		}
		c++;
	}
	return 0;
}

int32 console_read(pvoid device, uint8 *inbuf, uint32 size)
{
	return 0;
}

int32 console_ioctrl(pvoid device, uint32 command, uint8 *inbuf, uint32 insize, uint8 *outbuf, uint32 *outsize)
{
	return 0;
}

int32 console_status(pvoid device)
{
	return 0;
}

⌨️ 快捷键说明

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