📄 vga.c
字号:
#include <arch.h>
//vga 内部函数
void kputc(uchar c,uchar color,int x,int y);
//global var
int g_row=5, //row
g_col=0; //col
char g_color=INIT_COLOR;
void live()
{
//int i;
linehome();
// for(i=0;i<80;i++)
kprintf("-");
delay();
linehome();
//for(i=0;i<80;i++)
kprintf("\\");
delay();
linehome();
//for(i=0;i<80;i++)
kprintf("|");
delay();
linehome();
//for(i=0;i<80;i++)
kprintf("/");
delay();
}
/*
* 清屏 只适用 80x25 模式
*/
void clear()
{
int x=0,y=0;
setcolor(0);
for(;x<25;x++)
{
for(y=0;y<80;y++)
kputc(0,0,x,y);
}
}
/* 设置当前字体颜色属性*/
void setcolor(uchar color)
{
g_color=color;
}
/* 换行 */
void newline()
{
if(g_row>=24)
g_row=0;
else
g_row++;
g_col=0;
}
/* 只是回车*/
void linehome()
{
g_col = 0;
}
/*
* 在屏幕的当前位置显示字符串
*/
#if 0
void kprintf(uchar *str)
{
int i=0;
while(str[i] != 0)
{
if(str[i]!=0)
/* //not use color rotate
if(g_color>=15)
g_color-=15;
if(g_color==0)
g_color++;
g_color++;
*/
kputc(str[i++],g_color,g_row,g_col++);
//if(g_row == 24)
// g_col=0,g_row=0;
if(g_col == 79)
newline();
cursor((ushort)g_row,(ushort) g_col);
}
}
#endif
void vga_puts(char *str, int c)
{
int i=0;
for(;i<c;i++)
{
if(str[i]=='\r')
{ g_col=0; goto ss;}
if(str[i]=='\n')
{ g_row++; goto ss;;}
kputc(str[i],g_color,g_row,g_col++);
ss:
if(g_row == 24)
g_col=0,g_row=0;
if(g_col == 79)
newline();
cursor((ushort)g_row,(ushort) g_col);
}
}
/*
文本驱动 kprint
把字符 c 以 颜色color 放在
行 : x (0...24 )
列 : y (0...79 )
处. (只适用于文本模式 80*25)
*/
void kputc(uchar c,uchar color,int x,int y)
{
/* 指针 p 指向显存 */
uchar *p = (uchar*)0xc00b8000;
/* 计算行位置*/
p += 2*x*80+y*2;
/*放入显存 */
*p = c;
*(p+1) = color;
}
void cursor(int row, int col)
{
ushort offset =col +row*80;
outb(VGA_CTL+0, 14); //msb of offset CRTC reg 14
outb(VGA_CTL+1, offset>>8);
outb(VGA_CTL+0, 15); //lsb of offset to crtc reg 15
outb(VGA_CTL+1, offset);
}
void rawvga_init()
{
g_row=5, //row
g_col=0; //col
g_color=INIT_COLOR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -