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

📄 lfb.c

📁 一个完整的GUI界面OS,单盘启动 实现了多线程、FAT32文件读写
💻 C
字号:
#include "GRUB.h"
#include "VBE.h"


static unsigned int  LFBWidth;
static unsigned int  LFBHeight;
static unsigned int  LFBDepth;
static unsigned int  LFBType;
static unsigned long LFBPtr;
static unsigned int  LFBScanline;


unsigned short  VESA_X_MAX;
unsigned short  VESA_Y_MAX;
unsigned long   *VGAMEM;
unsigned long   BG_COLOR=0x000000;

#define ASC_WIDTH                      8
#define CHS_WIDTH                      16
#define SPACING                        2
#define CHAR_HEIGHT                    16

#define ASC_NUM 256
extern unsigned char ASC[ASC_NUM][CHAR_HEIGHT];


//------------------------------------------------------------------------------------------------------------------------------//// VESA图形驱动画点例程////------------------------------------------------------------------------------------------------------------------------------
void VesaPutPixel(unsigned short x,unsigned short y,unsigned long color)
{
	VGAMEM[y*VESA_X_MAX+x]=color;
}


//----------------------------------------------------------------------------------------------------------------------------//// VESA图形驱动输出ASCII字符例程////----------------------------------------------------------------------------------------------------------------------------
void VesaOutAsc(unsigned short x, unsigned short y, unsigned char ch, unsigned long color)
{
    register int i,j;
    for (i = 0; i < CHAR_HEIGHT; i++)
	  for (j=0;j<ASC_WIDTH;j++)
	  if((ASC[ch][i]>>(ASC_WIDTH-j-1))&1)
	  VesaPutPixel(x+j,y+i,color);
}

//----------------------------------------------------------------------------------------------------------------------------//// 核心图形驱动输出字符串例程////----------------------------------------------------------------------------------------------------------------------------
void VesaTextOut(unsigned short x,unsigned short y,char * str,unsigned long color)
{
	 int i=0;
	 char *p=str;
	 while(*p!='\0')
	 {           
		VesaOutAsc(x+i,y,*p++,color);          
		i+=8;
	 }
}


//----------------------------------------------------------------------------------------------------------------------------//// VESA显卡初始化////----------------------------------------------------------------------------------------------------------------------------
int LFBInit(GrubInfo* info)
{
	  unsigned long  *LFBAddr = (unsigned long *) 0x80228;
	  unsigned long i,ScreenSize;

	  struct VBEMode          *mode_info = (struct VBEMode*)       info->vbe_mode_info;
    struct VBEController    *control=    (struct VBEController*) info->vbe_control_info;

    if (control->version < 0x0200)
    {
      return 0;
    }

   if (CHECK_GRUB(info->flags,11)){
	    LFBWidth  =  mode_info->x_resolution;
	    LFBHeight =  mode_info->y_resolution;
	    LFBDepth  =  mode_info->bits_per_pixel;
	    LFBType   =  0;

			VESA_X_MAX=LFBWidth;
			VESA_Y_MAX=LFBHeight;

        if(control->version >= 0x0300)
                LFBScanline = mode_info->linear_bytes_per_scanline;
		else
		            LFBScanline = mode_info->bytes_per_scanline;

	    LFBPtr = mode_info->phys_base;

			*LFBAddr=LFBPtr;

			VGAMEM = (unsigned long *)LFBPtr;
  
			ScreenSize = VESA_X_MAX * VESA_Y_MAX;
	    for(i = 0; i < ScreenSize; i++) VGAMEM[i] = BG_COLOR;
        
    
   }
   else	{
	    LFBWidth  =  LFBHeight = LFBDepth = 0;
		  LFBType   = 0;
	    LFBPtr    = 0;
		  return 0;
	}

	 return 1;

}

⌨️ 快捷键说明

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