diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index f78a0ebf2..d843910f3 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -2801,7 +2801,7 @@ cdrom_read_disc_information(const cdrom_t *dev, uint8_t *buffer) int ls_last = 0; int t_b0 = -1; - if (dev->cd_status == CD_STATUS_BLANK_CDR) { + if (dev->blank_media == CD_BLANK_CDR) { memset(buffer, 0x00, 34); buffer[ 0] = 0x00; /* Disc Information Length (MSB) */ @@ -3117,7 +3117,8 @@ cdrom_insert_blank(cdrom_t *dev, const char *fn) // All looking good, reset state dev->seek_pos = 0; dev->cd_buflen = 0; - dev->cd_status = CD_STATUS_BLANK_CDR; + dev->cd_status = CD_STATUS_DATA_ONLY; + dev->blank_media = CD_BLANK_CDR; dev->cdrom_capacity = 0; cdrom_log(dev->log, "Blank CD-R created\n"); cdrom_insert(dev->id); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 7ca361f88..c52bd6826 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -31,10 +31,11 @@ #define CD_STATUS_HOLD 8 #define CD_STATUS_DVD_REJECTED 16 #define CD_STATUS_HAS_AUDIO 0xc -#define CD_STATUS_BLANK_CDR 0x20 -#define CD_STATUS_BLANK_MASK 0x20 #define CD_STATUS_MASK 0x2f +#define CD_BLANK_NOT 0x00 +#define CD_BLANK_CDR 0x01 + /* Medium changed flag. */ #define CD_STATUS_TRANSITION 0x40 #define CD_STATUS_MEDIUM_CHANGED 0x80 @@ -310,6 +311,7 @@ typedef struct cdrom { Bit 1 = DMA supportd. */ uint8_t cd_status; /* Struct variable reserved for media status. */ + uint8_t blank_media; uint8_t speed; uint8_t cur_speed; diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 5ace65f02..571f32d39 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2643,7 +2643,7 @@ scsi_cdrom_command(scsi_common_t *sc, const uint8_t *cdb) scsi_cdrom_not_ready(dev); else if (toc_format < 3) { // Blank discs return invalid field when asked for a TOC - if (dev->drv->cd_status & CD_STATUS_BLANK_MASK) { + if (dev->drv->blank_media) { scsi_cdrom_invalid_field(dev, toc_format); break; } @@ -2658,12 +2658,12 @@ 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) { + } else if (toc_format == 3 && dev->drv->blank_media == CD_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) { + } else if (toc_format == 4 && dev->drv->blank_media == CD_BLANK_CDR) { len = cdrom_read_atip(dev->drv, dev->buffer, max_len); scsi_cdrom_set_buf_len(dev, BufLen, &len); @@ -3661,6 +3661,14 @@ atapi_out: dev->buffer[6] = 8; len = 8; + // Undo the overflow if disc capacity is blank + if (dev->drv->blank_media) { + dev->buffer[0] = 0x00; + dev->buffer[1] = 0x00; + dev->buffer[2] = 0x00; + dev->buffer[3] = 0x00; + } + scsi_cdrom_log(dev->log, "CD-ROM Capacity: %08X\n", dev->drv->cdrom_capacity - 1);