| 1654 | } |
| 1655 | |
| 1656 | struct ide_hdf *add_ide_unit (struct ide_hdf **idetable, int max, int ch, struct uaedev_config_info *ci, struct romconfig *rc) |
| 1657 | { |
| 1658 | struct ide_hdf *ide; |
| 1659 | bool vb; |
| 1660 | |
| 1661 | alloc_ide_mem(idetable, max, NULL); |
| 1662 | if (ch < 0) |
| 1663 | return NULL; |
| 1664 | ide = idetable[ch]; |
| 1665 | if (ci) |
| 1666 | memcpy (&ide->hdhfd.hfd.ci, ci, sizeof (struct uaedev_config_info)); |
| 1667 | if (ci->type == UAEDEV_CD && ci->device_emu_unit >= 0) { |
| 1668 | |
| 1669 | device_func_init(0); |
| 1670 | ide->scsi = scsi_alloc_cd(ch, ci->device_emu_unit, true, ci->uae_unitnum); |
| 1671 | if (!ide->scsi) { |
| 1672 | write_log(_T("IDE: CD EMU unit %d failed to open\n"), ide->cd_unit_num); |
| 1673 | return NULL; |
| 1674 | } |
| 1675 | |
| 1676 | ide_identity_buffer(ide); |
| 1677 | ide->cd_unit_num = ci->device_emu_unit; |
| 1678 | ide->atapi = true; |
| 1679 | ide->atapi_device_type = 5; |
| 1680 | ide->blocksize = 512; |
| 1681 | ide->uae_unitnum = ci->uae_unitnum; |
| 1682 | gui_flicker_led(LED_CD, ci->uae_unitnum, -1); |
| 1683 | |
| 1684 | write_log(_T("IDE%d CD %d\n"), ch, ide->cd_unit_num); |
| 1685 | |
| 1686 | } else if (ci->type == UAEDEV_TAPE) { |
| 1687 | |
| 1688 | ide->scsi = scsi_alloc_tape(ch, ci->rootdir, ci->readonly, ci->uae_unitnum); |
| 1689 | if (!ide->scsi) { |
| 1690 | write_log(_T("IDE: TAPE EMU unit %d failed to open\n"), ch); |
| 1691 | return NULL; |
| 1692 | } |
| 1693 | |
| 1694 | ide_identity_buffer(ide); |
| 1695 | ide->atapi = true; |
| 1696 | ide->atapi_device_type = 1; |
| 1697 | ide->blocksize = 512; |
| 1698 | ide->cd_unit_num = -1; |
| 1699 | ide->uae_unitnum = ci->uae_unitnum; |
| 1700 | |
| 1701 | write_log(_T("IDE%d TAPE %d\n"), ch, ide->cd_unit_num); |
| 1702 | |
| 1703 | |
| 1704 | } else if (ci->type == UAEDEV_HDF) { |
| 1705 | |
| 1706 | if (!hdf_hd_open (&ide->hdhfd)) |
| 1707 | return NULL; |
| 1708 | |
| 1709 | ide->max_multiple_mode = 128; |
| 1710 | ide->blocksize = ide->hdhfd.hfd.virtual_rdb ? 512 : ide->hdhfd.hfd.ci.blocksize; |
| 1711 | ide->max_lba = ide->hdhfd.size / ide->blocksize; |
| 1712 | ide->lba48 = (ide->hdhfd.hfd.ci.unit_special_flags & 1) || ide->hdhfd.size >= 128 * (uae_u64)0x40000000 ? 1 : 0; |
| 1713 | ide->lba = true; |
no test coverage detected