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; }
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; } } }
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; } } }