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
/**************************************************************************************************
PC Engine CD HW notes:
PC Engine CD HW sub-portion:
TODO:
- Rewrite SCSI to honor actual nscsi_device;
@ -23,6 +23,7 @@ TODO:
- Audio CD player rewind/fast forward don't work properly
\- never go past 1 minute mark, underflows;
- 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()
{
LOGCMD("0x00 TEST UNIT READY: status send ");
if (m_cdrom)
if (m_cdrom->exists())
{
LOGCMD("STATUS_OK\n");
reply_status_byte(SCSI_STATUS_OK);
}
else
{
// TODO: sense key/ASC/ASCQ
LOGCMD("CHECK_CONDITION\n");
reply_status_byte(SCSI_CHECK_CONDITION);
}
@ -397,9 +399,9 @@ void pce_cd_device::read_6()
uint32_t frame_count = m_command_buffer[4];
LOGCMD("0x08 READ(6): frame: %08x size: %08x\n", frame, frame_count);
/* Check for presence of a CD */
if (!m_cdrom)
if (!m_cdrom->exists())
{
// TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION);
return;
}
@ -437,9 +439,9 @@ void pce_cd_device::nec_set_audio_start_position()
const uint8_t mode = m_command_buffer[9] & 0xc0;
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);
return;
}
@ -555,14 +557,13 @@ void pce_cd_device::nec_set_audio_stop_position()
const uint8_t mode = m_command_buffer[9] & 0xc0;
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);
return;
}
switch (mode)
{
case 0x00:
@ -642,8 +643,9 @@ void pce_cd_device::nec_set_audio_stop_position()
void pce_cd_device::nec_pause()
{
/* 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);
return;
}
@ -653,6 +655,7 @@ void pce_cd_device::nec_pause()
/* If there was no cdda playing, throw an error */
if (m_cdda_status == PCE_CD_CDDA_OFF)
{
// TODO: sense key/ASC/ASCQ
LOG("Issued SCSI_CHECK_CONDITION in 0xda!\n");
reply_status_byte(SCSI_CHECK_CONDITION);
return;
@ -672,9 +675,9 @@ void pce_cd_device::nec_get_subq()
uint32_t msf_abs, msf_rel, track, frame;
//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);
return;
}
@ -739,10 +742,11 @@ void pce_cd_device::nec_get_dir_info()
uint32_t frame, msf, track = 0;
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);
return;
}
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()
{
// TODO: sense key/ASC/ASCQ
reply_status_byte(SCSI_CHECK_CONDITION);
}