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

📄 helper.c

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

void port_out(int value, int port)
{
	outportb(port, value);
}

void port_outw(int value, int port)
{
	outportw(port, value);
}

void port_outl(int value, int port)
{
	outportd(port, value);
}

int port_in(int port)
{
	return inportb(port);
}

int port_inw(int port)
{
	return inportw(port);
}

int port_inl(int port)
{
	return inportd(port);
} 

void graphic_delay(void)
{
	delay(10);
}

void getbios(char * tmp, unsigned int start, unsigned int len)
{
	int i;

	len = (len <= 100) ? len : 100;
	for (i=start; i<start+len; i++)
		tmp[i] = *(char *)(0xA0000 + start);
	tmp[len+1] = '\0';
}

// Wait for vertical retrace
void wait_retrace(void)
{
	return;

	// Wait for vertical retrace to end
	while ((inportb(IS1_RC) & 0x08) != 0);
	// Wait for vertical retrace to begin
	while ((inportb(IS1_RC) & 0x08) == 0);
}

// bugfixes:
// - changed CRT_I to CRT_IC
void write_regs(unsigned char *regs)
{
	unsigned i;

	if (graphic_card > GR_EGA)
	{	
		// Wait for vertical retrace
		wait_retrace();

    	/* update misc output register */
    	//printf("%04X %02X  -", MIS_W, regs[MIS]);
		outportb(MIS_W, regs[MIS]);

		/* synchronous reset on */
		outportb(SEQ_I, 0x00);
		outportb(SEQ_D, 0x01);    	

		/* write sequencer registers */
		outportb(SEQ_I, 0x01);
		outportb(SEQ_D, regs[SEQ + 1] | 0x20);
    	//printf("\nSEQ\n");
		for (i = 2; i < SEQ_C; i++)
		{
			outportb(SEQ_I, i);
			outportb(SEQ_D, regs[SEQ + i]);
	    	//printf("%04X %02X  -", SEQ_D, regs[SEQ+i]);	
		}

		/* synchronous reset off */
		outportb(SEQ_I, 0x00);
		outportb(SEQ_D, 0x03); 

		/* deprotect CRT registers 0-7 */
		outportb(CRT_IC, 0x11);
		i = inportb(CRT_DC);		
		outportb(CRT_IC, 0x11);
		outportb(CRT_DC, i & 0x7F);
    
    	//printf("\nCRT\n");
		/* write CRT registers */
		for (i = 0; i < CRT_C; i++)
		{
			outportb(CRT_IC, i);
			outportb(CRT_DC, regs[CRT + i]);
	    	//printf("%04X %02X  -", CRT_DC, regs[CRT+i]);
		}

    	//printf("\nGRA\n");
		/* write graphics controller registers */
		for (i = 0; i < GRA_C; i++)
		{
			outportb(GRA_I, i);
			outportb(GRA_D, regs[GRA+i]);
	    	//printf("%04X %02X  -", GRA_D, regs[GRA+i]);
		}

		/* write attribute controller registers */
    	//printf("\nATT\n");
		for (i = 0; i < ATT_C; i++)
		{
			(void)inportb(IS1_RC);			graphic_delay();
			outportb(ATT_I, i);				graphic_delay();
			outportb(ATT_I, regs[ATT+i]);	graphic_delay();
	    	//printf("%04X %02X  -", ATT_I, regs[ATT+i]);	
		}
	}
}

⌨️ 快捷键说明

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