| 1160 | } |
| 1161 | |
| 1162 | static void ide_do_command (struct ide_hdf *ide, uae_u8 cmd) |
| 1163 | { |
| 1164 | int lba48 = ide->lba48; |
| 1165 | |
| 1166 | if (IDE_LOG > 1) |
| 1167 | write_log (_T("**** IDE%d command %02X\n"), ide->num, cmd); |
| 1168 | ide->regs.ide_status &= ~ (IDE_STATUS_DRDY | IDE_STATUS_DRQ | IDE_STATUS_ERR); |
| 1169 | ide->regs.ide_error = 0; |
| 1170 | ide->intdrq = false; |
| 1171 | ide->lba48cmd = false; |
| 1172 | ide->irq_delay = 0; |
| 1173 | |
| 1174 | if (ide->atapi) { |
| 1175 | |
| 1176 | ide->atapi_drdy = true; |
| 1177 | if (cmd == 0x00) { /* nop */ |
| 1178 | ide_interrupt (ide); |
| 1179 | } else if (cmd == 0x08) { /* device reset */ |
| 1180 | ide_execute_drive_diagnostics (ide, true); |
| 1181 | } else if (cmd == 0xa1) { /* identify packet device */ |
| 1182 | ide_identify_drive (ide); |
| 1183 | } else if (cmd == 0xa0) { /* packet */ |
| 1184 | atapi_packet (ide); |
| 1185 | } else if (cmd == 0x90) { /* execute drive diagnostics */ |
| 1186 | ide_execute_drive_diagnostics (ide, true); |
| 1187 | } else { |
| 1188 | ide_execute_drive_diagnostics (ide, false); |
| 1189 | ide->atapi_drdy = false; |
| 1190 | ide_fail (ide); |
| 1191 | write_log (_T("IDE%d: unknown ATAPI command 0x%02x\n"), ide->num, cmd); |
| 1192 | } |
| 1193 | |
| 1194 | } else { |
| 1195 | |
| 1196 | if (cmd == 0x10) { /* recalibrate */ |
| 1197 | ide_recalibrate (ide); |
| 1198 | } else if (cmd == 0xec) { /* identify drive */ |
| 1199 | ide_identify_drive (ide); |
| 1200 | } else if (cmd == 0x90) { /* execute drive diagnostics */ |
| 1201 | ide_execute_drive_diagnostics (ide, true); |
| 1202 | } else if (cmd == 0x91) { /* initialize drive parameters */ |
| 1203 | ide_initialize_drive_parameters (ide); |
| 1204 | } else if (cmd == 0xc6) { /* set multiple mode */ |
| 1205 | ide_set_multiple_mode (ide); |
| 1206 | } else if (cmd == 0x20 || cmd == 0x21) { /* read sectors */ |
| 1207 | ide_read_sectors(ide, 0); |
| 1208 | } else if (cmd == 0x40 || cmd == 0x41) { /* verify sectors */ |
| 1209 | ide_read_sectors(ide, 4); |
| 1210 | } else if (cmd == 0x24 && lba48) { /* read sectors ext */ |
| 1211 | ide_read_sectors (ide, 2); |
| 1212 | } else if (cmd == 0xc4) { /* read multiple */ |
| 1213 | ide_read_sectors (ide, 1); |
| 1214 | } else if (cmd == 0x29 && lba48) { /* read multiple ext */ |
| 1215 | ide_read_sectors (ide, 1|2); |
| 1216 | } else if (cmd == 0x30 || cmd == 0x31) { /* write sectors */ |
| 1217 | ide_write_sectors (ide, 0); |
| 1218 | } else if (cmd == 0x34 && lba48) { /* write sectors ext */ |
| 1219 | ide_write_sectors (ide, 2); |
no test coverage detected