Commit 7ae9862745abb67789a34d4354cc738ab172b377

Authored by bellard
1 parent 41b9be47

ide select logic fix


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@717 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 19 additions and 13 deletions
hw/ide.c
@@ -1078,8 +1078,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -1078,8 +1078,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1078 ide_if[1].hcyl = val; 1078 ide_if[1].hcyl = val;
1079 break; 1079 break;
1080 case 6: 1080 case 6:
1081 - ide_if[0].select = val & 0x4f;  
1082 - ide_if[1].select = val & 0x4f; 1081 + ide_if[0].select = (val & ~0x10) | 0xa0;
  1082 + ide_if[1].select = (val | 0x10) | 0xa0;
1083 /* select drive */ 1083 /* select drive */
1084 unit = (val >> 4) & 1; 1084 unit = (val >> 4) & 1;
1085 s = ide_if + unit; 1085 s = ide_if + unit;
@@ -1210,7 +1210,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -1210,7 +1210,8 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1210 1210
1211 static uint32_t ide_ioport_read(void *opaque, uint32_t addr1) 1211 static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1212 { 1212 {
1213 - IDEState *s = ((IDEState *)opaque)->cur_drive; 1213 + IDEState *ide_if = opaque;
  1214 + IDEState *s = ide_if->cur_drive;
1214 uint32_t addr; 1215 uint32_t addr;
1215 int ret; 1216 int ret;
1216 1217
@@ -1220,44 +1221,44 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1) @@ -1220,44 +1221,44 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1220 ret = 0xff; 1221 ret = 0xff;
1221 break; 1222 break;
1222 case 1: 1223 case 1:
1223 - if (!s->bs) 1224 + if (!ide_if[0].bs && !ide_if[1].bs)
1224 ret = 0; 1225 ret = 0;
1225 else 1226 else
1226 ret = s->error; 1227 ret = s->error;
1227 break; 1228 break;
1228 case 2: 1229 case 2:
1229 - if (!s->bs) 1230 + if (!ide_if[0].bs && !ide_if[1].bs)
1230 ret = 0; 1231 ret = 0;
1231 else 1232 else
1232 ret = s->nsector & 0xff; 1233 ret = s->nsector & 0xff;
1233 break; 1234 break;
1234 case 3: 1235 case 3:
1235 - if (!s->bs) 1236 + if (!ide_if[0].bs && !ide_if[1].bs)
1236 ret = 0; 1237 ret = 0;
1237 else 1238 else
1238 ret = s->sector; 1239 ret = s->sector;
1239 break; 1240 break;
1240 case 4: 1241 case 4:
1241 - if (!s->bs) 1242 + if (!ide_if[0].bs && !ide_if[1].bs)
1242 ret = 0; 1243 ret = 0;
1243 else 1244 else
1244 ret = s->lcyl; 1245 ret = s->lcyl;
1245 break; 1246 break;
1246 case 5: 1247 case 5:
1247 - if (!s->bs) 1248 + if (!ide_if[0].bs && !ide_if[1].bs)
1248 ret = 0; 1249 ret = 0;
1249 else 1250 else
1250 ret = s->hcyl; 1251 ret = s->hcyl;
1251 break; 1252 break;
1252 case 6: 1253 case 6:
1253 - if (!s->bs) 1254 + if (!ide_if[0].bs && !ide_if[1].bs)
1254 ret = 0; 1255 ret = 0;
1255 else 1256 else
1256 - ret = s->select | 0xa0; 1257 + ret = s->select;
1257 break; 1258 break;
1258 default: 1259 default:
1259 case 7: 1260 case 7:
1260 - if (!s->bs) 1261 + if (!ide_if[0].bs && !ide_if[1].bs)
1261 ret = 0; 1262 ret = 0;
1262 else 1263 else
1263 ret = s->status; 1264 ret = s->status;
@@ -1272,9 +1273,14 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1) @@ -1272,9 +1273,14 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1272 1273
1273 static uint32_t ide_status_read(void *opaque, uint32_t addr) 1274 static uint32_t ide_status_read(void *opaque, uint32_t addr)
1274 { 1275 {
1275 - IDEState *s = ((IDEState *)opaque)->cur_drive; 1276 + IDEState *ide_if = opaque;
  1277 + IDEState *s = ide_if->cur_drive;
1276 int ret; 1278 int ret;
1277 - ret = s->status; 1279 +
  1280 + if (!ide_if[0].bs && !ide_if[1].bs)
  1281 + ret = 0;
  1282 + else
  1283 + ret = s->status;
1278 #ifdef DEBUG_IDE 1284 #ifdef DEBUG_IDE
1279 printf("ide: read status addr=0x%x val=%02x\n", addr, ret); 1285 printf("ide: read status addr=0x%x val=%02x\n", addr, ret);
1280 #endif 1286 #endif