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

📄 vga.c

📁 从网上下载的一个自己编写的简单的操作系统源代码,对底层了解很有好处的
💻 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 + -