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

Function ide_get_data_2

src/ide.cpp:1248–1319  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1246}
1247
1248static 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 }

Callers 2

ide_get_dataFunction · 0.85
ide_get_data_8bitFunction · 0.85

Calls 6

ide_isdriveFunction · 0.85
atapi_data_doneFunction · 0.85
process_packet_commandFunction · 0.85
do_process_rw_commandFunction · 0.85
ide_fast_interruptFunction · 0.85
write_logFunction · 0.70

Tested by

no test coverage detected