machine/t10mmc.cpp: Added stub CD-TEXT TOC read; util/cdrom.cpp: Handle control flags in TOC files. (#12954)

* machine/t10mmc.cpp: Return dummy data for CD-TEXT format TOC read.
* machine/t10mmc.cpp: Fixed bug in track transition.
* util/cdrom.cpp: Handle track type and serial copy management flags in TOC file input.
This commit is contained in:
987123879113 2024-11-09 00:13:46 +09:00 committed by GitHub
parent c814f0856a
commit e9dcdb5200
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 51 additions and 3 deletions

View File

@ -265,6 +265,10 @@ void t10mmc::ExecCommand()
break;
}
case TOC_FORMAT_CDTEXT:
length = 4;
break;
default:
m_device->logerror("T10MMC: Unhandled READ TOC format %d\n", toc_format());
length = 0;
@ -622,8 +626,8 @@ void t10mmc::ExecCommand()
auto track_type = m_image->get_track_type(trk);
// If there's a transition between CD data and CD audio anywhere in the requested range then return an error
if ((last_track_type == cdrom_file::CD_TRACK_AUDIO && track_type != cdrom_file::CD_TRACK_AUDIO)
|| (last_track_type != cdrom_file::CD_TRACK_AUDIO && track_type == cdrom_file::CD_TRACK_AUDIO))
if (last_track_type != -1 && ((last_track_type == cdrom_file::CD_TRACK_AUDIO && track_type != cdrom_file::CD_TRACK_AUDIO)
|| (last_track_type != cdrom_file::CD_TRACK_AUDIO && track_type == cdrom_file::CD_TRACK_AUDIO)))
{
set_sense(SCSI_SENSE_KEY_ILLEGAL_REQUEST, SCSI_SENSE_ASC_ASCQ_ILLEGAL_MODE_FOR_THIS_TRACK);
@ -1466,6 +1470,14 @@ void t10mmc::ReadData( uint8_t *data, int dataLength )
break;
}
case TOC_FORMAT_CDTEXT:
{
put_u16be(&data[0], 0); // length
data[2] = 0; // first track/session/reserved
data[3] = 0; // last track/session/reserved
break;
}
default:
m_device->logerror("T10MMC: Unhandled READ TOC format %d\n", toc_format());
std::fill_n(data, dataLength, 0);

View File

@ -2886,7 +2886,43 @@ std::error_condition cdrom_file::parse_toc(std::string_view tocfname, toc &outto
TOKENIZE
if ((!strcmp(token, "DATAFILE")) || (!strcmp(token, "AUDIOFILE")) || (!strcmp(token, "FILE")))
/*
Samples: https://github.com/cdrdao/cdrdao/tree/master/testtocs
Unimplemented:
CD_TEXT
SILENCE
ZERO
FIFO
PREGAP
CATALOG
ISRC
*/
if (!strcmp(token, "NO"))
{
TOKENIZE
if (!strcmp(token, "COPY"))
outtoc.tracks[trknum].control_flags &= ~CD_FLAG_CONTROL_DIGITAL_COPY_PERMITTED;
else if (!strcmp(token, "PRE_EMPHASIS"))
outtoc.tracks[trknum].control_flags &= ~CD_FLAG_CONTROL_PREEMPHASIS;
}
else if (!strcmp(token, "COPY"))
{
outtoc.tracks[trknum].control_flags |= CD_FLAG_CONTROL_DIGITAL_COPY_PERMITTED;
}
else if (!strcmp(token, "PRE_EMPHASIS"))
{
outtoc.tracks[trknum].control_flags |= CD_FLAG_CONTROL_PREEMPHASIS;
}
else if (!strcmp(token, "TWO_CHANNEL_AUDIO"))
{
outtoc.tracks[trknum].control_flags &= ~CD_FLAG_CONTROL_4CH;
}
else if (!strcmp(token, "FOUR_CHANNEL_AUDIO"))
{
outtoc.tracks[trknum].control_flags |= CD_FLAG_CONTROL_4CH;
}
else if ((!strcmp(token, "DATAFILE")) || (!strcmp(token, "AUDIOFILE")) || (!strcmp(token, "FILE")))
{
int f;