//设置屏幕的起始位置
static void set_screen_origin(unsigned char flag)
{
if( flag )
cli();
outb_p(12, REG_PORT);
outb_p(0xff&((g_screen_origin - DISP_BASE_ADDR) >> 9), VALUE_PORT);
outb_p(13, REG_PORT);
outb_p(0xff &((g_screen_origin - DISP_BASE_ADDR)>>1), VALUE_PORT);
if( flag )
sti();
}
void clear_screen(unsigned color)
{
unsigned char *p;
unsigned short i;
unsigned int length = ( g_screen_bottom -g_screen_top) * BYTES_FOR_ONE_LINE;
p = (unsigned char *)g_screen_origin;
for(i = 0; i < length;i++) {
*p++ = ' ';
*p++ = color;
}
return;
}
inline void gotoxy(unsigned int new_x,unsigned int new_y)
{
//确保坐标在合理范围内
if (new_x > DISP_MAX_X || new_y >= DISP_MAX_Y)
return;
/*刷新x,y坐标和显示内存中位置偏移。
y表示行号,x表示列号(x<<1)的目的:是一个字符+颜色占据两个字节。
*/
g_x=new_x;
g_y=new_y;
g_position=g_screen_origin + g_y*BYTES_FOR_ONE_LINE + (g_x<<1);
}
//在(g_x,g_y)坐标处设定光标
inline void set_cursor(unsigned char flag)
{
if( flag)
cli();
outb_p(14, REG_PORT);
outb_p(0xff&((g_position-DISP_BASE_ADDR)>>9), VALUE_PORT);
outb_p(15, REG_PORT);
outb_p(0xff&((g_position-DISP_BASE_ADDR)>>1), VALUE_PORT);
if( flag )
sti();
}
void console_init(void)
{
/*设置屏幕的起始位置*/
(void)set_screen_origin(0);
/*清屏*/
(void)clear_screen(DISP_FG_WHITE + DISP_BG_BLACK);
(void)gotoxy(0, 0);
/*设置光标*/
(void)set_cursor(0);
}
我的学习之旅(18)console.h和console.c
最新推荐文章于 2022-09-21 11:21:50 发布