nec/pce_cd.cpp: unbreak no disc state

This commit is contained in:
angelosa 2023-05-17 21:25:42 +02:00
parent cc2bc77004
commit a6ec7a7bd2

View File

@ -2,7 +2,7 @@
// copyright-holders:Wilbert Pol, Angelo Salese // copyright-holders:Wilbert Pol, Angelo Salese
/************************************************************************************************** /**************************************************************************************************
PC Engine CD HW notes: PC Engine CD HW sub-portion:
TODO: TODO:
- Rewrite SCSI to honor actual nscsi_device; - Rewrite SCSI to honor actual nscsi_device;
@ -23,6 +23,7 @@ TODO:
- Audio CD player rewind/fast forward don't work properly - Audio CD player rewind/fast forward don't work properly
\- never go past 1 minute mark, underflows; \- never go past 1 minute mark, underflows;
- Fader feature is sketchy and unchecked against real HW; - Fader feature is sketchy and unchecked against real HW;
- Implement proper check condition errors (non-SCSI complaint);
**************************************************************************************************/ **************************************************************************************************/
@ -378,13 +379,14 @@ void pce_cd_device::reply_status_byte(uint8_t status)
void pce_cd_device::test_unit_ready() void pce_cd_device::test_unit_ready()
{ {
LOGCMD("0x00 TEST UNIT READY: status send "); LOGCMD("0x00 TEST UNIT READY: status send ");
if (m_cdrom) if (m_cdrom->exists())
{ {
LOGCMD("STATUS_OK\n"); LOGCMD("STATUS_OK\n");
reply_status_byte(SCSI_STATUS_OK); reply_status_byte(SCSI_STATUS_OK);
} }
else else
{ {
// TODO: sense key/ASC/ASCQ
LOGCMD("CHECK_CONDITION\n"); LOGCMD("CHECK_CONDITION\n");
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
} }
@ -397,9 +399,9 @@ void pce_cd_device::read_6()
uint32_t frame_count = m_command_buffer[4]; uint32_t frame_count = m_command_buffer[4];
LOGCMD("0x08 READ(6): frame: %08x size: %08x\n", frame, frame_count); LOGCMD("0x08 READ(6): frame: %08x size: %08x\n", frame, frame_count);
/* Check for presence of a CD */ if (!m_cdrom->exists())
if (!m_cdrom)
{ {
// TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return; return;
} }
@ -437,9 +439,9 @@ void pce_cd_device::nec_set_audio_start_position()
const uint8_t mode = m_command_buffer[9] & 0xc0; const uint8_t mode = m_command_buffer[9] & 0xc0;
LOGCMD("0xd8 SET AUDIO PLAYBACK START POSITION (NEC): mode %02x\n", mode); LOGCMD("0xd8 SET AUDIO PLAYBACK START POSITION (NEC): mode %02x\n", mode);
if (!m_cdrom) if (!m_cdrom->exists())
{ {
/* Throw some error here */ // TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return; return;
} }
@ -555,14 +557,13 @@ void pce_cd_device::nec_set_audio_stop_position()
const uint8_t mode = m_command_buffer[9] & 0xc0; const uint8_t mode = m_command_buffer[9] & 0xc0;
LOGCMD("0xd9 SET AUDIO PLAYBACK END POSITION (NEC): mode %02x\n", mode); LOGCMD("0xd9 SET AUDIO PLAYBACK END POSITION (NEC): mode %02x\n", mode);
if (!m_cdrom) if (!m_cdrom->exists())
{ {
/* Throw some error here */ // TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return; return;
} }
switch (mode) switch (mode)
{ {
case 0x00: case 0x00:
@ -642,8 +643,9 @@ void pce_cd_device::nec_set_audio_stop_position()
void pce_cd_device::nec_pause() void pce_cd_device::nec_pause()
{ {
/* If no cd mounted throw an error */ /* If no cd mounted throw an error */
if (!m_cdrom) if (!m_cdrom->exists())
{ {
// TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return; return;
} }
@ -653,6 +655,7 @@ void pce_cd_device::nec_pause()
/* If there was no cdda playing, throw an error */ /* If there was no cdda playing, throw an error */
if (m_cdda_status == PCE_CD_CDDA_OFF) if (m_cdda_status == PCE_CD_CDDA_OFF)
{ {
// TODO: sense key/ASC/ASCQ
LOG("Issued SCSI_CHECK_CONDITION in 0xda!\n"); LOG("Issued SCSI_CHECK_CONDITION in 0xda!\n");
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return; return;
@ -672,9 +675,9 @@ void pce_cd_device::nec_get_subq()
uint32_t msf_abs, msf_rel, track, frame; uint32_t msf_abs, msf_rel, track, frame;
//LOGCMD("0xdd READ SUBCHANNEL Q (NEC) %d\n", m_cdda_status); //LOGCMD("0xdd READ SUBCHANNEL Q (NEC) %d\n", m_cdda_status);
if (!m_cdrom) if (!m_cdrom->exists())
{ {
/* Throw some error here */ // TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return; return;
} }
@ -739,10 +742,11 @@ void pce_cd_device::nec_get_dir_info()
uint32_t frame, msf, track = 0; uint32_t frame, msf, track = 0;
LOGCMD("0xde GET DIR INFO (NEC)\n"); LOGCMD("0xde GET DIR INFO (NEC)\n");
if (!m_cdrom) if (!m_cdrom->exists())
{ {
/* Throw some error here */ // TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
return;
} }
const cdrom_file::toc &toc = m_cdrom->get_toc(); const cdrom_file::toc &toc = m_cdrom->get_toc();
@ -807,6 +811,7 @@ void pce_cd_device::nec_get_dir_info()
void pce_cd_device::end_of_list() void pce_cd_device::end_of_list()
{ {
// TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION); reply_status_byte(SCSI_CHECK_CONDITION);
} }