diff --git a/src/devices/cdrom/cdrom.c b/src/devices/cdrom/cdrom.c index 0444f6a..4449f53 100644 --- a/src/devices/cdrom/cdrom.c +++ b/src/devices/cdrom/cdrom.c @@ -8,7 +8,7 @@ * * Generic interface for CD-ROM/DVD/BD implementations. * - * Version: @(#)cdrom.c 1.0.21 2018/10/18 + * Version: @(#)cdrom.c 1.0.22 2018/10/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -51,7 +51,6 @@ #include "../sound/sound.h" #include "cdrom.h" #include "cdrom_image.h" -#include "cdrom_null.h" #define MIN_SEEK 2000 @@ -140,6 +139,11 @@ cdrom_playing_completed(cdrom_t *dev) if (dev->ops && dev->ops->status) dev->cd_status = dev->ops->status(dev); + else { + dev->cd_status = CD_STATUS_EMPTY; + + return 0; + } if (((dev->prev_status == CD_STATUS_PLAYING) || (dev->prev_status == CD_STATUS_PAUSED)) && @@ -197,14 +201,12 @@ cdrom_hard_reset(void) break; } - if (dev->host_drive == 200) { cdrom_image_open(dev, dev->image_path); if (dev->reset) dev->reset(dev); - } else - cdrom_null_open(dev); + } } } @@ -223,6 +225,7 @@ cdrom_close(void) if (dev->ops && dev->ops->close) dev->ops->close(dev); + dev->ops = NULL; if (dev->close) dev->close(dev->p); @@ -283,8 +286,6 @@ cdrom_eject(uint8_t id) memset(dev->image_path, 0, sizeof(dev->image_path)); - cdrom_null_open(dev); - cdrom_insert(id); } @@ -314,6 +315,7 @@ cdrom_reload(uint8_t id) wcscpy(dev->image_path, dev->prev_image_path); free(dev->prev_image_path); dev->prev_image_path = NULL; + cdrom_image_open(dev, dev->image_path); cdrom_insert(id); @@ -362,7 +364,7 @@ cdrom_notify(const char *drive, int present) dev = &cdrom[i]; if (dev->host_drive == *drive) { - if (dev->ops->notify_change) + if (dev->ops && dev->ops->notify_change) dev->ops->notify_change(dev, present); } } @@ -376,12 +378,8 @@ cdrom_string_to_bus(const char *str) if (! strcmp(str, "none")) return(ret); - if (! strcmp(str, "ide") || !strcmp(str, "atapi") -#if 1 - || !strcmp(str, "ide_pio_only") || !strcmp(str, "ide_pio_and_dma") - || !strcmp(str, "atapi_pio_only") || !strcmp(str, "atapi_pio_and_dma") -#endif - ) return(CDROM_BUS_ATAPI); + if (! strcmp(str, "ide") || !strcmp(str, "atapi")) + return(CDROM_BUS_ATAPI); if (! strcmp(str, "scsi")) return(CDROM_BUS_SCSI); diff --git a/src/devices/cdrom/cdrom.h b/src/devices/cdrom/cdrom.h index ef61809..bd01e15 100644 --- a/src/devices/cdrom/cdrom.h +++ b/src/devices/cdrom/cdrom.h @@ -51,6 +51,7 @@ #define BUF_SIZE 32768 +#define CDROM_EMPTY (dev->host_drive == 0) #define CDROM_IMAGE 200 diff --git a/src/devices/cdrom/cdrom_image.cpp b/src/devices/cdrom/cdrom_image.cpp index 38968f8..e48647f 100644 --- a/src/devices/cdrom/cdrom_image.cpp +++ b/src/devices/cdrom/cdrom_image.cpp @@ -8,7 +8,7 @@ * * CD-ROM image support. * - * Version: @(#)cdrom_image.cpp 1.0.14 2018/10/18 + * Version: @(#)cdrom_image.cpp 1.0.15 2018/10/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -51,7 +51,6 @@ #include "cdrom.h" #include "cdrom_image.h" #include "cdrom_dosbox.h" -#include "cdrom_null.h" #ifdef ENABLE_CDROM_IMAGE_LOG @@ -182,14 +181,14 @@ audio_callback(cdrom_t *dev, int16_t *output, int len) static void -audio_stop(cdrom_t *dev) /* audio_stop */ +audio_stop(cdrom_t *dev) { dev->cd_state = CD_STOPPED; } static uint8_t -audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf) +audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int is_msf) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; int number; @@ -207,13 +206,13 @@ audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf) return 0; } - DEBUG("Play audio - %08X %08X %i\n", pos, len, ismsf); - if (ismsf == 2) { + DEBUG("Play audio - %08X %08X %i\n", pos, len, is_msf); + if (is_msf == 2) { img->GetAudioTrackInfo(pos, number, tmsf, attr); pos = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; img->GetAudioTrackInfo(len, number, tmsf, attr); len = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; - } else if (ismsf == 1) { + } else if (is_msf == 1) { m = (pos >> 16) & 0xff; s = (pos >> 8) & 0xff; f = pos & 0xff; @@ -230,7 +229,7 @@ audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf) len = MSFtoLBA(m, s, f) - 150; DEBUG("MSF - pos = %08X len = %08X\n", pos, len); - } else if (ismsf == 0) { + } else if (is_msf == 0) { if (pos == 0xffffffff) { DEBUG("Playing from current position\n"); pos = dev->seek_pos; @@ -300,7 +299,8 @@ image_get_last_block(cdrom_t *dev) for (c = 0; c <= last_track; c++) { img->GetAudioTrackInfo(c+1, number, tmsf, attr); - address = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; /* Do the - 150 here as well. */ + + address = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; if (address > lb) lb = address; } @@ -368,7 +368,7 @@ image_getcurrentsubchannel(cdrom_t *dev, uint8_t *b, int msf) static int -image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf) +image_is_track_audio(cdrom_t *dev, uint32_t pos, int is_msf) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; uint8_t attr; @@ -378,7 +378,7 @@ image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf) if (!img || dev->img_is_iso) return 0; - if (ismsf) { + if (is_msf) { m = (pos >> 16) & 0xff; s = (pos >> 8) & 0xff; f = pos & 0xff; @@ -488,7 +488,7 @@ read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b) static void -read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) +read_mode1(cdrom_t *dev, int flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; @@ -501,22 +501,22 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int cdrom_sector_size = 0; - if (cdrom_sector_flags & 0x80) { /* Sync */ + if (flags & 0x80) { /* Sync */ DEBUG("CD-ROM %i: [Mode 1] Sync\n", dev->id); memcpy(b, raw_buffer, 12); cdrom_sector_size += 12; b += 12; } - if (cdrom_sector_flags & 0x20) { /* Header */ + if (flags & 0x20) { /* Header */ DEBUG("CD-ROM %i: [Mode 1] Header\n", dev->id); memcpy(b, raw_buffer + 12, 4); cdrom_sector_size += 4; b += 4; } - if (cdrom_sector_flags & 0x40) { /* Sub-header */ - if (!(cdrom_sector_flags & 0x10)) { /* No user data */ + if (flags & 0x40) { /* Sub-header */ + if (!(flags & 0x10)) { /* No user data */ DEBUG("CD-ROM %i: [Mode 1] Sub-header\n", dev->id); memcpy(b, raw_buffer + 16, 8); cdrom_sector_size += 8; @@ -524,14 +524,14 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int } } - if (cdrom_sector_flags & 0x10) { /* User data */ + if (flags & 0x10) { /* User data */ DEBUG("CD-ROM %i: [Mode 1] User data\n", dev->id); memcpy(b, raw_buffer + 16, 2048); cdrom_sector_size += 2048; b += 2048; } - if (cdrom_sector_flags & 0x08) { /* EDC/ECC */ + if (flags & 0x08) { /* EDC/ECC */ DEBUG("CD-ROM %i: [Mode 1] EDC/ECC\n", dev->id); memcpy(b, raw_buffer + 2064, 288); cdrom_sector_size += 288; @@ -541,7 +541,7 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int static void -read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) +read_mode2_non_xa(cdrom_t *dev, int flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; @@ -554,14 +554,14 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m cdrom_sector_size = 0; - if (cdrom_sector_flags & 0x80) { /* Sync */ + if (flags & 0x80) { /* Sync */ DEBUG("CD-ROM %i: [Mode 2 Formless] Sync\n", dev->id); memcpy(b, raw_buffer, 12); cdrom_sector_size += 12; b += 12; } - if (cdrom_sector_flags & 0x20) { /* Header */ + if (flags & 0x20) { /* Header */ DEBUG("CD-ROM %i: [Mode 2 Formless] Header\n", dev->id); memcpy(b, raw_buffer + 12, 4); cdrom_sector_size += 4; @@ -569,14 +569,14 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m } /* Mode 1 sector, expected type is 1 type. */ - if (cdrom_sector_flags & 0x40) { /* Sub-header */ + if (flags & 0x40) { /* Sub-header */ DEBUG("CD-ROM %i: [Mode 2 Formless] Sub-header\n", dev->id); memcpy(b, raw_buffer + 16, 8); cdrom_sector_size += 8; b += 8; } - if (cdrom_sector_flags & 0x10) { /* User data */ + if (flags & 0x10) { /* User data */ DEBUG("CD-ROM %i: [Mode 2 Formless] User data\n", dev->id); memcpy(b, raw_buffer + 24, 2336); cdrom_sector_size += 2336; @@ -586,7 +586,7 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m static void -read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) +read_mode2_xa_form1(cdrom_t *dev, int flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; @@ -599,35 +599,35 @@ read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t cdrom_sector_size = 0; - if (cdrom_sector_flags & 0x80) { /* Sync */ + if (flags & 0x80) { /* Sync */ DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Sync\n", dev->id); memcpy(b, raw_buffer, 12); cdrom_sector_size += 12; b += 12; } - if (cdrom_sector_flags & 0x20) { /* Header */ + if (flags & 0x20) { /* Header */ DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Header\n", dev->id); memcpy(b, raw_buffer + 12, 4); cdrom_sector_size += 4; b += 4; } - if (cdrom_sector_flags & 0x40) { /* Sub-header */ + if (flags & 0x40) { /* Sub-header */ DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Sub-header\n", dev->id); memcpy(b, raw_buffer + 16, 8); cdrom_sector_size += 8; b += 8; } - if (cdrom_sector_flags & 0x10) { /* User data */ + if (flags & 0x10) { /* User data */ DEBUG("CD-ROM %i: [XA Mode 2 Form 1] User data\n", dev->id); memcpy(b, raw_buffer + 24, 2048); cdrom_sector_size += 2048; b += 2048; } - if (cdrom_sector_flags & 0x08) { /* EDC/ECC */ + if (flags & 0x08) { /* EDC/ECC */ DEBUG("CD-ROM %i: [XA Mode 2 Form 1] EDC/ECC\n", dev->id); memcpy(b, raw_buffer + 2072, 280); cdrom_sector_size += 280; @@ -637,7 +637,7 @@ read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t static void -read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) +read_mode2_xa_form2(cdrom_t *dev, int flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; @@ -650,28 +650,28 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t cdrom_sector_size = 0; - if (cdrom_sector_flags & 0x80) { /* Sync */ + if (flags & 0x80) { /* Sync */ DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Sync\n", dev->id); memcpy(b, raw_buffer, 12); cdrom_sector_size += 12; b += 12; } - if (cdrom_sector_flags & 0x20) { /* Header */ + if (flags & 0x20) { /* Header */ DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Header\n", dev->id); memcpy(b, raw_buffer + 12, 4); cdrom_sector_size += 4; b += 4; } - if (cdrom_sector_flags & 0x40) { /* Sub-header */ + if (flags & 0x40) { /* Sub-header */ DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Sub-header\n", dev->id); memcpy(b, raw_buffer + 16, 8); cdrom_sector_size += 8; b += 8; } - if (cdrom_sector_flags & 0x10) { /* User data */ + if (flags & 0x10) { /* User data */ DEBUG("CD-ROM %i: [XA Mode 2 Form 2] User data\n", dev->id); memcpy(b, raw_buffer + 24, 2328); cdrom_sector_size += 2328; @@ -681,8 +681,8 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t static int -image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, - int cdrom_sector_type, int cdrom_sector_flags, int *len) +image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int is_msf, + int type, int flags, int *len) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; uint8_t *b, *temp_b; @@ -696,7 +696,7 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, *len = 0; - if (ismsf) { + if (is_msf) { m = (sector >> 16) & 0xff; s = (sector >> 8) & 0xff; f = sector & 0xff; @@ -711,7 +711,7 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, audio = 0; mode2 = img->IsMode2(lba) ? 1 : 0; } else { - audio = image_is_track_audio(dev, sector, ismsf); + audio = image_is_track_audio(dev, sector, is_msf); mode2 = img->IsMode2(lba) ? 1 : 0; } mode2 <<= 2; @@ -720,67 +720,67 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, memset(raw_buffer, 0, 2448); memset(extra_buffer, 0, 296); - if (!(cdrom_sector_flags & 0xf0)) { /* 0x00 and 0x08 are illegal modes */ + if (!(flags & 0xf0)) { /* 0x00 and 0x08 are illegal modes */ DEBUG("CD-ROM %i: [Mode 1] 0x00 and 0x08 are illegal modes\n", dev->id); return 0; } - if (!is_legal(dev->id, cdrom_sector_type, cdrom_sector_flags, audio, mode2)) + if (!is_legal(dev->id, type, flags, audio, mode2)) return 0; - if ((cdrom_sector_type == 3) || ((cdrom_sector_type > 4) && (cdrom_sector_type != 8))) { - if (cdrom_sector_type == 3) { + if ((type == 3) || ((type > 4) && (type != 8))) { + if (type == 3) { DEBUG("CD-ROM %i: Attempting to read a Yellowbook Mode 2 data sector from an image\n", dev->id); } - if (cdrom_sector_type > 4) { + if (type > 4) { DEBUG("CD-ROM %i: Attempting to read a XA Mode 2 Form 2 data sector from an image\n", dev->id); } return 0; - } else if (cdrom_sector_type == 1) { + } else if (type == 1) { if (!audio || dev->img_is_iso) { DEBUG("CD-ROM %i: [Audio] Attempting to read an audio sector from a data image\n", dev->id); return 0; } read_audio(dev, lba, temp_b); - } else if (cdrom_sector_type == 2) { + } else if (type == 2) { if (audio || mode2) { DEBUG("CD-ROM %i: [Mode 1] Attempting to read a sector of another type\n", dev->id); return 0; } - read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); - } else if (cdrom_sector_type == 3) { + read_mode1(dev, flags, lba, msf, mode2, temp_b); + } else if (type == 3) { if (audio || !mode2 || (mode2 & 0x03)) { DEBUG("CD-ROM %i: [Mode 2 Formless] Attempting to read a sector of another type\n", dev->id); return 0; } - read_mode2_non_xa(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); - } else if (cdrom_sector_type == 4) { + read_mode2_non_xa(dev, flags, lba, msf, mode2, temp_b); + } else if (type == 4) { if (audio || !mode2 || ((mode2 & 0x03) != 1)) { DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Attempting to read a sector of another type\n", dev->id); return 0; } - read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); - } else if (cdrom_sector_type == 5) { + read_mode2_xa_form1(dev, flags, lba, msf, mode2, temp_b); + } else if (type == 5) { if (audio || !mode2 || ((mode2 & 0x03) != 2)) { DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Attempting to read a sector of another type\n", dev->id); return 0; } - read_mode2_xa_form2(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); - } else if (cdrom_sector_type == 8) { + read_mode2_xa_form2(dev, flags, lba, msf, mode2, temp_b); + } else if (type == 8) { if (audio) { DEBUG("CD-ROM %i: [Any Data] Attempting to read a data sector from an audio track\n", dev->id); return 0; } if (mode2 && ((mode2 & 0x03) == 1)) - read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + read_mode2_xa_form1(dev, flags, lba, msf, mode2, temp_b); else if (!mode2) - read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + read_mode1(dev, flags, lba, msf, mode2, temp_b); else { DEBUG("CD-ROM %i: [Any Data] Attempting to read a data sector whose cooked size is not 2048 bytes\n", dev->id); return 0; @@ -788,40 +788,40 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, } else { if (mode2) { if ((mode2 & 0x03) == 0x01) - read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + read_mode2_xa_form1(dev, flags, lba, msf, mode2, temp_b); else if ((mode2 & 0x03) == 0x02) - read_mode2_xa_form2(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + read_mode2_xa_form2(dev, flags, lba, msf, mode2, temp_b); else - read_mode2_non_xa(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + read_mode2_non_xa(dev, flags, lba, msf, mode2, temp_b); } else { if (audio) read_audio(dev, lba, temp_b); else - read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + read_mode1(dev, flags, lba, msf, mode2, temp_b); } } - if ((cdrom_sector_flags & 0x06) == 0x02) { + if ((flags & 0x06) == 0x02) { /* Add error flags. */ DEBUG("CD-ROM %i: Error flags\n", dev->id); memcpy(b + cdrom_sector_size, extra_buffer, 294); cdrom_sector_size += 294; - } else if ((cdrom_sector_flags & 0x06) == 0x04) { + } else if ((flags & 0x06) == 0x04) { /* Add error flags. */ DEBUG("CD-ROM %i: Full error flags\n", dev->id); memcpy(b + cdrom_sector_size, extra_buffer, 296); cdrom_sector_size += 296; } - if ((cdrom_sector_flags & 0x700) == 0x100) { + if ((flags & 0x700) == 0x100) { DEBUG("CD-ROM %i: Raw subchannel data\n", dev->id); memcpy(b + cdrom_sector_size, raw_buffer + 2352, 96); cdrom_sector_size += 96; - } else if ((cdrom_sector_flags & 0x700) == 0x200) { + } else if ((flags & 0x700) == 0x200) { DEBUG("CD-ROM %i: Q subchannel data\n", dev->id); memcpy(b + cdrom_sector_size, raw_buffer + 2352, 16); cdrom_sector_size += 16; - } else if ((cdrom_sector_flags & 0x700) == 0x400) { + } else if ((flags & 0x700) == 0x400) { DEBUG("CD-ROM %i: R/W subchannel data\n", dev->id); memcpy(b + cdrom_sector_size, raw_buffer + 2352, 96); cdrom_sector_size += 96; @@ -841,13 +841,13 @@ image_size(cdrom_t *dev) static int -image_readtoc(cdrom_t *dev, unsigned char *b, unsigned char starttrack, int msf, UNUSED(int maxlen), int single) +image_readtoc(cdrom_t *dev, uint8_t *b, uint8_t starttrack, int is_msf, UNUSED(int maxlen), int single) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; int number, len = 4; int c, d, first_track, last_track; uint32_t temp; - unsigned char attr; + uint8_t attr; TMSF tmsf; if (!img) return 0; @@ -861,7 +861,7 @@ image_readtoc(cdrom_t *dev, unsigned char *b, unsigned char starttrack, int msf, for (c = 0; c <= last_track; c++) { img->GetAudioTrackInfo(c+1, number, tmsf, attr); if (number >= starttrack) { - d=c; + d = c; break; } } @@ -879,7 +879,7 @@ image_readtoc(cdrom_t *dev, unsigned char *b, unsigned char starttrack, int msf, b[len++] = number; /* track number */ b[len++] = 0; /* reserved */ - if (msf) { + if (is_msf) { b[len++] = 0; b[len++] = tmsf.min; b[len++] = tmsf.sec; @@ -904,7 +904,7 @@ image_readtoc(cdrom_t *dev, unsigned char *b, unsigned char starttrack, int msf, static int -image_readtoc_session(cdrom_t *dev, unsigned char *b, int msf, int maxlen) +image_readtoc_session(cdrom_t *dev, uint8_t *b, int is_msf, int maxlen) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; int number, len = 4; @@ -924,13 +924,13 @@ image_readtoc_session(cdrom_t *dev, unsigned char *b, int msf, int maxlen) b[len++] = attr; b[len++] = number; /* track number */ b[len++] = 0; /* reserved */ - if (msf) { + if (is_msf) { b[len++] = 0; b[len++] = tmsf.min; b[len++] = tmsf.sec; b[len++] = tmsf.fr; } else { - temp = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; /* Do the - 150. */ + temp = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; b[len++] = temp >> 24; b[len++] = temp >> 16; b[len++] = temp >> 8; @@ -945,7 +945,7 @@ image_readtoc_session(cdrom_t *dev, unsigned char *b, int msf, int maxlen) static int -image_readtoc_raw(cdrom_t *dev, unsigned char *b, UNUSED(int maxlen)) +image_readtoc_raw(cdrom_t *dev, uint8_t *b, UNUSED(int maxlen)) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; int first_track, last_track; @@ -964,13 +964,13 @@ image_readtoc_raw(cdrom_t *dev, unsigned char *b, UNUSED(int maxlen)) img->GetAudioTrackInfo(track, number, tmsf, attr); b[len++] = track; - b[len++]= attr; - b[len++]=0; - b[len++]=0; - b[len++]=0; - b[len++]=0; - b[len++]=0; - b[len++]=0; + b[len++] = attr; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; b[len++] = tmsf.min; b[len++] = tmsf.sec; b[len++] = tmsf.fr; @@ -984,27 +984,31 @@ static int image_status(cdrom_t *dev) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; + int ret = CD_STATUS_DATA_ONLY; if (!img) return CD_STATUS_EMPTY; if (dev->img_is_iso) - return CD_STATUS_DATA_ONLY; + return ret; if (img->HasAudioTracks()) { switch(dev->cd_state) { case CD_PLAYING: - return CD_STATUS_PLAYING; + ret = CD_STATUS_PLAYING; + break; case CD_PAUSED: - return CD_STATUS_PAUSED; + ret = CD_STATUS_PAUSED; + break; case CD_STOPPED: default: - return CD_STATUS_STOPPED; + ret = CD_STATUS_STOPPED; + break; } } - return CD_STATUS_DATA_ONLY; + return ret; } @@ -1024,7 +1028,6 @@ image_close(cdrom_t *dev) { CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; -INFO("CDROM: image_close(%ls)\n", dev->image_path); dev->cd_state = CD_STOPPED; if (img) { @@ -1100,23 +1103,20 @@ cdrom_image_open(cdrom_t *dev, const wchar_t *fn) memset(temp, '\0', sizeof(temp)); wcstombs(temp, fn, sizeof(temp)); if (! img->SetDevice(temp, false)) { - dev->ops->close(dev); - - cdrom_set_null_handler(dev); - - DEBUG("[f] image_open(): cdrom[%i]->ops = %08X\n", dev->id, dev->ops); + image_close(dev); + dev->ops = NULL; return 1; } + /* Attach this handler to the drive. */ + dev->reset = NULL; + dev->ops = &cdrom_image_ops; + /* All good, reset state. */ dev->cd_state = CD_STOPPED; dev->seek_pos = 0; dev->cd_buflen = 0; dev->cdrom_capacity = image_get_last_block(dev) + 1; - /* Attach this handler to the drive. */ - dev->reset = NULL; - dev->ops = &cdrom_image_ops; - return 0; } diff --git a/src/devices/cdrom/cdrom_null.c b/src/devices/cdrom/cdrom_null.c deleted file mode 100644 index d6a8a94..0000000 --- a/src/devices/cdrom/cdrom_null.c +++ /dev/null @@ -1,172 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Implementation of the CD-ROM null interface for unmounted - * guest CD-ROM drives. - * - * FIXME: TO BE REMOVED - * - * Version: @(#)cdrom_null.c 1.0.7 2018/10/18 - * - * Author: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#include -#include -#include -#include -#include "../../emu.h" -#include "cdrom.h" -#include "cdrom_null.h" - - -static int -null_ready(cdrom_t *dev) -{ - return(0); -} - - -static int -null_media_type_id(cdrom_t *dev) -{ - return(0x70); -} - - -static uint32_t -null_size(cdrom_t *dev) -{ - return(0); -} - - -static int -null_status(cdrom_t *dev) -{ - return(CD_STATUS_EMPTY); -} - - -static void -null_close(cdrom_t *dev) -{ - dev->ops = NULL; -} - - -static int -null_readtoc(cdrom_t *dev, uint8_t *b, uint8_t starttrack, int msf, int maxlen, int single) -{ - return(0); -} - - -static int -null_readtoc_session(cdrom_t *dev, uint8_t *b, int msf, int maxlen) -{ - return(0); -} - - -static int -null_readtoc_raw(cdrom_t *dev, uint8_t *b, int maxlen) -{ - return(0); -} - - -static uint8_t -null_getcurrentsubchannel(cdrom_t *dev, uint8_t *b, int msf) -{ - return(0x13); -} - - -static int -null_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int cdrom_sector_type, int cdrom_sector_flags, int *len) -{ - *len = 0; - - return(0); -} - - -static cdrom_ops_t cdrom_null_ops = { - null_ready, - NULL, - NULL, - null_media_type_id, - - null_size, - null_status, - NULL, - null_close, - - NULL, - NULL, - - null_readtoc, - null_readtoc_session, - null_readtoc_raw, - - NULL, - NULL, - NULL, - NULL, - NULL, - - null_getcurrentsubchannel, - null_readsector_raw -}; - - -int -cdrom_null_open(cdrom_t *dev) -{ - cdrom_set_null_handler(dev); - - return(0); -} - - -void -cdrom_null_reset(cdrom_t *dev) -{ -} - - -void -cdrom_set_null_handler(cdrom_t *dev) -{ - dev->ops = &cdrom_null_ops; - - dev->host_drive = 0; - memset(dev->image_path, 0, sizeof(dev->image_path)); -} diff --git a/src/devices/cdrom/cdrom_null.h b/src/devices/cdrom/cdrom_null.h deleted file mode 100644 index c061f60..0000000 --- a/src/devices/cdrom/cdrom_null.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * VARCem Virtual ARchaeological Computer EMulator. - * An emulator of (mostly) x86-based PC systems and devices, - * using the ISA,EISA,VLB,MCA and PCI system buses, roughly - * spanning the era between 1981 and 1995. - * - * This file is part of the VARCem Project. - * - * Definitions for the NULL CD-ROM handler. - * - * FIXME: TO BE REMOVED - * - * Version: @(#)cdrom_null.h 1.0.3 2018/10/17 - * - * Authors: Miran Grca, - * Sarah Walker, - * - * Copyright 2016-2018 Miran Grca. - * Copyright 2008-2018 Sarah Walker. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the: - * - * Free Software Foundation, Inc. - * 59 Temple Place - Suite 330 - * Boston, MA 02111-1307 - * USA. - */ -#ifndef EMU_CDROM_NULL_H -# define EMU_CDROM_NULL_H - - -#ifdef __cplusplus -extern "C" { -#endif - -extern int cdrom_null_open(cdrom_t *dev); -//extern void null_close(cdrom_t *dev); -extern void cdrom_null_reset(cdrom_t *dev); - -extern void cdrom_set_null_handler(cdrom_t *dev); - -#ifdef __cplusplus -} -#endif - - -#endif /*EMU_CDROM_NULL_H*/ diff --git a/src/devices/scsi/scsi_cdrom.c b/src/devices/scsi/scsi_cdrom.c index 588811c..73c0573 100644 --- a/src/devices/scsi/scsi_cdrom.c +++ b/src/devices/scsi/scsi_cdrom.c @@ -8,7 +8,7 @@ * * Emulation of SCSI (and ATAPI) CD-ROM drives. * - * Version: @(#)scsi_cdrom.c 1.0.2 2018/10/18 + * Version: @(#)scsi_cdrom.c 1.0.3 2018/10/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -54,7 +54,6 @@ #include "../disk/hdc_ide.h" #include "../cdrom/cdrom.h" #include "../cdrom/cdrom_image.h" -#include "../cdrom/cdrom_null.h" #include "scsi_device.h" #include "scsi_cdrom.h" @@ -377,12 +376,13 @@ set_callback(scsi_cdrom_t *dev) static void -set_signature(void *p) +set_signature(void *priv) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; if (!dev) return; + dev->phase = 1; dev->request_length = 0xEB14; } @@ -407,14 +407,14 @@ current_mode(scsi_cdrom_t *dev) /* Translates ATAPI status (ERR_STAT flag) to SCSI status. */ static int -err_stat_to_scsi(void *p) +err_stat_to_scsi(void *priv) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; if (dev->status & ERR_STAT) return SCSI_STATUS_CHECK_CONDITION; - else - return SCSI_STATUS_OK; + + return SCSI_STATUS_OK; } @@ -445,9 +445,9 @@ atapi_phase_to_scsi(scsi_cdrom_t *dev) static uint32_t -get_channel(void *p, int channel) +get_channel(void *priv, int channel) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; if (!dev) return channel + 1; @@ -457,9 +457,9 @@ get_channel(void *p, int channel) static uint32_t -get_volume(void *p, int channel) +get_volume(void *priv, int channel) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; if (!dev) return 255; @@ -504,8 +504,8 @@ mode_sense_load(scsi_cdrom_t *dev) static void mode_sense_save(scsi_cdrom_t *dev) { - FILE *f; wchar_t file_name[512]; + FILE *f; memset(file_name, 0, 512 * sizeof(wchar_t)); if (dev->drv->bus_type == CDROM_BUS_SCSI) @@ -521,18 +521,21 @@ mode_sense_save(scsi_cdrom_t *dev) static int -read_capacity(void *p, uint8_t *cdb, uint8_t *buffer, uint32_t *len) +read_capacity(void *priv, uint8_t *cdb, uint8_t *buffer, uint32_t *len) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; int size = 0; - size = dev->drv->ops->size(dev->drv) - 1; /* IMPORTANT: What's returned is the last LBA block. */ + /* IMPORTANT: What's returned is the last LBA block. */ + if (dev->drv->ops && dev->drv->ops->size) + size = dev->drv->ops->size(dev->drv) - 1; + memset(buffer, 0, 8); buffer[0] = (size >> 24) & 0xff; buffer[1] = (size >> 16) & 0xff; buffer[2] = (size >> 8) & 0xff; buffer[3] = size & 0xff; - buffer[6] = 8; /* 2048 = 0x0800 */ + buffer[6] = 8; /* 2048 = 0x0800 */ *len = 8; return 1; @@ -1101,7 +1104,12 @@ read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *len) int i = 0; int temp_len = 0; - cdsize = dev->drv->ops->size(dev->drv); + if (dev->drv->ops && dev->drv->ops->size) + cdsize = dev->drv->ops->size(dev->drv); + else { + not_ready(dev); + return 0; + } if (dev->sector_pos >= cdsize) { DEBUG("CD-ROM %i: Trying to read from beyond the end of disc (%i >= %i)\n", dev->id, @@ -1121,9 +1129,15 @@ read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *len) *len = 0; for (i = 0; i < dev->requested_blocks; i++) { - ret = dev->drv->ops->readsector_raw(dev->drv, cdbufferb + dev->data_pos, - dev->sector_pos + i, msf, - type, flags, &temp_len); + if (dev->drv->ops && dev->drv->ops->readsector_raw) + ret = dev->drv->ops->readsector_raw(dev->drv, + cdbufferb + dev->data_pos, + dev->sector_pos + i, msf, + type, flags, &temp_len); + else { + not_ready(dev); + return 0; + } dev->data_pos += temp_len; dev->old_len += temp_len; @@ -1191,19 +1205,20 @@ static int read_dvd_structure(scsi_cdrom_t *dev, int format, const uint8_t *packet, uint8_t *buf) { int layer = packet[6]; - uint64_t total_sectors; + uint64_t sectors = 0; switch (format) { case 0x00: /* Physical format information */ - total_sectors = (uint64_t) dev->drv->ops->size(dev->drv); + if (dev->drv->ops && dev->drv->ops->size) + sectors = (uint64_t) dev->drv->ops->size(dev->drv); if (layer != 0) { invalid_field(dev); return 0; } - total_sectors >>= 2; - if (total_sectors == 0) { + sectors >>= 2; + if (sectors == 0) { /* return -ASC_MEDIUM_NOT_PRESENT; */ not_ready(dev); return 0; @@ -1216,15 +1231,15 @@ read_dvd_structure(scsi_cdrom_t *dev, int format, const uint8_t *packet, uint8_t /* FIXME: 0x30000 per spec? */ buf[8] = buf[9] = buf[10] = buf[11] = 0; /* start sector */ - buf[12] = (total_sectors >> 24) & 0xff; /* end sector */ - buf[13] = (total_sectors >> 16) & 0xff; - buf[14] = (total_sectors >> 8) & 0xff; - buf[15] = total_sectors & 0xff; + buf[12] = (sectors >> 24) & 0xff; /* end sector */ + buf[13] = (sectors >> 16) & 0xff; + buf[14] = (sectors >> 8) & 0xff; + buf[15] = sectors & 0xff; - buf[16] = (total_sectors >> 24) & 0xff; /* l0 end sector */ - buf[17] = (total_sectors >> 16) & 0xff; - buf[18] = (total_sectors >> 8) & 0xff; - buf[19] = total_sectors & 0xff; + buf[16] = (sectors >> 24) & 0xff; /* l0 end sector */ + buf[17] = (sectors >> 16) & 0xff; + buf[18] = (sectors >> 8) & 0xff; + buf[19] = sectors & 0xff; /* Size of buffer, not including 2 byte size field */ buf[0] = ((2048 +2 ) >> 8) & 0xff; @@ -1312,7 +1327,7 @@ scsi_cdrom_insert(void *p) static int pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) { - int ready = 0, status = 0; + int ready = 0, status; if (dev->drv->bus_type == CDROM_BUS_SCSI) { if ((cdb[0] != GPCMD_REQUEST_SENSE) && (cdb[1] & 0xe0)) { @@ -1343,14 +1358,18 @@ pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) return 0; } - status = dev->drv->ops->status(dev->drv); + if (dev->drv->ops && dev->drv->ops->status) + status = dev->drv->ops->status(dev->drv); + else + status = CD_STATUS_EMPTY; if ((status == CD_STATUS_PLAYING) || (status == CD_STATUS_PAUSED)) { ready = 1; goto skip_ready_check; } - ready = dev->drv->ops->ready(dev->drv); + if (dev->drv->ops && dev->drv->ops->ready) + ready = dev->drv->ops->ready(dev->drv); skip_ready_check: /* If the drive is not ready, there is no reason to keep the @@ -1480,7 +1499,8 @@ request_sense_for_scsi(void *p, uint8_t *buffer, uint8_t alloc_length) scsi_cdrom_t *dev = (scsi_cdrom_t *) p; int ready = 0; - ready = dev->drv->ops->ready(dev->drv); + if (dev->drv->ops && dev->drv->ops->ready) + ready = dev->drv->ops->ready(dev->drv); if (!ready && dev->unit_attention) { /* If the drive is not ready, there is no reason to keep the @@ -1568,7 +1588,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb) memcpy(dev->current_cdb, cdb, 12); - dev->drv->cd_status = dev->drv->ops->status(dev->drv); + if (dev->drv->ops && dev->drv->ops->status) + dev->drv->cd_status = dev->drv->ops->status(dev->drv); + else + dev->drv->cd_status = CD_STATUS_EMPTY; if (cdb[0] != 0) { DEBUG("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n", @@ -1605,8 +1628,12 @@ scsi_cdrom_command(void *p, uint8_t *cdb) break; case GPCMD_REQUEST_SENSE: - /* If there's a unit attention condition and there's a buffered not ready, a standalone REQUEST SENSE - should forget about the not ready, and report unit attention straight away. */ + /* + * If there is a UNIT ATTENTION condition and there is + * a buffered NOT READY, a standalone REQUEST SENSE + * should forget about the NOT READY, and report the + * UNIT ATTENTION straight away. + */ set_phase(dev, SCSI_PHASE_DATA_IN); max_len = cdb[4]; @@ -1662,18 +1689,37 @@ scsi_cdrom_command(void *p, uint8_t *cdb) if (toc_format == 0) toc_format = (cdb[9] >> 6) & 3; + if (! dev->drv->ops) { + not_ready(dev); + return; + } + switch (toc_format) { case 0: /*Normal*/ - len = dev->drv->ops->readtoc(dev->drv, cdbufferb, cdb[6], msf, max_len, - 0); + if (! dev->drv->ops->readtoc) { + not_ready(dev); + return; + } + len = dev->drv->ops->readtoc(dev->drv, cdbufferb, cdb[6], msf, max_len, 0); break; + case 1: /*Multi session*/ + if (! dev->drv->ops->readtoc_session) { + not_ready(dev); + return; + } len = dev->drv->ops->readtoc_session(dev->drv, cdbufferb, msf, max_len); cdbufferb[0] = 0; cdbufferb[1] = 0xA; break; + case 2: /*Raw*/ + if (! dev->drv->ops->readtoc_raw) { + not_ready(dev); + return; + } len = dev->drv->ops->readtoc_raw(dev->drv, cdbufferb, max_len); break; + default: invalid_field(dev); buf_free(dev); @@ -1696,6 +1742,8 @@ scsi_cdrom_command(void *p, uint8_t *cdb) /* IMPORTANT: Convert the command to new read CD for pass through purposes. */ dev->current_cdb[0] = 0xbe; + /*FALLTHROUGH*/ + case GPCMD_READ_6: case GPCMD_READ_10: case GPCMD_READ_12: @@ -1710,6 +1758,7 @@ scsi_cdrom_command(void *p, uint8_t *cdb) dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]); msf = 0; break; + case GPCMD_READ_10: dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; @@ -1717,6 +1766,7 @@ scsi_cdrom_command(void *p, uint8_t *cdb) dev->sector_pos); msf = 0; break; + case GPCMD_READ_12: dev->sector_len = (((uint32_t) cdb[6]) << 24) | (((uint32_t) cdb[7]) << 16) | (((uint32_t) cdb[8]) << 8) | ((uint32_t) cdb[9]); dev->sector_pos = (((uint32_t) cdb[2]) << 24) | (((uint32_t) cdb[3]) << 16) | (((uint32_t) cdb[4]) << 8) | ((uint32_t) cdb[5]); @@ -1724,6 +1774,7 @@ scsi_cdrom_command(void *p, uint8_t *cdb) dev->sector_pos); msf = 0; break; + case GPCMD_READ_CD_MSF: alloc_length = 2856; dev->sector_len = MSFtoLBA(cdb[6], cdb[7], cdb[8]); @@ -1733,6 +1784,7 @@ scsi_cdrom_command(void *p, uint8_t *cdb) dev->sector_len++; msf = 1; break; + case GPCMD_READ_CD_OLD: case GPCMD_READ_CD: alloc_length = 2856; @@ -1841,7 +1893,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb) len = mode_sense(dev, cdbufferb, 4, cdb[2], block_desc); len = MIN(len, alloc_length); cdbufferb[0] = len - 1; - cdbufferb[1] = dev->drv->ops->media_type_id(dev->drv); + if (dev->drv->ops && dev->drv->ops->media_type_id) + cdbufferb[1] = dev->drv->ops->media_type_id(dev->drv); + else + cdbufferb[1] = 0x70; if (block_desc) cdbufferb[3] = 8; } else { @@ -1849,7 +1904,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb) len = MIN(len, alloc_length); cdbufferb[0]=(len - 2) >> 8; cdbufferb[1]=(len - 2) & 255; - cdbufferb[2] = dev->drv->ops->media_type_id(dev->drv); + if (dev->drv->ops && dev->drv->ops->media_type_id) + cdbufferb[2] = dev->drv->ops->media_type_id(dev->drv); + else + cdbufferb[2] = 0x70; if (block_desc) { cdbufferb[6] = 0; cdbufferb[7] = 8; @@ -1907,8 +1965,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb) * the number of sectors from the media tells us which profile * to use as current. 0 means there is no media */ - if (dev->drv->ops->ready(dev->drv)) { + if (dev->drv->ops && dev->drv->ops->ready && + dev->drv->ops->ready(dev->drv)) { len = dev->drv->ops->size(dev->drv); + if (len > CD_MAX_SECTORS) { b[6] = (MMC_PROFILE_DVD_ROM >> 8) & 0xff; b[7] = MMC_PROFILE_DVD_ROM & 0xff; @@ -2094,10 +2154,17 @@ scsi_cdrom_command(void *p, uint8_t *cdb) cdbufferb[5] = (0 << 5) | (0 << 4) | (4 << 0); /* not damaged, primary copy, data track */ cdbufferb[6] = (0 << 7) | (0 << 6) | (0 << 5) | (0 << 6) | (1 << 0); /* not reserved track, not blank, not packet writing, not fixed packet, data mode 1 */ cdbufferb[7] = (0 << 1) | (0 << 0); /* last recorded address not valid, next recordable address not valid */ - cdbufferb[24] = (dev->drv->ops->size(dev->drv) >> 24) & 0xff; /* track size */ - cdbufferb[25] = (dev->drv->ops->size(dev->drv) >> 16) & 0xff; /* track size */ - cdbufferb[26] = (dev->drv->ops->size(dev->drv) >> 8) & 0xff; /* track size */ - cdbufferb[27] = dev->drv->ops->size(dev->drv) & 0xff; /* track size */ + + if (dev->drv->ops && dev->drv->ops->size) { + cdbufferb[24] = (dev->drv->ops->size(dev->drv) >> 24) & 0xff; /* track size */ + cdbufferb[25] = (dev->drv->ops->size(dev->drv) >> 16) & 0xff; /* track size */ + cdbufferb[26] = (dev->drv->ops->size(dev->drv) >> 8) & 0xff; /* track size */ + cdbufferb[27] = dev->drv->ops->size(dev->drv) & 0xff; /* track size */ + } else { + not_ready(dev); + buf_free(dev); + return; + } if (len > max_len) { len = max_len; @@ -2146,7 +2213,7 @@ scsi_cdrom_command(void *p, uint8_t *cdb) break; } - if (dev->drv->ops->audio_play) + if (dev->drv->ops && dev->drv->ops->audio_play) ret = dev->drv->ops->audio_play(dev->drv, pos, len, msf); else ret = 0; @@ -2196,7 +2263,14 @@ scsi_cdrom_command(void *p, uint8_t *cdb) cdbufferb[pos++] = 0; cdbufferb[pos++] = 0; /*Subchannel length*/ cdbufferb[pos++] = cdb[3] & 3; /*Format code*/ if (cdb[3] == 1) { - cdbufferb[1] = dev->drv->ops->getcurrentsubchannel(dev->drv, &cdbufferb[5], msf); + if (dev->drv->ops && dev->drv->ops->getcurrentsubchannel) + cdbufferb[1] = dev->drv->ops->getcurrentsubchannel(dev->drv, &cdbufferb[5], msf); + else { + not_ready(dev); + buf_free(dev); + return; + } + switch(dev->drv->cd_status) { case CD_STATUS_PLAYING: cdbufferb[1] = 0x11; @@ -2231,7 +2305,13 @@ scsi_cdrom_command(void *p, uint8_t *cdb) buf_alloc(dev, alloc_length); - len = dev->drv->ops->size(dev->drv); + if (dev->drv->ops && dev->drv->ops->size) + len = dev->drv->ops->size(dev->drv); + else { + not_ready(dev); + buf_free(dev); + return; + } if ((cdb[7] < 0xc0) && (len <= CD_MAX_SECTORS)) { incompatible_format(dev); @@ -2264,18 +2344,22 @@ scsi_cdrom_command(void *p, uint8_t *cdb) switch(cdb[4] & 3) { case 0: /* Stop the disc. */ - if (dev->drv->ops->stop) + if (dev->drv->ops && dev->drv->ops->stop) dev->drv->ops->stop(dev->drv); break; + case 1: /* Start the disc and read the TOC. */ /* This causes a TOC reload. */ - (void)dev->drv->ops->ready(dev->drv); + if (dev->drv->ops && dev->drv->ops->ready) + (void)dev->drv->ops->ready(dev->drv); break; + case 2: /* Eject the disc if possible. */ - if (dev->drv->ops->stop) + if (dev->drv->ops && dev->drv->ops->stop) dev->drv->ops->stop(dev->drv); ui_cdrom_eject(dev->id); break; + case 3: /* Load the disc (close tray). */ ui_cdrom_reload(dev->id); break; @@ -2387,14 +2471,14 @@ atapi_out: set_phase(dev, SCSI_PHASE_STATUS); if (cdb[8] & 1) { - if (dev->drv->ops->audio_resume) + if (dev->drv->ops && dev->drv->ops->audio_resume) dev->drv->ops->audio_resume(dev->drv); else { illegal_mode(dev); break; } } else { - if (dev->drv->ops->audio_pause) + if (dev->drv->ops && dev->drv->ops->audio_pause) dev->drv->ops->audio_pause(dev->drv); else { illegal_mode(dev); @@ -2439,7 +2523,7 @@ atapi_out: case GPCMD_STOP_PLAY_SCAN: set_phase(dev, SCSI_PHASE_STATUS); - if (dev->drv->ops->stop) + if (dev->drv->ops && dev->drv->ops->stop) dev->drv->ops->stop(dev->drv); else { illegal_mode(dev); @@ -2737,9 +2821,9 @@ write_to_dma(scsi_cdrom_t *dev) static void -scsi_cdrom_callback(void *p) +scsi_cdrom_callback(void *priv) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; int ret; switch(dev->packet_status) { @@ -2826,9 +2910,9 @@ scsi_cdrom_callback(void *p) static uint32_t -packet_read(void *p, int length) +packet_read(void *priv, int length) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; uint16_t *cdbufferw; uint32_t *cdbufferl; uint32_t temp = 0; @@ -2881,9 +2965,9 @@ packet_read(void *p, int length) static void -packet_write(void *p, uint32_t val, int length) +packet_write(void *priv, uint32_t val, int length) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; uint16_t *cdbufferw; uint32_t *cdbufferl; @@ -2944,9 +3028,9 @@ packet_write(void *p, uint32_t val, int length) static void -scsi_cdrom_close(void *p) +scsi_cdrom_close(void *priv) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; if (dev) { free(scsi_cdrom[dev->id]); @@ -2956,11 +3040,11 @@ scsi_cdrom_close(void *p) static void -scsi_cdrom_stop(void *p) +scsi_cdrom_stop(void *priv) { - scsi_cdrom_t *dev = (scsi_cdrom_t *) p; + scsi_cdrom_t *dev = (scsi_cdrom_t *)priv; - if (dev->drv->ops->stop) + if (dev->drv->ops && dev->drv->ops->stop) dev->drv->ops->stop(dev->drv); } @@ -3027,9 +3111,9 @@ get_timings(int ide_has_dma, int type) * Fill in ide->buffer with the output of the "IDENTIFY PACKET DEVICE" command */ static void -scsi_cdrom_identify(void *p, int ide_has_dma) +scsi_cdrom_identify(void *priv, int ide_has_dma) { - ide_t *ide = (ide_t *) p; + ide_t *ide = (ide_t *)priv; scsi_cdrom_t *dev; char device_identify[9] = { 'E', 'M', 'U', '_', 'C', 'D', '0', '0', 0 }; diff --git a/src/mem.c b/src/mem.c index df59d83..db01f3f 100644 --- a/src/mem.c +++ b/src/mem.c @@ -8,7 +8,7 @@ * * Memory handling and MMU. * - * Version: @(#)mem.c 1.0.23 2018/10/16 + * Version: @(#)mem.c 1.0.24 2018/10/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -1805,7 +1805,7 @@ mem_reset_page_blocks(void) if (pages == NULL) return; - for (c = 0; c < ((mem_size * 1024) >> 12); c++) { + for (c = 0; c < pages_sz; c++) { pages[c].write_b = mem_write_ramb_page; pages[c].write_w = mem_write_ramw_page; pages[c].write_l = mem_write_raml_page; diff --git a/src/ui/ui_stbar.c b/src/ui/ui_stbar.c index bc18b08..903296f 100644 --- a/src/ui/ui_stbar.c +++ b/src/ui/ui_stbar.c @@ -8,7 +8,7 @@ * * Common UI support functions for the Status Bar module. * - * Version: @(#)ui_stbar.c 1.0.13 2018/10/18 + * Version: @(#)ui_stbar.c 1.0.14 2018/10/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -54,7 +54,6 @@ #include "../devices/disk/zip.h" #include "../devices/cdrom/cdrom.h" #include "../devices/cdrom/cdrom_image.h" -#include "../devices/cdrom/cdrom_null.h" #include "../devices/network/network.h" #include "../devices/sound/sound.h" #include "../devices/video/video.h" diff --git a/src/win/mingw/Makefile.MinGW b/src/win/mingw/Makefile.MinGW index 5a29591..f3abe41 100644 --- a/src/win/mingw/Makefile.MinGW +++ b/src/win/mingw/Makefile.MinGW @@ -8,7 +8,7 @@ # # Makefile for Windows systems using the MinGW32 environment. # -# Version: @(#)Makefile.mingw 1.0.62 2018/10/17 +# Version: @(#)Makefile.mingw 1.0.63 2018/10/18 # # Author: Fred N. van Kempen, # @@ -650,7 +650,7 @@ HDDOBJ := hdd.o \ hdc_ide_ata.o hdc_ide_xta.o hdc_xtide.o CDROMOBJ := cdrom.o \ - cdrom_null.o cdrom_speed.o \ + cdrom_speed.o \ cdrom_dosbox.o cdrom_image.o ZIPOBJ := zip.o diff --git a/src/win/msvc/Makefile.VC b/src/win/msvc/Makefile.VC index 47a4a61..a797cad 100644 --- a/src/win/msvc/Makefile.VC +++ b/src/win/msvc/Makefile.VC @@ -8,7 +8,7 @@ # # Makefile for Windows using Visual Studio 2015. # -# Version: @(#)Makefile.VC 1.0.48 2018/10/17 +# Version: @(#)Makefile.VC 1.0.49 2018/10/18 # # Author: Fred N. van Kempen, # @@ -618,7 +618,7 @@ HDDOBJ := hdd.obj \ hdc_ide_ata.obj hdc_ide_xta.obj hdc_xtide.obj CDROMOBJ := cdrom.obj \ - cdrom_null.obj cdrom_speed.obj \ + cdrom_speed.obj \ cdrom_dosbox.obj cdrom_image.obj ZIPOBJ := zip.obj