diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 4f2704f05..f78a0ebf2 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -2164,6 +2164,50 @@ cdrom_read_pma(const cdrom_t *dev, uint8_t *b, const int max_len) return 4; } +int +cdrom_read_atip(const cdrom_t *dev, uint8_t *b, const int max_len) +{ + if (max_len < 28) + return -1; + + b[ 0] = 0x00; /* ATIP Data Length (MSB) */ + b[ 1] = 0x1a; /* ATIP Data Length (LSB) */ + b[ 2] = 0x00; /* Reserved */ + b[ 3] = 0x00; /* Reserved */ + // Special Information 1 + b[ 4] = 0xd0; /* Indicative Target Writing Power, Reference Speed */ + b[ 5] = 0x00; /* URU */ + b[ 6] = 0x98; /* 1, Disc Type, Disc Sub-Type, A1 Valid, A2 Valid, A3 Valid*/ + b[ 7] = 0x00; /* Reserved*/ + // Special Information 2 + b[ 8] = 0x61; /* ATIP Start Time of Lead-in (Min) */ + b[ 9] = 0x1a; /* ATIP Start Time of Lead-in (Sec) */ + b[10] = 0x42; /* ATIP Start Time of Lead-in (Frame) */ + b[11] = 0x00; /* Reserved */ + // Special Information 3 + b[12] = 0x4f; /* ATIP Last Possible Start of Lead-out (Min) */ + b[13] = 0x3b; /* ATIP Last Possible Start of Lead-out (Sec) */ + b[14] = 0x47; /* ATIP Last Possible Start of Lead-out (Frame) */ + b[15] = 0x00; /* Reserved */ + // Additional Information 1 + b[16] = 0x00; /* A1 Values */ + b[17] = 0x00; /* A1 Values */ + b[18] = 0x80; /* A1 Values */ + b[19] = 0x00; /* Reserved */ + // Additional Information 2 + b[20] = 0x00; /* A2 Values */ + b[21] = 0x80; /* A2 Values */ + b[22] = 0x00; /* A2 Values */ + b[23] = 0x00; /* Reserved */ + // Additional Information 3 + b[24] = 0x00; /* A3 Values */ + b[25] = 0x80; /* A3 Values */ + b[26] = 0x80; /* A3 Values */ + b[27] = 0x00; /* Reserved */ + + return 28; +} + 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 e13431c62..7ca361f88 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -447,6 +447,7 @@ extern uint8_t cdrom_get_current_subcodeq_playstatus(cdrom_t *dev, uint8 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_atip(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 c6e26c09a..5ace65f02 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2661,6 +2661,11 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) } 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 if (toc_format == 4 && dev->drv->cd_status == CD_STATUS_BLANK_CDR) { + len = cdrom_read_atip(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