| 1093 | } |
| 1094 | |
| 1095 | static void ide_write_sectors (struct ide_hdf *ide, int flags) |
| 1096 | { |
| 1097 | unsigned int cyl, head, sec, nsec; |
| 1098 | uae_u64 lba; |
| 1099 | int multi = flags & 1; |
| 1100 | |
| 1101 | ide->lba48cmd = (flags & 2) != 0; |
| 1102 | if (multi && (ide->multiple_mode == 0 || ide->ata_level < 0)) { |
| 1103 | ide_fail (ide); |
| 1104 | return; |
| 1105 | } |
| 1106 | check_maxtransfer (ide, 1); |
| 1107 | gui_flicker_led (LED_HD, ide->uae_unitnum, 2); |
| 1108 | nsec = get_nsec (ide); |
| 1109 | get_lbachs (ide, &lba, &cyl, &head, &sec); |
| 1110 | if (lba >= ide->max_lba) { |
| 1111 | ide_data_ready (ide); |
| 1112 | ide_fail_err (ide, IDE_ERR_IDNF); |
| 1113 | return; |
| 1114 | } |
| 1115 | if (IDE_LOG > 0) |
| 1116 | write_log (_T("IDE%d write off=%d, sec=%d (%d) %s\n"), ide->num, (uae_u32)lba, nsec, ide->multiple_mode, getidemode(ide)); |
| 1117 | if (nsec > ide->max_lba - lba) |
| 1118 | nsec = (unsigned int)(ide->max_lba - lba); |
| 1119 | if (nsec <= 0) { |
| 1120 | ide_data_ready (ide); |
| 1121 | ide_fail_err (ide, IDE_ERR_IDNF); |
| 1122 | return; |
| 1123 | } |
| 1124 | ide->data_multi = multi ? ide->multiple_mode : 1; |
| 1125 | ide->data_offset = 0; |
| 1126 | ide->data_size = nsec * ide->blocksize; |
| 1127 | ide->direction = 1; |
| 1128 | ide->buffer_offset = 0; |
| 1129 | // write start: set DRQ and clear BSY. No interrupt. |
| 1130 | ide->regs.ide_status |= IDE_STATUS_DRQ; |
| 1131 | ide->regs.ide_status &= ~IDE_STATUS_BSY; |
| 1132 | } |
| 1133 | |
| 1134 | static void ide_format_track(struct ide_hdf *ide) |
| 1135 | { |
no test coverage detected