Commit c45c3d0059d738c856fc730ee2e51bf5868815e1

Authored by bellard
1 parent baca51fa

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
Showing 1 changed file with 43 additions and 14 deletions
hw/ide.c
... ... @@ -1060,7 +1060,7 @@ static void cdrom_change_cb(void *opaque)
1060 1060 static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1061 1061 {
1062 1062 IDEState *ide_if = opaque;
1063   - IDEState *s = ide_if->cur_drive;
  1063 + IDEState *s;
1064 1064 int unit, n;
1065 1065  
1066 1066 #ifdef DEBUG_IDE
... ... @@ -1071,28 +1071,35 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1071 1071 case 0:
1072 1072 break;
1073 1073 case 1:
1074   - s->feature = val;
  1074 + /* NOTE: data is written to the two drives */
  1075 + ide_if[0].feature = val;
  1076 + ide_if[1].feature = val;
1075 1077 break;
1076 1078 case 2:
1077 1079 if (val == 0)
1078 1080 val = 256;
1079   - s->nsector = val;
  1081 + ide_if[0].nsector = val;
  1082 + ide_if[1].nsector = val;
1080 1083 break;
1081 1084 case 3:
1082   - s->sector = val;
  1085 + ide_if[0].sector = val;
  1086 + ide_if[1].sector = val;
1083 1087 break;
1084 1088 case 4:
1085   - s->lcyl = val;
  1089 + ide_if[0].lcyl = val;
  1090 + ide_if[1].lcyl = val;
1086 1091 break;
1087 1092 case 5:
1088   - s->hcyl = val;
  1093 + ide_if[0].hcyl = val;
  1094 + ide_if[1].hcyl = val;
1089 1095 break;
1090 1096 case 6:
  1097 + ide_if[0].select = val & 0x4f;
  1098 + ide_if[1].select = val & 0x4f;
1091 1099 /* select drive */
1092 1100 unit = (val >> 4) & 1;
1093 1101 s = ide_if + unit;
1094 1102 ide_if->cur_drive = s;
1095   - s->select = val;
1096 1103 break;
1097 1104 default:
1098 1105 case 7:
... ... @@ -1100,6 +1107,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
1100 1107 #if defined(DEBUG_IDE)
1101 1108 printf("ide: CMD=%02x\n", val);
1102 1109 #endif
  1110 + s = ide_if->cur_drive;
1103 1111 switch(val) {
1104 1112 case WIN_IDENTIFY:
1105 1113 if (s->bs && !s->is_cdrom) {
... ... @@ -1228,26 +1236,47 @@ static uint32_t ide_ioport_read(void *opaque, uint32_t addr1)
1228 1236 ret = 0xff;
1229 1237 break;
1230 1238 case 1:
1231   - ret = s->error;
  1239 + if (!s->bs)
  1240 + ret = 0;
  1241 + else
  1242 + ret = s->error;
1232 1243 break;
1233 1244 case 2:
1234   - ret = s->nsector & 0xff;
  1245 + if (!s->bs)
  1246 + ret = 0;
  1247 + else
  1248 + ret = s->nsector & 0xff;
1235 1249 break;
1236 1250 case 3:
1237   - ret = s->sector;
  1251 + if (!s->bs)
  1252 + ret = 0;
  1253 + else
  1254 + ret = s->sector;
1238 1255 break;
1239 1256 case 4:
1240   - ret = s->lcyl;
  1257 + if (!s->bs)
  1258 + ret = 0;
  1259 + else
  1260 + ret = s->lcyl;
1241 1261 break;
1242 1262 case 5:
1243   - ret = s->hcyl;
  1263 + if (!s->bs)
  1264 + ret = 0;
  1265 + else
  1266 + ret = s->hcyl;
1244 1267 break;
1245 1268 case 6:
1246   - ret = s->select;
  1269 + if (!s->bs)
  1270 + ret = 0;
  1271 + else
  1272 + ret = s->select;
1247 1273 break;
1248 1274 default:
1249 1275 case 7:
1250   - ret = s->status;
  1276 + if (!s->bs)
  1277 + ret = 0;
  1278 + else
  1279 + ret = s->status;
1251 1280 pic_set_irq(s->irq, 0);
1252 1281 break;
1253 1282 }
... ...