Merge pull request #4613 from 86Box/tc1995

SCSI and disk fixes (July 14th, 2024)
This commit is contained in:
Miran Grča
2024-07-14 20:46:11 +02:00
committed by GitHub
5 changed files with 40 additions and 10 deletions

View File

@@ -701,7 +701,6 @@ mo_command_common(mo_t *dev)
static void static void
mo_command_complete(mo_t *dev) mo_command_complete(mo_t *dev)
{ {
ui_sb_update_icon(SB_MO | dev->id, 0);
dev->packet_status = PHASE_COMPLETE; dev->packet_status = PHASE_COMPLETE;
mo_command_common(dev); mo_command_common(dev);
} }

View File

@@ -875,7 +875,6 @@ zip_command_common(zip_t *dev)
static void static void
zip_command_complete(zip_t *dev) zip_command_complete(zip_t *dev)
{ {
ui_sb_update_icon(SB_ZIP | dev->id, 0);
dev->packet_status = PHASE_COMPLETE; dev->packet_status = PHASE_COMPLETE;
zip_command_common(dev); zip_command_common(dev);
} }

View File

@@ -393,14 +393,23 @@ MachineStatus::refreshIcons()
} }
for (size_t i = 0; i < CDROM_NUM; ++i) { for (size_t i = 0; i < CDROM_NUM; ++i) {
d->cdrom[i].setActive(machine_status.cdrom[i].active); d->cdrom[i].setActive(machine_status.cdrom[i].active);
if (machine_status.cdrom[i].active)
ui_sb_update_icon(SB_CDROM | i, 0);
d->cdrom[i].setEmpty(machine_status.cdrom[i].empty); d->cdrom[i].setEmpty(machine_status.cdrom[i].empty);
} }
for (size_t i = 0; i < ZIP_NUM; i++) { for (size_t i = 0; i < ZIP_NUM; i++) {
d->zip[i].setActive(machine_status.zip[i].active); d->zip[i].setActive(machine_status.zip[i].active);
if (machine_status.zip[i].active)
ui_sb_update_icon(SB_ZIP | i, 0);
d->zip[i].setEmpty(machine_status.zip[i].empty); d->zip[i].setEmpty(machine_status.zip[i].empty);
} }
for (size_t i = 0; i < MO_NUM; i++) { for (size_t i = 0; i < MO_NUM; i++) {
d->mo[i].setActive(machine_status.mo[i].active); d->mo[i].setActive(machine_status.mo[i].active);
if (machine_status.mo[i].active)
ui_sb_update_icon(SB_MO | i, 0);
d->mo[i].setEmpty(machine_status.mo[i].empty); d->mo[i].setEmpty(machine_status.mo[i].empty);
} }
@@ -408,6 +417,8 @@ MachineStatus::refreshIcons()
for (size_t i = 0; i < HDD_BUS_USB; i++) { for (size_t i = 0; i < HDD_BUS_USB; i++) {
d->hdds[i].setActive(machine_status.hdd[i].active); d->hdds[i].setActive(machine_status.hdd[i].active);
if (machine_status.hdd[i].active)
ui_sb_update_icon(SB_HDD | i, 0);
} }
for (size_t i = 0; i < NET_CARD_MAX; i++) { for (size_t i = 0; i < NET_CARD_MAX; i++) {

View File

@@ -1080,7 +1080,6 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev)
static void static void
scsi_cdrom_command_complete(scsi_cdrom_t *dev) scsi_cdrom_command_complete(scsi_cdrom_t *dev)
{ {
ui_sb_update_icon(SB_CDROM | dev->id, 0);
dev->packet_status = PHASE_COMPLETE; dev->packet_status = PHASE_COMPLETE;
scsi_cdrom_command_common(dev); scsi_cdrom_command_common(dev);
dev->tf->phase = 3; dev->tf->phase = 3;
@@ -1637,9 +1636,29 @@ skip_ready_check:
dev->media_status = (dev->unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE; dev->media_status = (dev->unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE;
if ((scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready) { if ((scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready) {
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); if (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY) { /*Note by TC1995: Some vendor commands from X vendor don't really check for ready status
scsi_cdrom_not_ready(dev); but they do on Y vendor. Quite confusing I know.*/
return 0; switch (dev->drv->type) {
case CDROM_TYPE_DEC_RRD45_0436:
case CDROM_TYPE_SONY_CDU541_10i:
case CDROM_TYPE_SONY_CDU561_18k:
case CDROM_TYPE_SONY_CDU76S_100:
case CDROM_TYPE_TEXEL_DMXX24_100:
if (cdb[0] == 0xC0)
break;
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
scsi_cdrom_not_ready(dev);
return 0;
default:
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
scsi_cdrom_not_ready(dev);
return 0;
}
} else {
scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]);
scsi_cdrom_not_ready(dev);
return 0;
}
} }
scsi_cdrom_log("CD-ROM %i: Continuing with command %02X\n", dev->id, cdb[0]); scsi_cdrom_log("CD-ROM %i: Continuing with command %02X\n", dev->id, cdb[0]);
@@ -3223,7 +3242,6 @@ begin:
case CDROM_TYPE_TEAC_CD50_100: case CDROM_TYPE_TEAC_CD50_100:
case CDROM_TYPE_TEAC_R55S_10R: case CDROM_TYPE_TEAC_R55S_10R:
case CDROM_TYPE_TEXEL_DMXX24_100: case CDROM_TYPE_TEXEL_DMXX24_100:
case CDROM_TYPE_TOSHIBA_XM3201B_3232:
dev->buffer[2] = 0x00; dev->buffer[2] = 0x00;
dev->buffer[3] = 0x01; /*SCSI-1 compliant*/ dev->buffer[3] = 0x01; /*SCSI-1 compliant*/
break; break;
@@ -3235,6 +3253,10 @@ begin:
case CDROM_TYPE_NEC_464_105: case CDROM_TYPE_NEC_464_105:
dev->buffer[3] = 0x00; /*SCSI unknown version per NEC manuals*/ dev->buffer[3] = 0x00; /*SCSI unknown version per NEC manuals*/
break; break;
case CDROM_TYPE_TOSHIBA_XM3201B_3232:
dev->buffer[2] = 0x01;
dev->buffer[3] = 0x01; /*SCSI-1 compliant*/
break;
default: default:
dev->buffer[2] = 0x02; /*SCSI-2 compliant*/ dev->buffer[2] = 0x02; /*SCSI-2 compliant*/
break; break;

View File

@@ -461,7 +461,7 @@ scsi_disk_command_common(scsi_disk_t *dev)
(uint64_t) period); (uint64_t) period);
dev->callback += period; dev->callback += period;
break; break;
default: default:
dev->callback = 0; dev->callback = 0;
break; break;
} }
@@ -511,7 +511,6 @@ scsi_disk_command_common(scsi_disk_t *dev)
static void static void
scsi_disk_command_complete(scsi_disk_t *dev) scsi_disk_command_complete(scsi_disk_t *dev)
{ {
ui_sb_update_icon(SB_HDD | dev->drv->bus, 0);
dev->packet_status = PHASE_COMPLETE; dev->packet_status = PHASE_COMPLETE;
scsi_disk_command_common(dev); scsi_disk_command_common(dev);
} }
@@ -1647,7 +1646,7 @@ scsi_disk_identify(ide_t *ide, int ide_has_dma)
scsi_disk_log("ATAPI Identify: %s\n", device_identify); scsi_disk_log("ATAPI Identify: %s\n", device_identify);
/* ATAPI device, direct-access device, non-removable media, accelerated DRQ */ /* ATAPI device, direct-access device, non-removable media, accelerated DRQ */
ide->buffer[0] = 0x8000 | (0 << 8) | 0x00 | (2 << 5); ide->buffer[0] = 0x8000 | (0 << 8) | 0x00 | (2 << 5);
ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */
ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */ ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */