MCPcopy Create free account
hub / github.com/BlitterStudio/amiberry / ide_do_command

Function ide_do_command

src/ide.cpp:1162–1246  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1160}
1161
1162static 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);

Callers 1

ide_write_regFunction · 0.85

Calls 13

ide_interruptFunction · 0.85
ide_identify_driveFunction · 0.85
atapi_packetFunction · 0.85
ide_failFunction · 0.85
ide_recalibrateFunction · 0.85
ide_set_multiple_modeFunction · 0.85
ide_read_sectorsFunction · 0.85
ide_write_sectorsFunction · 0.85
ide_format_trackFunction · 0.85
ide_set_featuresFunction · 0.85

Tested by

no test coverage detected