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

📄 graphic.c

📁 nucleus_arm.rar
💻 C
字号:
#include <support.h>
#include <stdio.h>
#include <video/graphic.h>
#include <video/graph.h>
#include <video/fonts.h>
#include <drivers/pci.h>
#include <drivers/timer.h>

unsigned int CRT_I = CRT_IM;
unsigned int CRT_D = CRT_DM;
unsigned int graphic_card = GR_UNKNOWN;

static GraphicDriver graphic_driver, real_driver;

char GraphicMode(void)
{
	outportb(GRA_I, 0x06);
	return (inportb(GRA_D) & 0x01);
}

void GetCRTC(void)
{
	if (inportb(MIS_R) & 1)
		CRT_I = CRT_IC;
	else
		CRT_I = CRT_IM;
	CRT_D = CRT_I + 1;
}

char set_mode(unsigned int mode)
{
	char res = -1;
	
	if (graphic_driver.SetMode != NULL)
	{
		// screen off
		if (graphic_card > GR_EGA)
		{
		    outportb(SEQ_I, 0x01);
	    	outportb(SEQ_D, inportb(SEQ_D) | 0x20);
		}
		// Disable video output
		(void)inportb(IS1_RC);
		delay(10);
		outportb(ATT_I, 0x00);
		
		// vertical retrace
		while (((inportb(IS1_RC)) & 0x08) == 0x08 );
		while (((inportb(IS1_RC)) & 0x08) == 0 ); 
	   		
		res = graphic_driver.SetMode(mode);
		
		// screen on
		if (graphic_card > GR_EGA)
		{
	    	outportb(SEQ_I, 0x01);
	    	outportb(SEQ_D, inportb(SEQ_D) & 0xDF); 
	  	}
  		// enable video output 	
		(void)inportb(IS1_RC);
		delay(10);
		outportb(ATT_I, 0x20);

		clrscr();	
	}
	return res;
}

void putch(unsigned int x, unsigned int y, unsigned char b)
{
	if (graphic_driver.WriteChar != NULL)
		graphic_driver.WriteChar(x, y, b);
}

unsigned int wherex(void)
{
	if (graphic_driver.GetX != NULL)
		return graphic_driver.GetX();
	return 0;
}

unsigned int wherey(void)
{
	if (graphic_driver.GetY != NULL)
		return graphic_driver.GetY();
	return 0;
}

void gotoxy(unsigned int x, unsigned int y)
{
	if (graphic_driver.GotoXY != NULL)
		graphic_driver.GotoXY(x, y);
}

void clrscr(void)
{
	if (graphic_driver.ClrScr != NULL)
		graphic_driver.ClrScr();
}

unsigned int max_x(void)
{
	if (graphic_driver.GetMaxX != NULL)
		return graphic_driver.GetMaxX();
	return 0;
}

unsigned int max_y(void)
{
	if (graphic_driver.GetMaxY != NULL)
		return graphic_driver.GetMaxY();
	return 0;
}

void scroll(unsigned int lines)
{
	if (graphic_driver.Scroll != NULL)
		graphic_driver.Scroll(lines);
}

int Init_Graphic(void)
{
	if (GraphicMode())
		printf("graphic: graphic mode active\n\r");
//	if (Check_3dfx(&real_driver))		return GR_3Dfx;
//	if (Check_3dlabs(&real_driver))		return GR_3DLabs;
//	if (Check_Acer(&real_driver))		return GR_Acer;
//	if (Check_Ahead(&real_driver))		return GR_Ahead;
//	if (Check_ALG(&real_driver))		return GR_ALG;
//	if (Check_Alliance(&real_driver))	return GR_Alliance;
//	if (Check_Ark(&real_driver))		return GR_Ark;
//	if (Check_Ati(&real_driver))		return GR_Ati;
//	if (Check_Cirrus(&real_driver))		return GR_Cirrus;
//	if (Check_Compaq(&real_driver))		return GR_Compaq;
//	if (Check_Cyrix(&real_driver))		return GR_Cyrix;
//	if (Check_Genoa(&real_driver))		return GR_Genoa;
//	if (Check_HiQ(&real_driver))		return GR_HiQ;
//	if (Check_HMC(&real_driver))		return GR_HMC;
//	if (Check_Imagine(&real_driver))	return GR_Imagine;
//	if (Check_Mach32(&real_driver))		return GR_Mach32;
//	if (Check_Mach64(&real_driver))		return GR_Mach64;
//	if (Check_MXIC(&real_driver))		return GR_MXIC;
//	if (Check_NCR(&real_driver))		return GR_NCR;
//	if (Check_NeoMagic(&real_driver))	return GR_NeoMagic;
//	if (Check_Nvidia(&real_driver))		return GR_Nvidia;
//	if (Check_OAK(&real_driver))		return GR_OAK;
//	if (Check_OPTi(&real_driver))		return GR_OPTi;
//	if (Check_Paradise(&real_driver))	return GR_Paradise;
//	if (Check_P2000(&real_driver))		return GR_P2000;
//	if (Check_Realtek(&real_driver))	return GR_Realtek;
//	if (Check_Rendition(&real_driver))	return GR_Rendition;
//	if (Check_Sierra(&real_driver))		return GR_Sierra;
//	if (Check_Sigma(&real_driver))		return GR_Sigma;
//	if (Check_SiS(&real_driver))		return GR_SiS;
//	if (Check_SMOS(&real_driver))		return GR_SMOS;
//	if (Check_S3(&real_driver))			return GR_S3;
//	if (Check_Trident(&real_driver))	return GR_Trident;
//	if (Check_TSENG(&real_driver))		return GR_TSENG;
//	if (Check_UMC(&real_driver))		return GR_UMC;
//	if (Check_Video7(&real_driver))		return GR_Video7;
	if (Check_VGA(&real_driver))		return GR_VGA;
	return 0x00;
}

void get_char_graph(unsigned char ch, unsigned int * chardata)
{
	int i;

	outportw(0x3C4, 0x0402);
	outportw(0x3C4, 0x0704);
	outportw(0x3CE, 0x0204);
	outportw(0x3CE, 0x0005);
	outportw(0x3CE, 0x0006);
	for (i=0; i<16; i++)
		_dosmemgetw(0xB8000 + (ch << 5), 1, &chardata[i]);
	outportw(0x3C4, 0x0302);
	outportw(0x3C4, 0x0304);
	outportw(0x3CE, 0x0004);
	outportw(0x3CE, 0x1005);
	outportw(0x3CE, 0x0E06);
}

void set_char_graph(unsigned char ch, unsigned int * chardata)
{
	int i;

	outportw(0x3C4, 0x0402);
	outportw(0x3C4, 0x0704);
	outportw(0x3CE, 0x0204);
	outportw(0x3CE, 0x0005);
	outportw(0x3CE, 0x0006);
	for (i=0; i<16; i++)
		_dosmemputw(&chardata[i], 1, 0xB8000 + (ch << 5));
	outportw(0x3C4, 0x0302);
	outportw(0x3C4, 0x0304);
	outportw(0x3CE, 0x0004);
	outportw(0x3CE, 0x1005);
	outportw(0x3CE, 0x0E06);
}

void graphic_info(void)
{
	if (real_driver.WriteChar == NULL || real_driver.GotoXY == NULL || 
		real_driver.GetX == NULL || real_driver.GetY == NULL || 
		real_driver.Scroll == NULL || real_driver.ClrScr == NULL)
	{
		if (real_driver.DetectName != NULL && real_driver.DetectMemory != NULL)
		{
			printf("graphic: Found card: %s (%dKB)\n", real_driver.DetectName(), real_driver.DetectMemory());
			printf("graphic: Found supported card, but not all functions supported by driver now.\n");
		}
	}
	printf("graphic: %s (%dKB)\n", graphic_driver.DetectName(), graphic_driver.DetectMemory());
}

char graphic_init(void)
{
	graphic_card = GR_VGA;
	graphic_driver = vga_driver;
	GetCRTC();
	
	if (CheckPCI())
		printf("graphic: PCI configuration type %d (%d devices)", cfg_mech, cfg_max);
	graphic_card = Init_Graphic();
	if (real_driver.WriteChar == NULL || real_driver.GotoXY == NULL || 
		real_driver.GetX == NULL || real_driver.GetY == NULL || 
		real_driver.Scroll == NULL || real_driver.ClrScr == NULL)
	{
		printf("graphic: Found supported card, but not all functions supported by driver now.\n");
		printf("         Switching to text mode driver.\n");
	}
	else
	{
		graphic_driver = real_driver;
		set_mode(0x12);
	}
	return 0;
}
// TODO:
// modes: 0x04, 0x05,  0x07 (strange), 0x0F, 0x10 (wrong font), 0x11, 0x13

⌨️ 快捷键说明

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