From 864bd03c999c1b693eee27ed1043e818424432b4 Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Wed, 24 Sep 2025 04:21:30 +0100 Subject: [PATCH] Implement READ PMA command. --- src/cdrom/cdrom.c | 15 +++++++++++++++ src/include/86box/cdrom.h | 1 + src/scsi/scsi_cdrom.c | 5 +++++ 3 files changed, 21 insertions(+) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index c59ba033d..4f2704f05 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -2149,6 +2149,21 @@ cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b) return ret; } +int +cdrom_read_pma(const cdrom_t *dev, uint8_t *b, const int max_len) +{ + if (max_len < 4) + return -1; + + // This is exactly what a blank CD-R returns, no PMA, seems only CD-RWs have PMA? + b[0] = 0x00; /* PMA Data Length (MSB) */ + b[1] = 0x02; /* PMA Data Length (LSB) */ + b[2] = 0x00; /* Reserved */ + b[3] = 0x00; /* Reserved */ + + return 4; +} + int cdrom_read_toc(const cdrom_t *dev, uint8_t *b, const int type, const uint8_t start_track, const int msf, const int max_len) diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 9ab7e58cc..e13431c62 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -446,6 +446,7 @@ extern void cdrom_get_current_subcodeq(cdrom_t *dev, uint8_t *b); extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8_t *b); extern int cdrom_read_toc(const cdrom_t *dev, uint8_t *b, const int type, const uint8_t start_track, const int msf, const int max_len); +extern int cdrom_read_pma(const cdrom_t *dev, uint8_t *b, const int max_len); extern int cdrom_read_toc_sony(const cdrom_t *dev, uint8_t *b, const uint8_t start_track, const int msf, const int max_len); #ifdef USE_CDROM_MITSUMI diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 9dd5fb65d..c6e26c09a 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2658,6 +2658,11 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) scsi_cdrom_set_buf_len(dev, BufLen, &len); scsi_cdrom_data_command_finish(dev, len, len, len, 0); } + } else if (toc_format == 3 && dev->drv->cd_status == CD_STATUS_BLANK_CDR) { + len = cdrom_read_pma(dev->drv, dev->buffer, max_len); + + scsi_cdrom_set_buf_len(dev, BufLen, &len); + scsi_cdrom_data_command_finish(dev, len, len, len, 0); } else scsi_cdrom_invalid_field(dev, toc_format); break;