Implement READ ATIP command.

This commit is contained in:
2025-09-24 04:43:33 +01:00
parent 864bd03c99
commit 6498914df9
3 changed files with 50 additions and 0 deletions

View File

@@ -2164,6 +2164,50 @@ cdrom_read_pma(const cdrom_t *dev, uint8_t *b, const int max_len)
return 4; 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 int
cdrom_read_toc(const cdrom_t *dev, uint8_t *b, const int type, 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) const uint8_t start_track, const int msf, const int max_len)

View File

@@ -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, 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); 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_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, 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); const int msf, const int max_len);
#ifdef USE_CDROM_MITSUMI #ifdef USE_CDROM_MITSUMI

View File

@@ -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) { } else if (toc_format == 3 && dev->drv->cd_status == CD_STATUS_BLANK_CDR) {
len = cdrom_read_pma(dev->drv, dev->buffer, max_len); 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_set_buf_len(dev, BufLen, &len);
scsi_cdrom_data_command_finish(dev, len, len, len, 0); scsi_cdrom_data_command_finish(dev, len, len, len, 0);
} else } else