| 1246 | } |
| 1247 | |
| 1248 | static uae_u16 ide_get_data_2(struct ide_hdf *ide, int bussize) |
| 1249 | { |
| 1250 | bool irq = false; |
| 1251 | uae_u16 v; |
| 1252 | int inc = bussize ? 2 : 1; |
| 1253 | |
| 1254 | if (ide->data_size == 0) { |
| 1255 | if (IDE_LOG > 0) |
| 1256 | write_log (_T("IDE%d DATA but no data left!? %02X PC=%08X\n"), ide->num, ide->regs.ide_status, M68K_GETPC); |
| 1257 | if (!ide_isdrive (ide)) |
| 1258 | return 0xffff; |
| 1259 | return 0; |
| 1260 | } |
| 1261 | if (ide->packet_state) { |
| 1262 | if (bussize) { |
| 1263 | v = ide->secbuf[ide->packet_data_offset + ide->data_offset + 1] | (ide->secbuf[ide->packet_data_offset + ide->data_offset + 0] << 8); |
| 1264 | } else { |
| 1265 | v = ide->secbuf[(ide->packet_data_offset + ide->data_offset)]; |
| 1266 | } |
| 1267 | if (IDE_LOG > 4) |
| 1268 | write_log (_T("IDE%d DATA read %04x %08x\n"), ide->num, v, M68K_GETPC); |
| 1269 | ide->data_offset += inc; |
| 1270 | if (ide->data_size < 0) |
| 1271 | ide->data_size += inc; |
| 1272 | else |
| 1273 | ide->data_size -= inc; |
| 1274 | if (ide->data_offset == ide->packet_transfer_size) { |
| 1275 | if (IDE_LOG > 1) |
| 1276 | write_log (_T("IDE%d ATAPI partial read finished, %d bytes remaining\n"), ide->num, ide->data_size); |
| 1277 | if (ide->data_size == 0 || ide->data_size == 1) { // 1 byte remaining: ignore, ATAPI has word transfer size. |
| 1278 | ide->packet_state = 0; |
| 1279 | atapi_data_done (ide); |
| 1280 | if (IDE_LOG > 1) |
| 1281 | write_log (_T("IDE%d ATAPI read finished, %d bytes\n"), ide->num, ide->packet_data_offset + ide->data_offset); |
| 1282 | irq = true; |
| 1283 | } else { |
| 1284 | process_packet_command (ide); |
| 1285 | } |
| 1286 | } |
| 1287 | } else { |
| 1288 | if (bussize) { |
| 1289 | v = ide->secbuf[ide->buffer_offset + ide->data_offset + 1] | (ide->secbuf[ide->buffer_offset + ide->data_offset + 0] << 8); |
| 1290 | } else { |
| 1291 | v = ide->secbuf[(ide->buffer_offset + ide->data_offset)]; |
| 1292 | } |
| 1293 | if (IDE_LOG > 4) |
| 1294 | write_log (_T("IDE%d DATA read %04x %d/%d %08x\n"), ide->num, v, ide->data_offset, ide->data_size, M68K_GETPC); |
| 1295 | ide->data_offset += inc; |
| 1296 | if (ide->data_size < 0) { |
| 1297 | ide->data_size += inc; |
| 1298 | } else { |
| 1299 | ide->data_size -= inc; |
| 1300 | if (((ide->data_offset % ide->blocksize) == 0) && ((ide->data_offset / ide->blocksize) % ide->data_multi) == 0) { |
| 1301 | if (ide->data_size) { |
| 1302 | ide->buffer_offset += ide->data_offset; |
| 1303 | do_process_rw_command(ide); |
| 1304 | } |
| 1305 | } |
no test coverage detected