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