Пример #1
0
static void flash_write(uint32_t addr, uint8_t val, void *p)
{
        flash_t *flash = (flash_t *)p;
	int is_ami = ((romset == ROM_REVENGE) || (romset == ROM_PLATO) || (romset == ROM_ENDEAVOR));
	int has_dmi = ((romset == ROM_430HX) || (romset == ROM_430VX) || (romset == ROM_430TX) || (romset == ROM_440FX) || (romset == ROM_KN97));
	int is_bxb = ((romset == ROM_ACERV35N) || (romset == ROM_ACERV12LC));
#ifndef RELEASE_BUILD
        pclog("flash_write : addr=%08x val=%02x command=%02x %04x:%08x\n", addr, val, flash->command, CS, pc);        
#endif
        switch (flash->command)
        {
                case CMD_ERASE_SETUP:
                if (val == CMD_ERASE_CONFIRM)
                {
#ifndef RELEASE_BUILD
                        pclog("flash_write: erase %05x\n", addr & 0x1ffff);
#endif
			if (is_ami)
			{
	                        if ((addr & 0x1f000) == 0x0d000)
	                                memset(&rom[0x0d000], 0xff, 0x1000);
	                        if ((addr & 0x1f000) == 0x0c000)
	                                memset(&rom[0x0c000], 0xff, 0x1000);
			}
			else
			{
				if (is_bxb)
				{
		                        if ((addr & 0x1f000) == 0x2000)
       			                        memset(&rom[0x2000], 0xff, 0x1000);
		                        if ((addr & 0x1f000) == 0x3000)
        		                        memset(&rom[0x3000], 0xff, 0x1000);
	        	                if ((addr & 0x1f000) > 0x3fff)
        	        	        {
                	        	        memset(rom + 0x4000, 0xff, 0x1c000);
	                        	}
				}
				else
				{
					if (has_dmi)
					{
			                        if ((addr & 0x1f000) == 0x1c000)
        			                        memset(&rom[0x1c000], 0xff, 0x1000);
					}
		                        if ((addr & 0x1f000) == 0x1d000)
        		                        memset(&rom[0x1d000], 0xff, 0x1000);
	        	                if ((addr & 0x1f000) < 0x1c000)
        	        	        {
                	        	        memset(rom, 0xff, 0x1c000);
	                        	}
				}
			}
       	                flash->status = 0x80;
                }
                flash->command = CMD_READ_STATUS;
                break;
                
                case CMD_PROGRAM_SETUP:
#ifndef RELEASE_BUILD
                pclog("flash_write: program %05x %02x\n", addr & 0x1ffff, val);
#endif
		if (is_ami)
		{
			if ((addr & 0x1e000) == 0xc000)
			{
	                        rom[addr & 0x1ffff] = val;
			}
		}
		else
		{
			if (is_bxb)
			{
				if ((addr & 0x1f000) == 0x2000)
				{
	        	                rom[addr & 0x1ffff] = val;
				}
				if ((addr & 0x1f000) == 0x3000)
				{
	        	                rom[addr & 0x1ffff] = val;
				}
			}
			else
			{
				if (has_dmi)
				{
					if ((addr & 0x1f000) == 0x1c000)
					{
		        	                rom[addr & 0x1ffff] = val;
					}
				}
				if ((addr & 0x1f000) == 0x1d000)
				{
	        	                rom[addr & 0x1ffff] = val;
				}
			}
		}
                flash->command = CMD_READ_STATUS;
                flash->status = 0x80;
                break;
                
                default:
                flash->command = val;
                switch (val)
                {
                        case CMD_CLEAR_STATUS:
                        flash->status = 0x80;
                        break;
                                
                        case CMD_IID:
                        case CMD_READ_STATUS:
                        mem_mapping_disable(&bios_mapping[0]);
                        mem_mapping_disable(&bios_mapping[1]);
                        mem_mapping_disable(&bios_mapping[2]);
                        mem_mapping_disable(&bios_mapping[3]);
                        mem_mapping_disable(&bios_mapping[4]);
                        mem_mapping_disable(&bios_mapping[5]);
                        mem_mapping_disable(&bios_mapping[6]);
                        mem_mapping_disable(&bios_mapping[7]);

                        mem_mapping_disable(&bios_high_mapping[0]);
                        mem_mapping_disable(&bios_high_mapping[1]);
                        mem_mapping_disable(&bios_high_mapping[2]);
                        mem_mapping_disable(&bios_high_mapping[3]);
                        mem_mapping_disable(&bios_high_mapping[4]);
                        mem_mapping_disable(&bios_high_mapping[5]);
                        mem_mapping_disable(&bios_high_mapping[6]);
                        mem_mapping_disable(&bios_high_mapping[7]);

                        mem_mapping_enable(&flash->read_mapping);                        
                        mem_mapping_enable(&ext_read_mapping);                        
                        break;
                        
                        case CMD_READ_ARRAY:
			if ((is_ami || is_bxb) || (romset == ROM_430HX) || (romset == ROM_430TX) || (romset == ROM_KN97))
			{
                        	mem_mapping_enable(&bios_mapping[0]);
                	        mem_mapping_enable(&bios_mapping[1]);
        	                mem_mapping_enable(&bios_mapping[2]);
	                        mem_mapping_enable(&bios_mapping[3]);
			}
			else
			{
                        	mem_mapping_disable(&bios_mapping[0]);
                	        mem_mapping_disable(&bios_mapping[1]);
        	                mem_mapping_disable(&bios_mapping[2]);
	                        mem_mapping_disable(&bios_mapping[3]);
			}
                        mem_mapping_enable(&bios_mapping[4]);
                        mem_mapping_enable(&bios_mapping[5]);
                        mem_mapping_enable(&bios_mapping[6]);
                        mem_mapping_enable(&bios_mapping[7]);

			if (!is_ami)
			{
	                       	mem_mapping_enable(&bios_high_mapping[0]);
        	       	        mem_mapping_enable(&bios_high_mapping[1]);
       	        	        mem_mapping_enable(&bios_high_mapping[2]);
                        	mem_mapping_enable(&bios_high_mapping[3]);
	                        mem_mapping_enable(&bios_high_mapping[4]);
        	                mem_mapping_enable(&bios_high_mapping[5]);
                	        mem_mapping_enable(&bios_high_mapping[6]);
                        	mem_mapping_enable(&bios_high_mapping[7]);
			}

                        mem_mapping_disable(&flash->read_mapping);
                        mem_mapping_disable(&ext_read_mapping);
                        break;
                }
        }
}
Пример #2
0
static void flash_write(uint32_t addr, uint8_t val, void *p)
{
        flash_t *flash = (flash_t *)p;
	int q = ((romset == ROM_REVENGE) || (romset == ROM_ENDEAVOR));
//        pclog("flash_write : addr=%08x val=%02x command=%02x %04x:%08x\n", addr, val, flash->command, CS, pc);        
        switch (flash->command)
        {
                case CMD_ERASE_SETUP:
                if (val == CMD_ERASE_CONFIRM)
                {
//                        pclog("flash_write: erase %05x\n", addr & 0x1ffff);
			if (q)
			{
	                        if ((addr & 0x1f000) == 0x0d000)
        	                        memset(&rom[0x0d000], 0xff, 0x1000);
                	        /* if ((addr & 0x1f000) == 0x0c000)
                        	        memset(&rom[0x0c000], 0xff, 0x1000); */
	                        if ((addr & 0x1f000) < 0x0d000 || (addr & 0x1f000) >= 0x0e000)
        	                {
                	                memset(rom, 0xff, 0x0c000);
                        	        memset(&rom[0x0e000], 0xff, 0x12000);
	                        }
			}
			else
			{
	                        if ((addr & 0x1f000) == 0x1d000)
        	                        memset(&rom[0x1d000], 0xff, 0x1000);
                	        /* if ((addr & 0x1f000) == 0x1c000)
                        	        memset(&rom[0x1c000], 0xff, 0x1000); */
	                        if ((addr & 0x1f000) < 0x1d000 || (addr & 0x1f000) >= 0x1e000)
        	                {
                	                memset(rom, 0xff, 0x1d000);
                        	        memset(&rom[0x1e000], 0xff, 0x2000);
	                        }
			}
       	                flash->status = 0x80;
                }
                flash->command = CMD_READ_STATUS;
                break;
                
                case CMD_PROGRAM_SETUP:
                case CMD_PROGRAM_ALT_SETUP:
//                pclog("flash_write: program %05x %02x\n", addr & 0x1ffff, val);
                if ((addr & 0x1e000) != 0x0e000)
                        rom[addr & 0x1ffff] = val;
                flash->command = CMD_READ_STATUS;
                flash->status = 0x80;
                break;
                
                default:
                flash->command = val;
                switch (val)
                {
                        case CMD_CLEAR_STATUS:
                        flash->status = 0;
                        break;
                                
                        case CMD_IID:
                        case CMD_READ_STATUS:
                        mem_mapping_disable(&bios_mapping[0]);
                        mem_mapping_disable(&bios_mapping[1]);
                        mem_mapping_disable(&bios_mapping[2]);
                        mem_mapping_disable(&bios_mapping[3]);
                        mem_mapping_disable(&bios_mapping[4]);
                        mem_mapping_disable(&bios_mapping[5]);
                        mem_mapping_disable(&bios_mapping[6]);
                        mem_mapping_disable(&bios_mapping[7]);
			if (romset == ROM_440BX)
			{
                        	mem_mapping_disable(&bios_mapping[8]);
                	        mem_mapping_disable(&bios_mapping[9]);
        	                mem_mapping_disable(&bios_mapping[10]);
	                        mem_mapping_disable(&bios_mapping[11]);
                        	mem_mapping_disable(&bios_mapping[12]);
                	        mem_mapping_disable(&bios_mapping[13]);
        	                mem_mapping_disable(&bios_mapping[14]);
	                        mem_mapping_disable(&bios_mapping[15]);
			}
                        mem_mapping_enable(&flash->read_mapping);                        
                        break;
                        
                        case CMD_READ_ARRAY:
                        mem_mapping_enable(&bios_mapping[0]);
                        mem_mapping_enable(&bios_mapping[1]);
                        mem_mapping_enable(&bios_mapping[2]);
                        mem_mapping_enable(&bios_mapping[3]);
                        mem_mapping_enable(&bios_mapping[4]);
                        mem_mapping_enable(&bios_mapping[5]);
                        mem_mapping_enable(&bios_mapping[6]);
                        mem_mapping_enable(&bios_mapping[7]);
			if (romset == ROM_440BX)
			{
                        	mem_mapping_enable(&bios_mapping[8]);
                	        mem_mapping_enable(&bios_mapping[9]);
        	                mem_mapping_enable(&bios_mapping[10]);
	                        mem_mapping_enable(&bios_mapping[11]);
                        	mem_mapping_enable(&bios_mapping[12]);
                	        mem_mapping_enable(&bios_mapping[13]);
        	                mem_mapping_enable(&bios_mapping[14]);
	                        mem_mapping_enable(&bios_mapping[15]);
			}
                        mem_mapping_disable(&flash->read_mapping);
                        break;
                }
        }
}
Пример #3
0
void *intel_flash_init()
{
        FILE *f;
        flash_t *flash = malloc(sizeof(flash_t));
	int is_ami = ((romset == ROM_REVENGE) || (romset == ROM_PLATO) || (romset == ROM_ENDEAVOR));
	int has_dmi = ((romset == ROM_430HX) || (romset == ROM_430VX) || (romset == ROM_430TX) || (romset == ROM_440FX) || (romset == ROM_KN97));
	int is_bxb = ((romset == ROM_ACERV35N) || (romset == ROM_ACERV12LC));
        memset(flash, 0, sizeof(flash_t));

        mem_mapping_add(&flash->read_mapping,
       	            0xe0000, 
               	    0x20000,
       	            flash_read, NULL, NULL,
                    NULL, NULL, NULL,
               	    NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
        mem_mapping_add(&flash->write_mapping,
                    0xe0000, 
       	            0x20000,
       	            NULL, NULL, NULL,
                    flash_write, NULL, NULL,
       	            NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
        mem_mapping_add(&ext_read_mapping,
       	            0xfffe0000, 
               	    0x20000,
       	            flash_read, NULL, NULL,
                    NULL, NULL, NULL,
               	    NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
        mem_mapping_add(&ext_write_mapping,
                    0xfffe0000, 
       	            0x20000,
       	            NULL, NULL, NULL,
                    flash_write, NULL, NULL,
       	            NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
        mem_mapping_disable(&flash->read_mapping);
        mem_mapping_disable(&ext_read_mapping);

	if (!is_ami)
	{
		/* Non-AMI BIOS'es talk to the flash in high RAM. */
		if (romset != ROM_440FX)
		{
			mem_mapping_disable(&flash->write_mapping);
		}
		else
		{
			mem_mapping_set_addr(&flash->write_mapping, 0xf0000, 0x10000);
		}
		mem_mapping_enable(&ext_write_mapping);
	}
	else
	{
		/* AMI BIOS'es talk to the flash in low RAM. */
		mem_mapping_enable(&flash->write_mapping);
		mem_mapping_set_addr(&flash->write_mapping, 0xe0000, 0x20000);
		mem_mapping_disable(&ext_write_mapping);
	}

        flash->command = CMD_READ_ARRAY;
        flash->status = 0;
        
        memset(&rom[is_ami ? 0xd000 : (is_bxb ? 0x2000 : 0x1d000)], 0xFF, 0x1000);

	configure_path();
	fn = (char *) malloc(255);
	strcpy(fn, path);
	strcat(fn, "escd.bin");
        f = romfopen(fn, "rb");
        if (f)
        {
                fread(&rom[is_ami ? 0xd000 : (is_bxb ? 0x2000 : 0x1d000)], 0x1000, 1, f);
                fclose(f);
        }
	if (has_dmi || is_bxb)
	{
		strcpy(fn, path);
		strcat(fn, "dmi.bin");
	        f = romfopen(fn, "rb");
	        if (f)
	        {
	                fread(&rom[is_bxb ? 0x3000 : 0x1c000], 0x1000, 1, f);
	                fclose(f);
	        }
	}

	closed = 0;
        
        return flash;
}
Пример #4
0
void *intel_flash_init()
{
        FILE *f;
        flash_t *flash = malloc(sizeof(flash_t));
	int q = ((romset == ROM_REVENGE) || (romset == ROM_ENDEAVOR));
        memset(flash, 0, sizeof(flash_t));

	/* if (romset == ROM_440BX)
	{
	        mem_mapping_add(&flash->read_mapping,
        	            0x80000, 
                	    0x20000,
        	            flash_read, NULL, NULL,
	                    NULL, NULL, NULL,
                	    NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
	        mem_mapping_add(&flash->write_mapping,
	                    0x80000, 
        	            0x20000,
        	            NULL, NULL, NULL,
	                    flash_write, NULL, NULL,
        	            NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
	} */
        mem_mapping_add(&flash->read_mapping,
       	            0xe0000, 
               	    0x20000,
       	            flash_read, NULL, NULL,
                    NULL, NULL, NULL,
               	    NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
        mem_mapping_add(&flash->write_mapping,
                    0xe0000, 
       	            0x20000,
       	            NULL, NULL, NULL,
                    flash_write, NULL, NULL,
       	            NULL, MEM_MAPPING_EXTERNAL, (void *)flash);
        mem_mapping_disable(&flash->read_mapping);
        flash->command = CMD_READ_ARRAY;
        flash->status = 0;
        
        memset(&rom[q ? 0xd000 : 0x1d000], 0xFF, 0x1000);

	configure_path();
	fn = (char *) malloc(255);
	/* strcpy(fn, path);
	strcat(fn, "oemlogo.bin");
        f = romfopen(fn, "rb");
        if (f)
        {
                fread(&rom[0x1c000], 0x1000, 1, f);
                fclose(f);
        } */
	strcpy(fn, path);
	strcat(fn, "escd.bin");
        f = romfopen(fn, "rb");
        if (f)
        {
                fread(&rom[q ? 0xd000 : 0x1d000], 0x1000, 1, f);
                fclose(f);
        }
        
        return flash;
}