Implement READ BUFFER CAPACITY command for CD-ROM

This commit is contained in:
2025-09-24 17:50:05 +01:00
parent a46d1365d9
commit d7e918dabe
4 changed files with 59 additions and 0 deletions

View File

@@ -3455,4 +3455,39 @@ int
cdrom_send_cuesheet(cdrom_t *dev, const uint8_t *buffer, int len)
{
return dev->ops->send_cuesheet(dev->local, buffer, len);
}
int
cdrom_read_buffer_capacity(cdrom_t *dev, uint8_t *buffer, int block)
{
/* Buffer capacity hardcoded to 1MiB */
memset(buffer, 0, 12);
buffer[0] = 0x00; /* Data Length (MSB) */
buffer[1] = 0x0a; /* Data Length (LSB) */
buffer[2] = 0x00; /* Reserved */
buffer[3] = 0x00; /* Reserved */
if (block) { /* 512 blocks */
buffer[4] = 0x00; /* Length of the Buffer (MSB...) */
buffer[5] = 0x00; /* ... */
buffer[6] = 0x02; /* ... */
buffer[7] = 0x00; /* Length of the Buffer (...LSB) */
buffer[8] = 0x00; /* Blank Length of the Buffer (MSB...) */
buffer[9] = 0x00; /* ... */
buffer[10] = 0x00; /* ... */
buffer[11] = 0x00; /* Blank Length of the Buffer (...LSB) */
}
else { /* 1048576 bytes */
buffer[4] = 0x00; /* Length of the Buffer (MSB...) */
buffer[5] = 0x10; /* ... */
buffer[6] = 0x00; /* ... */
buffer[7] = 0x00; /* Length of the Buffer (...LSB) */
buffer[8] = 0x00; /* Blank Length of the Buffer (MSB...) */
buffer[9] = 0x10; /* ... */
buffer[10] = 0x00; /* ... */
buffer[11] = 0x00; /* Blank Length of the Buffer (...LSB) */
}
return 12;
}

View File

@@ -491,6 +491,7 @@ extern void cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, co
extern unsigned long cdrom_crc32(unsigned long crc, const unsigned char *buf,
size_t len);
extern int cdrom_send_cuesheet(cdrom_t *dev, const uint8_t *buffer, int len);
extern int cdrom_read_buffer_capacity(cdrom_t *dev, uint8_t *buffer, int block);
extern int cdrom_assigned_letters;

View File

@@ -92,6 +92,7 @@
#define GPCMD_READ_TRACK_INFORMATION 0x52
#define GPCMD_MODE_SELECT_10 0x55
#define GPCMD_MODE_SENSE_10 0x5a
#define GPCMD_READ_BUFFER_CAPACITY 0x5c
#define GPCMD_SEND_CUE_SHEET 0x5d
#define GPCMD_PLAY_AUDIO_12 0xa5
#define GPCMD_READ_12 0xa8

View File

@@ -98,6 +98,7 @@ uint8_t scsi_cdrom_command_flags[0x100] = {
[0x51 ... 0x52] = IMPLEMENTED | CHECK_READY,
[0x55] = IMPLEMENTED,
[0x5a] = IMPLEMENTED,
[0x5c] = IMPLEMENTED | CHECK_READY,
[0x5d] = IMPLEMENTED | CHECK_READY,
[0xa5] = IMPLEMENTED | CHECK_READY,
[0xa8 ... 0xa9] = IMPLEMENTED | CHECK_READY,
@@ -3704,6 +3705,27 @@ atapi_out:
scsi_cdrom_command_complete(dev);
break;
case GPCMD_READ_BUFFER_CAPACITY:
scsi_cdrom_set_phase(dev, SCSI_PHASE_DATA_IN);
scsi_cdrom_buf_alloc(dev, 12);
memset(dev->buffer, 0, 12);
int block = cdb[1] & 1;
len = cdrom_read_buffer_capacity(dev->drv, dev->buffer, block);
if (len < 0) {
scsi_cdrom_invalid_field(dev, cdb[1]);
break;
}
scsi_cdrom_set_buf_len(dev, BufLen, &len);
scsi_cdrom_data_command_finish(dev, len, len, len, 0);
break;
default:
scsi_cdrom_illegal_opcode(dev, dev->current_cdb[0]);
break;