From e9dcdb5200d93f888d0102a618327e064b07aea2 Mon Sep 17 00:00:00 2001 From: 987123879113 <63495610+987123879113@users.noreply.github.com> Date: Sat, 9 Nov 2024 00:13:46 +0900 Subject: 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. --- src/devices/machine/t10mmc.cpp | 16 ++++++++++++++-- src/lib/util/cdrom.cpp | 38 +++++++++++++++++++++++++++++++++++++- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/devices/machine/t10mmc.cpp b/src/devices/machine/t10mmc.cpp index eac2c97f6d0..e41798af1cf 100644 --- a/src/devices/machine/t10mmc.cpp +++ b/src/devices/machine/t10mmc.cpp @@ -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); diff --git a/src/lib/util/cdrom.cpp b/src/lib/util/cdrom.cpp index 76f3fe55155..8b60db1ae62 100644 --- a/src/lib/util/cdrom.cpp +++ b/src/lib/util/cdrom.cpp @@ -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; -- cgit v1.2.3