Fixed IDE status readout on an absent device 1 with a present device 0, fixes hangs with AMI BIOS'es on hard disk detection in such cases.
This commit is contained in:
@@ -9,7 +9,7 @@
|
|||||||
* Implementation of the IDE emulation for hard disks and ATAPI
|
* Implementation of the IDE emulation for hard disks and ATAPI
|
||||||
* CD-ROM devices.
|
* CD-ROM devices.
|
||||||
*
|
*
|
||||||
* Version: @(#)hdc_ide.c 1.0.62 2019/10/31
|
* Version: @(#)hdc_ide.c 1.0.63 2019/11/01
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -1631,10 +1631,12 @@ ide_read_data(ide_t *ide, int length)
|
|||||||
|
|
||||||
|
|
||||||
static uint8_t
|
static uint8_t
|
||||||
ide_status(ide_t *ide, int ch)
|
ide_status(ide_t *ide, ide_t *ide_other, int ch)
|
||||||
{
|
{
|
||||||
if (ide->type == IDE_NONE)
|
if ((ide->type == IDE_NONE) && ((ide_other->type == IDE_NONE) || !(ch & 1)))
|
||||||
return 0x7F; /* Bit 7 pulled down, all other bits pulled up, per the spec. */
|
return 0x7F; /* Bit 7 pulled down, all other bits pulled up, per the spec. */
|
||||||
|
else if ((ide->type == IDE_NONE) && (ch & 1))
|
||||||
|
return 0x00; /* On real hardware, a slave with a present master always returns a status of 0x00. */
|
||||||
else if (ide->type == IDE_ATAPI)
|
else if (ide->type == IDE_ATAPI)
|
||||||
return (ide->sc->status & ~DSC_STAT) | (ide->service ? SERVICE_STAT : 0);
|
return (ide->sc->status & ~DSC_STAT) | (ide->service ? SERVICE_STAT : 0);
|
||||||
else
|
else
|
||||||
@@ -1727,7 +1729,7 @@ ide_readb(uint16_t addr, void *priv)
|
|||||||
DF (drive fault). */
|
DF (drive fault). */
|
||||||
case 0x7: /* Status */
|
case 0x7: /* Status */
|
||||||
ide_irq_lower(ide);
|
ide_irq_lower(ide);
|
||||||
temp = ide_status(ide, ch);
|
temp = ide_status(ide, ide_drives[ch ^ 1], ch);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1751,7 +1753,7 @@ ide_read_alt_status(uint16_t addr, void *priv)
|
|||||||
|
|
||||||
/* Per the Seagate ATA-3 specification:
|
/* Per the Seagate ATA-3 specification:
|
||||||
Reading the alternate status does *NOT* clear the IRQ. */
|
Reading the alternate status does *NOT* clear the IRQ. */
|
||||||
temp = ide_status(ide, ch);
|
temp = ide_status(ide, ide_drives[ch ^ 1], ch);
|
||||||
|
|
||||||
ide_log("ide_read_alt_status(%04X, %08X) = %02X\n", addr, priv, temp);
|
ide_log("ide_read_alt_status(%04X, %08X) = %02X\n", addr, priv, temp);
|
||||||
return temp;
|
return temp;
|
||||||
|
Reference in New Issue
Block a user