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

📄 ati.c

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

#define ATI_UNKNOWN 0x000
#define ATI_EGA     0x005
#define ATI_18800   0x010
#define ATI_18800_1 0x020
#define ATI_28800_2 0x030
#define ATI_28800_4 0x040
#define ATI_28800_5 0x050
#define ATI_28800_6 0x060

unsigned int ati_chip, ati_mem, ati_ioaddr;
char * ati_crt;

static char ati_test(void)
{
 	unsigned int w, tmp1;
    unsigned char tmp2;
    char bios[100];

    getbios(bios, 0x31, 9);
  	if (bios == "761295520")
        {
		_dosmemgetw((0xC000 << 4) + 0x40, 1, &tmp1);
		switch(tmp1)
		{
			case 0x3F33: //264CT
			case 0x3133:
	             		{
					ati_ioaddr = 0x1CE;
					w = rdinx(ati_ioaddr, 0xBB);
					switch(w & 15)
	                                {
						case 0: ati_crt = "EGA"; break;
						case 1: ati_crt = "Analog Monochrome"; break;
						case 2: ati_crt = "Monochrome"; break;
						case 3: ati_crt = "Analog Color"; break;
						case 4: ati_crt = "CGA"; break;
						case 6: ati_crt = ""; break;
						case 7: ati_crt = "IBM 8514/A"; break;
						default: ati_crt = "Multisync";
					}
                                	_dosmemgetb((0xC000 << 4) + 0x43, 1, &tmp2);
					switch(tmp2)
                                        {
						case 0x31: ati_chip = ATI_18800; break;
						case 0x32: ati_chip = ATI_18800_1; break;
						case 0x33: ati_chip = ATI_28800_2; break;
						case 0x34: ati_chip = ATI_28800_4; break;
						case 0x35:
						case 0x36:
                                                     	if ((rdinx(ati_ioaddr, 0xAA) & 15) == 6)
								ati_chip = ATI_28800_6;
							else
								ati_chip = ATI_28800_5;
							break;
                                                default: ati_chip = ATI_UNKNOWN;
					}
					switch(ati_chip)
                                        {
						case ATI_18800:
						case ATI_18800_1:
        						if (rdinx(ati_ioaddr, 0xBB) & 0x20)
								ati_mem = 512;
							break;
						case ATI_28800_2:
                                                     	if (rdinx(ati_ioaddr, 0xB0) & 0x10)
								ati_mem = 512;
							break;
						case ATI_28800_4:
						case ATI_28800_5:
						case ATI_28800_6:
                                                	{
                                                      		switch(rdinx(ati_ioaddr, 0xB0) & 0x18)
                                                                {
									case 0x00: ati_mem = 256; break;
									case 0x10: ati_mem = 512; break;
									case 0x08:
									case 0x18: ati_mem = 1024; break;
								}
                                                        } break;
					}
				} break;
			case 0x3233: ati_chip = ATI_EGA; break;
		}
	        return 1;
	}
	return 0;
}

static unsigned int ati_chiptype(void)
{
	return ati_chip;
}

static unsigned int ati_memory(void)
{
	return ati_mem;
}

static char * ati_get_name(void)
{
	switch(ati_chip)
        {
		case ATI_EGA     : return "ATI EGA";
		case ATI_18800   : return "ATI VGA Wonder 18800";
		case ATI_18800_1 : return "ATI VGA Wonder (18800-1)";
		case ATI_28800_2 : return "ATI VGA Wonder (28800-2)";
		case ATI_28800_4 : return "ATI VGA Wonder (28800-4)";
		case ATI_28800_5 : return "ATI VGA Wonder XL (28800-5)";
		case ATI_28800_6 : return "ATI VGA Wonder XL (28800-6)";
	}
	return "ATI Unknown";
}

static void ati_setbank(unsigned int bank)
{
	unsigned int x;

	if (current_bank == bank)
 		return;
	current_bank = bank;
	if (ati_chip == ATI_18800)
		modinx(ati_ioaddr, 0xB2, 0x1E, bank << 1);
	else
	{
		x = (bank & 15)*0x22;          //Roll bank nbr into bit 0
		wrinx(ati_ioaddr, 0xB2, HIBYTE(x) | LOBYTE(x));
	}
}

GraphicDriver ati_driver =
{
	ati_chiptype,
	ati_get_name,
	ati_memory,
	NULL,
	NULL,
	ati_setbank
};

char Check_Ati(GraphicDriver * driver)
{
	*driver = ati_driver;
	return (ati_test());
}

⌨️ 快捷键说明

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