| 1347 | } |
| 1348 | |
| 1349 | static int scsi_read_cd_da(int unitnum, uae_u8 *cmd, uae_u8 *data, struct device_info *di) |
| 1350 | { |
| 1351 | struct blkdevstate *st = &state[unitnum]; |
| 1352 | int msf = cmd[0] == 0xd9; |
| 1353 | int start = msf ? msf2lsn(rl(cmd + 2) & 0x00ffffff) : rl(cmd + 2); |
| 1354 | int len = rl(cmd + 6) & 0x00ffffff; |
| 1355 | int sectorsize; |
| 1356 | uae_u8 subcode = cmd[10]; |
| 1357 | switch (subcode) |
| 1358 | { |
| 1359 | case 0: |
| 1360 | sectorsize = 2352; |
| 1361 | break; |
| 1362 | case 1: |
| 1363 | sectorsize = 2368; |
| 1364 | break; |
| 1365 | case 2: |
| 1366 | sectorsize = 2448; |
| 1367 | break; |
| 1368 | case 3: |
| 1369 | sectorsize = 96; |
| 1370 | break; |
| 1371 | default: |
| 1372 | return -1; |
| 1373 | } |
| 1374 | if (msf) { |
| 1375 | int end = msf2lsn(len); |
| 1376 | len = end - start; |
| 1377 | if (len < 0) |
| 1378 | return -1; |
| 1379 | } |
| 1380 | if (len == 0) |
| 1381 | return 0; |
| 1382 | int v = sys_command_cd_rawread(unitnum, data, start, len, sectorsize); |
| 1383 | if (v > 0) |
| 1384 | st->current_pos = start + len; |
| 1385 | return v; |
| 1386 | } |
| 1387 | |
| 1388 | static int scsi_read_cd(int unitnum, uae_u8 *cmd, uae_u8 *data, struct device_info *di) |
| 1389 | { |
no test coverage detected