mirror of https://github.com/xemu-project/xemu.git
write to both IDE drives - return 0 for not present drives
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@672 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
baca51faff
commit
c45c3d0059
43
hw/ide.c
43
hw/ide.c
|
@ -1060,7 +1060,7 @@ static void cdrom_change_cb(void *opaque)
|
||||||
static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||||
{
|
{
|
||||||
IDEState *ide_if = opaque;
|
IDEState *ide_if = opaque;
|
||||||
IDEState *s = ide_if->cur_drive;
|
IDEState *s;
|
||||||
int unit, n;
|
int unit, n;
|
||||||
|
|
||||||
#ifdef DEBUG_IDE
|
#ifdef DEBUG_IDE
|
||||||
|
@ -1071,28 +1071,35 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||||
case 0:
|
case 0:
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
s->feature = val;
|
/* NOTE: data is written to the two drives */
|
||||||
|
ide_if[0].feature = val;
|
||||||
|
ide_if[1].feature = val;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (val == 0)
|
if (val == 0)
|
||||||
val = 256;
|
val = 256;
|
||||||
s->nsector = val;
|
ide_if[0].nsector = val;
|
||||||
|
ide_if[1].nsector = val;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
s->sector = val;
|
ide_if[0].sector = val;
|
||||||
|
ide_if[1].sector = val;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
s->lcyl = val;
|
ide_if[0].lcyl = val;
|
||||||
|
ide_if[1].lcyl = val;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
s->hcyl = val;
|
ide_if[0].hcyl = val;
|
||||||
|
ide_if[1].hcyl = val;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
ide_if[0].select = val & 0x4f;
|
||||||
|
ide_if[1].select = val & 0x4f;
|
||||||
/* select drive */
|
/* select drive */
|
||||||
unit = (val >> 4) & 1;
|
unit = (val >> 4) & 1;
|
||||||
s = ide_if + unit;
|
s = ide_if + unit;
|
||||||
ide_if->cur_drive = s;
|
ide_if->cur_drive = s;
|
||||||
s->select = val;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case 7:
|
case 7:
|
||||||
|
@ -1100,6 +1107,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
|
||||||
#if defined(DEBUG_IDE)
|
#if defined(DEBUG_IDE)
|
||||||
printf("ide: CMD=%02x\n", val);
|
printf("ide: CMD=%02x\n", val);
|
||||||
#endif
|
#endif
|
||||||
|
s = ide_if->cur_drive;
|
||||||
switch(val) {
|
switch(val) {
|
||||||
case WIN_IDENTIFY:
|
case WIN_IDENTIFY:
|
||||||
if (s->bs && !s->is_cdrom) {
|
if (s->bs && !s->is_cdrom) {
|
||||||
|
@ -1228,25 +1236,46 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
|
||||||
ret = 0xff;
|
ret = 0xff;
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->error;
|
ret = s->error;
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->nsector & 0xff;
|
ret = s->nsector & 0xff;
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->sector;
|
ret = s->sector;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->lcyl;
|
ret = s->lcyl;
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->hcyl;
|
ret = s->hcyl;
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->select;
|
ret = s->select;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case 7:
|
case 7:
|
||||||
|
if (!s->bs)
|
||||||
|
ret = 0;
|
||||||
|
else
|
||||||
ret = s->status;
|
ret = s->status;
|
||||||
pic_set_irq(s->irq, 0);
|
pic_set_irq(s->irq, 0);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue