ide select logic fix

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@717 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
bellard 2004-04-07 22:13:51 +00:00
parent 41b9be476c
commit 7ae9862745
1 changed files with 19 additions and 13 deletions

View File

@ -1078,8 +1078,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
ide_if[1].hcyl = val; ide_if[1].hcyl = val;
break; break;
case 6: case 6:
ide_if[0].select = val & 0x4f; ide_if[0].select = (val & ~0x10) | 0xa0;
ide_if[1].select = val & 0x4f; ide_if[1].select = (val | 0x10) | 0xa0;
/* select drive */ /* select drive */
unit = (val >> 4) & 1; unit = (val >> 4) & 1;
s = ide_if + unit; s = ide_if + unit;
@ -1210,7 +1210,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
static uint32_t ide_ioport_read(void *opaque, uint32_t addr1) static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
{ {
IDEState *s = ((IDEState *)opaque)->cur_drive; IDEState *ide_if = opaque;
IDEState *s = ide_if->cur_drive;
uint32_t addr; uint32_t addr;
int ret; int ret;
@ -1220,44 +1221,44 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
ret = 0xff; ret = 0xff;
break; break;
case 1: case 1:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->error; ret = s->error;
break; break;
case 2: case 2:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->nsector & 0xff; ret = s->nsector & 0xff;
break; break;
case 3: case 3:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->sector; ret = s->sector;
break; break;
case 4: case 4:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->lcyl; ret = s->lcyl;
break; break;
case 5: case 5:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->hcyl; ret = s->hcyl;
break; break;
case 6: case 6:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->select | 0xa0; ret = s->select;
break; break;
default: default:
case 7: case 7:
if (!s->bs) if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0; ret = 0;
else else
ret = s->status; ret = s->status;
@ -1272,9 +1273,14 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
static uint32_t ide_status_read(void *opaque, uint32_t addr) static uint32_t ide_status_read(void *opaque, uint32_t addr)
{ {
IDEState *s = ((IDEState *)opaque)->cur_drive; IDEState *ide_if = opaque;
IDEState *s = ide_if->cur_drive;
int ret; int ret;
ret = s->status;
if (!ide_if[0].bs && !ide_if[1].bs)
ret = 0;
else
ret = s->status;
#ifdef DEBUG_IDE #ifdef DEBUG_IDE
printf("ide: read status addr=0x%x val=%02x\n", addr, ret); printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
#endif #endif