From 8d8915e231790b23859aff8bb8db489bc10afb09 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 5 Dec 2017 20:49:12 +0100 Subject: [PATCH] Fixed the IBM PS/2 ESDI Fixed Disk Controller. --- src/disk/hdc_esdi_mca.c | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index daefbf8be..47861f841 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -856,6 +856,22 @@ esdi_mca_write(int port, uint8_t val, void *priv) #endif if (port < 0x102) return; + /* + * The PS/2 Model 80 BIOS always enables a card if it finds one, + * even if no resources were assigned yet (because we only added + * the card, but have not run AutoConfig yet...) + * + * So, remove current address, if any. + * + * Note by Kotori: Moved this to the beginning of esdi_mca_write, + * so the *old* base is removed rather than the + * new base. + */ + io_removehandler(dev->base, 8, + esdi_read, esdi_readw, NULL, + esdi_write, esdi_writew, NULL, dev); + mem_mapping_disable(&dev->bios_rom.mapping); + /* Save the new value. */ dev->pos_regs[port & 7] = val; @@ -932,25 +948,13 @@ esdi_mca_write(int port, uint8_t val, void *priv) break; case 7: /* ROM DC00 [1]=XXXX 0111 */ - dev->bios = 0xC0000; + dev->bios = 0xDC000; break; } else { /* BIOS ROM disabled. */ dev->bios = 0x000000; } - /* - * The PS/2 Model 80 BIOS always enables a card if it finds one, - * even if no resources were assigned yet (because we only added - * the card, but have not run AutoConfig yet...) - * - * So, remove current address, if any. - */ - io_removehandler(dev->base, 8, - esdi_read, esdi_readw, NULL, - esdi_write, esdi_writew, NULL, dev); - mem_mapping_disable(&dev->bios_rom.mapping); - if (dev->pos_regs[2] & 0x01) { /* Card enabled; register (new) I/O handler. */ io_sethandler(dev->base, 8, @@ -989,8 +993,8 @@ esdi_init(device_t *info) dev->irq = ESDI_IRQCHAN; rom_init_interleaved(&dev->bios_rom, - BIOS_FILE_L, BIOS_FILE_H, - 0x00000, 16384, 0x3fff, 0, MEM_MAPPING_EXTERNAL); + BIOS_FILE_H, BIOS_FILE_L, + 0xc8000, 0x4000, 0x3fff, 0, MEM_MAPPING_EXTERNAL); mem_mapping_disable(&dev->bios_rom.mapping); dev->drives[0].present = dev->drives[1].present = 0;