Applied more upstream patches (finally, removing cdrom_null !)

This commit is contained in:
waltje
2018-10-19 04:20:34 -04:00
parent af443c0f04
commit 6bd70019c1
10 changed files with 269 additions and 417 deletions

View File

@@ -8,7 +8,7 @@
* *
* Generic interface for CD-ROM/DVD/BD implementations. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -51,7 +51,6 @@
#include "../sound/sound.h" #include "../sound/sound.h"
#include "cdrom.h" #include "cdrom.h"
#include "cdrom_image.h" #include "cdrom_image.h"
#include "cdrom_null.h"
#define MIN_SEEK 2000 #define MIN_SEEK 2000
@@ -140,6 +139,11 @@ cdrom_playing_completed(cdrom_t *dev)
if (dev->ops && dev->ops->status) if (dev->ops && dev->ops->status)
dev->cd_status = dev->ops->status(dev); dev->cd_status = dev->ops->status(dev);
else {
dev->cd_status = CD_STATUS_EMPTY;
return 0;
}
if (((dev->prev_status == CD_STATUS_PLAYING) || if (((dev->prev_status == CD_STATUS_PLAYING) ||
(dev->prev_status == CD_STATUS_PAUSED)) && (dev->prev_status == CD_STATUS_PAUSED)) &&
@@ -197,14 +201,12 @@ cdrom_hard_reset(void)
break; break;
} }
if (dev->host_drive == 200) { if (dev->host_drive == 200) {
cdrom_image_open(dev, dev->image_path); cdrom_image_open(dev, dev->image_path);
if (dev->reset) if (dev->reset)
dev->reset(dev); dev->reset(dev);
} else }
cdrom_null_open(dev);
} }
} }
@@ -223,6 +225,7 @@ cdrom_close(void)
if (dev->ops && dev->ops->close) if (dev->ops && dev->ops->close)
dev->ops->close(dev); dev->ops->close(dev);
dev->ops = NULL;
if (dev->close) if (dev->close)
dev->close(dev->p); dev->close(dev->p);
@@ -283,8 +286,6 @@ cdrom_eject(uint8_t id)
memset(dev->image_path, 0, sizeof(dev->image_path)); memset(dev->image_path, 0, sizeof(dev->image_path));
cdrom_null_open(dev);
cdrom_insert(id); cdrom_insert(id);
} }
@@ -314,6 +315,7 @@ cdrom_reload(uint8_t id)
wcscpy(dev->image_path, dev->prev_image_path); wcscpy(dev->image_path, dev->prev_image_path);
free(dev->prev_image_path); free(dev->prev_image_path);
dev->prev_image_path = NULL; dev->prev_image_path = NULL;
cdrom_image_open(dev, dev->image_path); cdrom_image_open(dev, dev->image_path);
cdrom_insert(id); cdrom_insert(id);
@@ -362,7 +364,7 @@ cdrom_notify(const char *drive, int present)
dev = &cdrom[i]; dev = &cdrom[i];
if (dev->host_drive == *drive) { if (dev->host_drive == *drive) {
if (dev->ops->notify_change) if (dev->ops && dev->ops->notify_change)
dev->ops->notify_change(dev, present); 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, "none")) return(ret);
if (! strcmp(str, "ide") || !strcmp(str, "atapi") if (! strcmp(str, "ide") || !strcmp(str, "atapi"))
#if 1 return(CDROM_BUS_ATAPI);
|| !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, "scsi")) if (! strcmp(str, "scsi"))
return(CDROM_BUS_SCSI); return(CDROM_BUS_SCSI);

View File

@@ -51,6 +51,7 @@
#define BUF_SIZE 32768 #define BUF_SIZE 32768
#define CDROM_EMPTY (dev->host_drive == 0)
#define CDROM_IMAGE 200 #define CDROM_IMAGE 200

View File

@@ -8,7 +8,7 @@
* *
* CD-ROM image support. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -51,7 +51,6 @@
#include "cdrom.h" #include "cdrom.h"
#include "cdrom_image.h" #include "cdrom_image.h"
#include "cdrom_dosbox.h" #include "cdrom_dosbox.h"
#include "cdrom_null.h"
#ifdef ENABLE_CDROM_IMAGE_LOG #ifdef ENABLE_CDROM_IMAGE_LOG
@@ -182,14 +181,14 @@ audio_callback(cdrom_t *dev, int16_t *output, int len)
static void static void
audio_stop(cdrom_t *dev) /* audio_stop */ audio_stop(cdrom_t *dev)
{ {
dev->cd_state = CD_STOPPED; dev->cd_state = CD_STOPPED;
} }
static uint8_t 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; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
int number; int number;
@@ -207,13 +206,13 @@ audio_play(cdrom_t *dev, uint32_t pos, uint32_t len, int ismsf)
return 0; return 0;
} }
DEBUG("Play audio - %08X %08X %i\n", pos, len, ismsf); DEBUG("Play audio - %08X %08X %i\n", pos, len, is_msf);
if (ismsf == 2) { if (is_msf == 2) {
img->GetAudioTrackInfo(pos, number, tmsf, attr); img->GetAudioTrackInfo(pos, number, tmsf, attr);
pos = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; pos = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150;
img->GetAudioTrackInfo(len, number, tmsf, attr); img->GetAudioTrackInfo(len, number, tmsf, attr);
len = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150; len = MSFtoLBA(tmsf.min, tmsf.sec, tmsf.fr) - 150;
} else if (ismsf == 1) { } else if (is_msf == 1) {
m = (pos >> 16) & 0xff; m = (pos >> 16) & 0xff;
s = (pos >> 8) & 0xff; s = (pos >> 8) & 0xff;
f = pos & 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; len = MSFtoLBA(m, s, f) - 150;
DEBUG("MSF - pos = %08X len = %08X\n", pos, len); DEBUG("MSF - pos = %08X len = %08X\n", pos, len);
} else if (ismsf == 0) { } else if (is_msf == 0) {
if (pos == 0xffffffff) { if (pos == 0xffffffff) {
DEBUG("Playing from current position\n"); DEBUG("Playing from current position\n");
pos = dev->seek_pos; pos = dev->seek_pos;
@@ -300,7 +299,8 @@ image_get_last_block(cdrom_t *dev)
for (c = 0; c <= last_track; c++) { for (c = 0; c <= last_track; c++) {
img->GetAudioTrackInfo(c+1, number, tmsf, attr); 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) if (address > lb)
lb = address; lb = address;
} }
@@ -368,7 +368,7 @@ image_getcurrentsubchannel(cdrom_t *dev, uint8_t *b, int msf)
static int 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; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
uint8_t attr; 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 (!img || dev->img_is_iso) return 0;
if (ismsf) { if (is_msf) {
m = (pos >> 16) & 0xff; m = (pos >> 16) & 0xff;
s = (pos >> 8) & 0xff; s = (pos >> 8) & 0xff;
f = pos & 0xff; f = pos & 0xff;
@@ -488,7 +488,7 @@ read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b)
static void 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; 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; cdrom_sector_size = 0;
if (cdrom_sector_flags & 0x80) { /* Sync */ if (flags & 0x80) { /* Sync */
DEBUG("CD-ROM %i: [Mode 1] Sync\n", dev->id); DEBUG("CD-ROM %i: [Mode 1] Sync\n", dev->id);
memcpy(b, raw_buffer, 12); memcpy(b, raw_buffer, 12);
cdrom_sector_size += 12; cdrom_sector_size += 12;
b += 12; b += 12;
} }
if (cdrom_sector_flags & 0x20) { /* Header */ if (flags & 0x20) { /* Header */
DEBUG("CD-ROM %i: [Mode 1] Header\n", dev->id); DEBUG("CD-ROM %i: [Mode 1] Header\n", dev->id);
memcpy(b, raw_buffer + 12, 4); memcpy(b, raw_buffer + 12, 4);
cdrom_sector_size += 4; cdrom_sector_size += 4;
b += 4; b += 4;
} }
if (cdrom_sector_flags & 0x40) { /* Sub-header */ if (flags & 0x40) { /* Sub-header */
if (!(cdrom_sector_flags & 0x10)) { /* No user data */ if (!(flags & 0x10)) { /* No user data */
DEBUG("CD-ROM %i: [Mode 1] Sub-header\n", dev->id); DEBUG("CD-ROM %i: [Mode 1] Sub-header\n", dev->id);
memcpy(b, raw_buffer + 16, 8); memcpy(b, raw_buffer + 16, 8);
cdrom_sector_size += 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); DEBUG("CD-ROM %i: [Mode 1] User data\n", dev->id);
memcpy(b, raw_buffer + 16, 2048); memcpy(b, raw_buffer + 16, 2048);
cdrom_sector_size += 2048; cdrom_sector_size += 2048;
b += 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); DEBUG("CD-ROM %i: [Mode 1] EDC/ECC\n", dev->id);
memcpy(b, raw_buffer + 2064, 288); memcpy(b, raw_buffer + 2064, 288);
cdrom_sector_size += 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 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; 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; 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); DEBUG("CD-ROM %i: [Mode 2 Formless] Sync\n", dev->id);
memcpy(b, raw_buffer, 12); memcpy(b, raw_buffer, 12);
cdrom_sector_size += 12; cdrom_sector_size += 12;
b += 12; b += 12;
} }
if (cdrom_sector_flags & 0x20) { /* Header */ if (flags & 0x20) { /* Header */
DEBUG("CD-ROM %i: [Mode 2 Formless] Header\n", dev->id); DEBUG("CD-ROM %i: [Mode 2 Formless] Header\n", dev->id);
memcpy(b, raw_buffer + 12, 4); memcpy(b, raw_buffer + 12, 4);
cdrom_sector_size += 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. */ /* 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); DEBUG("CD-ROM %i: [Mode 2 Formless] Sub-header\n", dev->id);
memcpy(b, raw_buffer + 16, 8); memcpy(b, raw_buffer + 16, 8);
cdrom_sector_size += 8; cdrom_sector_size += 8;
b += 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); DEBUG("CD-ROM %i: [Mode 2 Formless] User data\n", dev->id);
memcpy(b, raw_buffer + 24, 2336); memcpy(b, raw_buffer + 24, 2336);
cdrom_sector_size += 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 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; 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; 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Sync\n", dev->id);
memcpy(b, raw_buffer, 12); memcpy(b, raw_buffer, 12);
cdrom_sector_size += 12; cdrom_sector_size += 12;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Header\n", dev->id);
memcpy(b, raw_buffer + 12, 4); memcpy(b, raw_buffer + 12, 4);
cdrom_sector_size += 4; cdrom_sector_size += 4;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Sub-header\n", dev->id);
memcpy(b, raw_buffer + 16, 8); memcpy(b, raw_buffer + 16, 8);
cdrom_sector_size += 8; cdrom_sector_size += 8;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 1] User data\n", dev->id);
memcpy(b, raw_buffer + 24, 2048); memcpy(b, raw_buffer + 24, 2048);
cdrom_sector_size += 2048; cdrom_sector_size += 2048;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 1] EDC/ECC\n", dev->id);
memcpy(b, raw_buffer + 2072, 280); memcpy(b, raw_buffer + 2072, 280);
cdrom_sector_size += 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 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; 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; 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Sync\n", dev->id);
memcpy(b, raw_buffer, 12); memcpy(b, raw_buffer, 12);
cdrom_sector_size += 12; cdrom_sector_size += 12;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Header\n", dev->id);
memcpy(b, raw_buffer + 12, 4); memcpy(b, raw_buffer + 12, 4);
cdrom_sector_size += 4; cdrom_sector_size += 4;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Sub-header\n", dev->id);
memcpy(b, raw_buffer + 16, 8); memcpy(b, raw_buffer + 16, 8);
cdrom_sector_size += 8; cdrom_sector_size += 8;
b += 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 2] User data\n", dev->id);
memcpy(b, raw_buffer + 24, 2328); memcpy(b, raw_buffer + 24, 2328);
cdrom_sector_size += 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 static int
image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int is_msf,
int cdrom_sector_type, int cdrom_sector_flags, int *len) int type, int flags, int *len)
{ {
CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
uint8_t *b, *temp_b; uint8_t *b, *temp_b;
@@ -696,7 +696,7 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
*len = 0; *len = 0;
if (ismsf) { if (is_msf) {
m = (sector >> 16) & 0xff; m = (sector >> 16) & 0xff;
s = (sector >> 8) & 0xff; s = (sector >> 8) & 0xff;
f = sector & 0xff; f = sector & 0xff;
@@ -711,7 +711,7 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
audio = 0; audio = 0;
mode2 = img->IsMode2(lba) ? 1 : 0; mode2 = img->IsMode2(lba) ? 1 : 0;
} else { } 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 = img->IsMode2(lba) ? 1 : 0;
} }
mode2 <<= 2; 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(raw_buffer, 0, 2448);
memset(extra_buffer, 0, 296); 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); DEBUG("CD-ROM %i: [Mode 1] 0x00 and 0x08 are illegal modes\n", dev->id);
return 0; 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; return 0;
if ((cdrom_sector_type == 3) || ((cdrom_sector_type > 4) && (cdrom_sector_type != 8))) { if ((type == 3) || ((type > 4) && (type != 8))) {
if (cdrom_sector_type == 3) { if (type == 3) {
DEBUG("CD-ROM %i: Attempting to read a Yellowbook Mode 2 data sector from an image\n", dev->id); 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); DEBUG("CD-ROM %i: Attempting to read a XA Mode 2 Form 2 data sector from an image\n", dev->id);
} }
return 0; return 0;
} else if (cdrom_sector_type == 1) { } else if (type == 1) {
if (!audio || dev->img_is_iso) { if (!audio || dev->img_is_iso) {
DEBUG("CD-ROM %i: [Audio] Attempting to read an audio sector from a data image\n", dev->id); DEBUG("CD-ROM %i: [Audio] Attempting to read an audio sector from a data image\n", dev->id);
return 0; return 0;
} }
read_audio(dev, lba, temp_b); read_audio(dev, lba, temp_b);
} else if (cdrom_sector_type == 2) { } else if (type == 2) {
if (audio || mode2) { if (audio || mode2) {
DEBUG("CD-ROM %i: [Mode 1] Attempting to read a sector of another type\n", dev->id); DEBUG("CD-ROM %i: [Mode 1] Attempting to read a sector of another type\n", dev->id);
return 0; return 0;
} }
read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); read_mode1(dev, flags, lba, msf, mode2, temp_b);
} else if (cdrom_sector_type == 3) { } else if (type == 3) {
if (audio || !mode2 || (mode2 & 0x03)) { if (audio || !mode2 || (mode2 & 0x03)) {
DEBUG("CD-ROM %i: [Mode 2 Formless] Attempting to read a sector of another type\n", dev->id); DEBUG("CD-ROM %i: [Mode 2 Formless] Attempting to read a sector of another type\n", dev->id);
return 0; return 0;
} }
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 (cdrom_sector_type == 4) { } else if (type == 4) {
if (audio || !mode2 || ((mode2 & 0x03) != 1)) { 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 1] Attempting to read a sector of another type\n", dev->id);
return 0; return 0;
} }
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 (cdrom_sector_type == 5) { } else if (type == 5) {
if (audio || !mode2 || ((mode2 & 0x03) != 2)) { 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); DEBUG("CD-ROM %i: [XA Mode 2 Form 2] Attempting to read a sector of another type\n", dev->id);
return 0; return 0;
} }
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 if (cdrom_sector_type == 8) { } else if (type == 8) {
if (audio) { if (audio) {
DEBUG("CD-ROM %i: [Any Data] Attempting to read a data sector from an audio track\n", dev->id); DEBUG("CD-ROM %i: [Any Data] Attempting to read a data sector from an audio track\n", dev->id);
return 0; return 0;
} }
if (mode2 && ((mode2 & 0x03) == 1)) 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) else if (!mode2)
read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); read_mode1(dev, flags, lba, msf, mode2, temp_b);
else { else {
DEBUG("CD-ROM %i: [Any Data] Attempting to read a data sector whose cooked size is not 2048 bytes\n", dev->id); DEBUG("CD-ROM %i: [Any Data] Attempting to read a data sector whose cooked size is not 2048 bytes\n", dev->id);
return 0; return 0;
@@ -788,40 +788,40 @@ image_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf,
} else { } else {
if (mode2) { if (mode2) {
if ((mode2 & 0x03) == 0x01) 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) 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 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 { } else {
if (audio) if (audio)
read_audio(dev, lba, temp_b); read_audio(dev, lba, temp_b);
else 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. */ /* Add error flags. */
DEBUG("CD-ROM %i: Error flags\n", dev->id); DEBUG("CD-ROM %i: Error flags\n", dev->id);
memcpy(b + cdrom_sector_size, extra_buffer, 294); memcpy(b + cdrom_sector_size, extra_buffer, 294);
cdrom_sector_size += 294; cdrom_sector_size += 294;
} else if ((cdrom_sector_flags & 0x06) == 0x04) { } else if ((flags & 0x06) == 0x04) {
/* Add error flags. */ /* Add error flags. */
DEBUG("CD-ROM %i: Full error flags\n", dev->id); DEBUG("CD-ROM %i: Full error flags\n", dev->id);
memcpy(b + cdrom_sector_size, extra_buffer, 296); memcpy(b + cdrom_sector_size, extra_buffer, 296);
cdrom_sector_size += 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); DEBUG("CD-ROM %i: Raw subchannel data\n", dev->id);
memcpy(b + cdrom_sector_size, raw_buffer + 2352, 96); memcpy(b + cdrom_sector_size, raw_buffer + 2352, 96);
cdrom_sector_size += 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); DEBUG("CD-ROM %i: Q subchannel data\n", dev->id);
memcpy(b + cdrom_sector_size, raw_buffer + 2352, 16); memcpy(b + cdrom_sector_size, raw_buffer + 2352, 16);
cdrom_sector_size += 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); DEBUG("CD-ROM %i: R/W subchannel data\n", dev->id);
memcpy(b + cdrom_sector_size, raw_buffer + 2352, 96); memcpy(b + cdrom_sector_size, raw_buffer + 2352, 96);
cdrom_sector_size += 96; cdrom_sector_size += 96;
@@ -841,13 +841,13 @@ image_size(cdrom_t *dev)
static int 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; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
int number, len = 4; int number, len = 4;
int c, d, first_track, last_track; int c, d, first_track, last_track;
uint32_t temp; uint32_t temp;
unsigned char attr; uint8_t attr;
TMSF tmsf; TMSF tmsf;
if (!img) return 0; 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++) { for (c = 0; c <= last_track; c++) {
img->GetAudioTrackInfo(c+1, number, tmsf, attr); img->GetAudioTrackInfo(c+1, number, tmsf, attr);
if (number >= starttrack) { if (number >= starttrack) {
d=c; d = c;
break; 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++] = number; /* track number */
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
if (msf) { if (is_msf) {
b[len++] = 0; b[len++] = 0;
b[len++] = tmsf.min; b[len++] = tmsf.min;
b[len++] = tmsf.sec; b[len++] = tmsf.sec;
@@ -904,7 +904,7 @@ image_readtoc(cdrom_t *dev, unsigned char *b, unsigned char starttrack, int msf,
static int 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; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
int number, len = 4; 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++] = attr;
b[len++] = number; /* track number */ b[len++] = number; /* track number */
b[len++] = 0; /* reserved */ b[len++] = 0; /* reserved */
if (msf) { if (is_msf) {
b[len++] = 0; b[len++] = 0;
b[len++] = tmsf.min; b[len++] = tmsf.min;
b[len++] = tmsf.sec; b[len++] = tmsf.sec;
b[len++] = tmsf.fr; b[len++] = tmsf.fr;
} else { } 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 >> 24;
b[len++] = temp >> 16; b[len++] = temp >> 16;
b[len++] = temp >> 8; b[len++] = temp >> 8;
@@ -945,7 +945,7 @@ image_readtoc_session(cdrom_t *dev, unsigned char *b, int msf, int maxlen)
static int 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; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
int first_track, last_track; 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); img->GetAudioTrackInfo(track, number, tmsf, attr);
b[len++] = track; b[len++] = track;
b[len++]= attr; b[len++] = attr;
b[len++]=0; b[len++] = 0;
b[len++]=0; b[len++] = 0;
b[len++]=0; b[len++] = 0;
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.min;
b[len++] = tmsf.sec; b[len++] = tmsf.sec;
b[len++] = tmsf.fr; b[len++] = tmsf.fr;
@@ -984,27 +984,31 @@ static int
image_status(cdrom_t *dev) image_status(cdrom_t *dev)
{ {
CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
int ret = CD_STATUS_DATA_ONLY;
if (!img) return CD_STATUS_EMPTY; if (!img) return CD_STATUS_EMPTY;
if (dev->img_is_iso) if (dev->img_is_iso)
return CD_STATUS_DATA_ONLY; return ret;
if (img->HasAudioTracks()) { if (img->HasAudioTracks()) {
switch(dev->cd_state) { switch(dev->cd_state) {
case CD_PLAYING: case CD_PLAYING:
return CD_STATUS_PLAYING; ret = CD_STATUS_PLAYING;
break;
case CD_PAUSED: case CD_PAUSED:
return CD_STATUS_PAUSED; ret = CD_STATUS_PAUSED;
break;
case CD_STOPPED: case CD_STOPPED:
default: 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; CDROM_Interface_Image *img = (CDROM_Interface_Image *)dev->local;
INFO("CDROM: image_close(%ls)\n", dev->image_path);
dev->cd_state = CD_STOPPED; dev->cd_state = CD_STOPPED;
if (img) { if (img) {
@@ -1100,23 +1103,20 @@ cdrom_image_open(cdrom_t *dev, const wchar_t *fn)
memset(temp, '\0', sizeof(temp)); memset(temp, '\0', sizeof(temp));
wcstombs(temp, fn, sizeof(temp)); wcstombs(temp, fn, sizeof(temp));
if (! img->SetDevice(temp, false)) { if (! img->SetDevice(temp, false)) {
dev->ops->close(dev); image_close(dev);
dev->ops = NULL;
cdrom_set_null_handler(dev);
DEBUG("[f] image_open(): cdrom[%i]->ops = %08X\n", dev->id, dev->ops);
return 1; return 1;
} }
/* Attach this handler to the drive. */
dev->reset = NULL;
dev->ops = &cdrom_image_ops;
/* All good, reset state. */ /* All good, reset state. */
dev->cd_state = CD_STOPPED; dev->cd_state = CD_STOPPED;
dev->seek_pos = 0; dev->seek_pos = 0;
dev->cd_buflen = 0; dev->cd_buflen = 0;
dev->cdrom_capacity = image_get_last_block(dev) + 1; 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; return 0;
} }

View File

@@ -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, <mgrca8@gmail.com>
* Sarah Walker, <tommowalker@tommowalker.co.uk>
*
* 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 <stdio.h>
#include <stdint.h>
#include <string.h>
#include <wchar.h>
#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));
}

View File

@@ -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, <mgrca8@gmail.com>
* Sarah Walker, <tommowalker@tommowalker.co.uk>
*
* 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*/

View File

@@ -8,7 +8,7 @@
* *
* Emulation of SCSI (and ATAPI) CD-ROM drives. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -54,7 +54,6 @@
#include "../disk/hdc_ide.h" #include "../disk/hdc_ide.h"
#include "../cdrom/cdrom.h" #include "../cdrom/cdrom.h"
#include "../cdrom/cdrom_image.h" #include "../cdrom/cdrom_image.h"
#include "../cdrom/cdrom_null.h"
#include "scsi_device.h" #include "scsi_device.h"
#include "scsi_cdrom.h" #include "scsi_cdrom.h"
@@ -377,12 +376,13 @@ set_callback(scsi_cdrom_t *dev)
static void 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) if (!dev)
return; return;
dev->phase = 1; dev->phase = 1;
dev->request_length = 0xEB14; dev->request_length = 0xEB14;
} }
@@ -407,14 +407,14 @@ current_mode(scsi_cdrom_t *dev)
/* Translates ATAPI status (ERR_STAT flag) to SCSI status. */ /* Translates ATAPI status (ERR_STAT flag) to SCSI status. */
static int 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) if (dev->status & ERR_STAT)
return SCSI_STATUS_CHECK_CONDITION; 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 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) if (!dev)
return channel + 1; return channel + 1;
@@ -457,9 +457,9 @@ get_channel(void *p, int channel)
static uint32_t 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) if (!dev)
return 255; return 255;
@@ -504,8 +504,8 @@ mode_sense_load(scsi_cdrom_t *dev)
static void static void
mode_sense_save(scsi_cdrom_t *dev) mode_sense_save(scsi_cdrom_t *dev)
{ {
FILE *f;
wchar_t file_name[512]; wchar_t file_name[512];
FILE *f;
memset(file_name, 0, 512 * sizeof(wchar_t)); memset(file_name, 0, 512 * sizeof(wchar_t));
if (dev->drv->bus_type == CDROM_BUS_SCSI) if (dev->drv->bus_type == CDROM_BUS_SCSI)
@@ -521,18 +521,21 @@ mode_sense_save(scsi_cdrom_t *dev)
static int 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; 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); memset(buffer, 0, 8);
buffer[0] = (size >> 24) & 0xff; buffer[0] = (size >> 24) & 0xff;
buffer[1] = (size >> 16) & 0xff; buffer[1] = (size >> 16) & 0xff;
buffer[2] = (size >> 8) & 0xff; buffer[2] = (size >> 8) & 0xff;
buffer[3] = size & 0xff; buffer[3] = size & 0xff;
buffer[6] = 8; /* 2048 = 0x0800 */ buffer[6] = 8; /* 2048 = 0x0800 */
*len = 8; *len = 8;
return 1; 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 i = 0;
int temp_len = 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) { if (dev->sector_pos >= cdsize) {
DEBUG("CD-ROM %i: Trying to read from beyond the end of disc (%i >= %i)\n", dev->id, 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; *len = 0;
for (i = 0; i < dev->requested_blocks; i++) { for (i = 0; i < dev->requested_blocks; i++) {
ret = dev->drv->ops->readsector_raw(dev->drv, cdbufferb + dev->data_pos, if (dev->drv->ops && dev->drv->ops->readsector_raw)
dev->sector_pos + i, msf, ret = dev->drv->ops->readsector_raw(dev->drv,
type, flags, &temp_len); 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->data_pos += temp_len;
dev->old_len += 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) read_dvd_structure(scsi_cdrom_t *dev, int format, const uint8_t *packet, uint8_t *buf)
{ {
int layer = packet[6]; int layer = packet[6];
uint64_t total_sectors; uint64_t sectors = 0;
switch (format) { switch (format) {
case 0x00: /* Physical format information */ 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) { if (layer != 0) {
invalid_field(dev); invalid_field(dev);
return 0; return 0;
} }
total_sectors >>= 2; sectors >>= 2;
if (total_sectors == 0) { if (sectors == 0) {
/* return -ASC_MEDIUM_NOT_PRESENT; */ /* return -ASC_MEDIUM_NOT_PRESENT; */
not_ready(dev); not_ready(dev);
return 0; 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? */ /* FIXME: 0x30000 per spec? */
buf[8] = buf[9] = buf[10] = buf[11] = 0; /* start sector */ buf[8] = buf[9] = buf[10] = buf[11] = 0; /* start sector */
buf[12] = (total_sectors >> 24) & 0xff; /* end sector */ buf[12] = (sectors >> 24) & 0xff; /* end sector */
buf[13] = (total_sectors >> 16) & 0xff; buf[13] = (sectors >> 16) & 0xff;
buf[14] = (total_sectors >> 8) & 0xff; buf[14] = (sectors >> 8) & 0xff;
buf[15] = total_sectors & 0xff; buf[15] = sectors & 0xff;
buf[16] = (total_sectors >> 24) & 0xff; /* l0 end sector */ buf[16] = (sectors >> 24) & 0xff; /* l0 end sector */
buf[17] = (total_sectors >> 16) & 0xff; buf[17] = (sectors >> 16) & 0xff;
buf[18] = (total_sectors >> 8) & 0xff; buf[18] = (sectors >> 8) & 0xff;
buf[19] = total_sectors & 0xff; buf[19] = sectors & 0xff;
/* Size of buffer, not including 2 byte size field */ /* Size of buffer, not including 2 byte size field */
buf[0] = ((2048 +2 ) >> 8) & 0xff; buf[0] = ((2048 +2 ) >> 8) & 0xff;
@@ -1312,7 +1327,7 @@ scsi_cdrom_insert(void *p)
static int static int
pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) 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 (dev->drv->bus_type == CDROM_BUS_SCSI) {
if ((cdb[0] != GPCMD_REQUEST_SENSE) && (cdb[1] & 0xe0)) { 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; 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)) { if ((status == CD_STATUS_PLAYING) || (status == CD_STATUS_PAUSED)) {
ready = 1; ready = 1;
goto skip_ready_check; 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: skip_ready_check:
/* If the drive is not ready, there is no reason to keep the /* 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; scsi_cdrom_t *dev = (scsi_cdrom_t *) p;
int ready = 0; 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 (!ready && dev->unit_attention) {
/* If the drive is not ready, there is no reason to keep the /* 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); 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) { if (cdb[0] != 0) {
DEBUG("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n", 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; break;
case GPCMD_REQUEST_SENSE: 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); set_phase(dev, SCSI_PHASE_DATA_IN);
max_len = cdb[4]; max_len = cdb[4];
@@ -1662,18 +1689,37 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
if (toc_format == 0) if (toc_format == 0)
toc_format = (cdb[9] >> 6) & 3; toc_format = (cdb[9] >> 6) & 3;
if (! dev->drv->ops) {
not_ready(dev);
return;
}
switch (toc_format) { switch (toc_format) {
case 0: /*Normal*/ case 0: /*Normal*/
len = dev->drv->ops->readtoc(dev->drv, cdbufferb, cdb[6], msf, max_len, if (! dev->drv->ops->readtoc) {
0); not_ready(dev);
return;
}
len = dev->drv->ops->readtoc(dev->drv, cdbufferb, cdb[6], msf, max_len, 0);
break; break;
case 1: /*Multi session*/ 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); len = dev->drv->ops->readtoc_session(dev->drv, cdbufferb, msf, max_len);
cdbufferb[0] = 0; cdbufferb[1] = 0xA; cdbufferb[0] = 0; cdbufferb[1] = 0xA;
break; break;
case 2: /*Raw*/ case 2: /*Raw*/
if (! dev->drv->ops->readtoc_raw) {
not_ready(dev);
return;
}
len = dev->drv->ops->readtoc_raw(dev->drv, cdbufferb, max_len); len = dev->drv->ops->readtoc_raw(dev->drv, cdbufferb, max_len);
break; break;
default: default:
invalid_field(dev); invalid_field(dev);
buf_free(dev); buf_free(dev);
@@ -1696,6 +1742,8 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
/* IMPORTANT: Convert the command to new read CD /* IMPORTANT: Convert the command to new read CD
for pass through purposes. */ for pass through purposes. */
dev->current_cdb[0] = 0xbe; dev->current_cdb[0] = 0xbe;
/*FALLTHROUGH*/
case GPCMD_READ_6: case GPCMD_READ_6:
case GPCMD_READ_10: case GPCMD_READ_10:
case GPCMD_READ_12: 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]); dev->sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]);
msf = 0; msf = 0;
break; break;
case GPCMD_READ_10: case GPCMD_READ_10:
dev->sector_len = (cdb[7] << 8) | cdb[8]; dev->sector_len = (cdb[7] << 8) | cdb[8];
dev->sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; 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); dev->sector_pos);
msf = 0; msf = 0;
break; break;
case GPCMD_READ_12: 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_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]); 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); dev->sector_pos);
msf = 0; msf = 0;
break; break;
case GPCMD_READ_CD_MSF: case GPCMD_READ_CD_MSF:
alloc_length = 2856; alloc_length = 2856;
dev->sector_len = MSFtoLBA(cdb[6], cdb[7], cdb[8]); 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++; dev->sector_len++;
msf = 1; msf = 1;
break; break;
case GPCMD_READ_CD_OLD: case GPCMD_READ_CD_OLD:
case GPCMD_READ_CD: case GPCMD_READ_CD:
alloc_length = 2856; 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 = mode_sense(dev, cdbufferb, 4, cdb[2], block_desc);
len = MIN(len, alloc_length); len = MIN(len, alloc_length);
cdbufferb[0] = len - 1; 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) if (block_desc)
cdbufferb[3] = 8; cdbufferb[3] = 8;
} else { } else {
@@ -1849,7 +1904,10 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
len = MIN(len, alloc_length); len = MIN(len, alloc_length);
cdbufferb[0]=(len - 2) >> 8; cdbufferb[0]=(len - 2) >> 8;
cdbufferb[1]=(len - 2) & 255; 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) { if (block_desc) {
cdbufferb[6] = 0; cdbufferb[6] = 0;
cdbufferb[7] = 8; 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 * the number of sectors from the media tells us which profile
* to use as current. 0 means there is no media * 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); len = dev->drv->ops->size(dev->drv);
if (len > CD_MAX_SECTORS) { if (len > CD_MAX_SECTORS) {
b[6] = (MMC_PROFILE_DVD_ROM >> 8) & 0xff; b[6] = (MMC_PROFILE_DVD_ROM >> 8) & 0xff;
b[7] = MMC_PROFILE_DVD_ROM & 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[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[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[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 */ if (dev->drv->ops && dev->drv->ops->size) {
cdbufferb[26] = (dev->drv->ops->size(dev->drv) >> 8) & 0xff; /* track size */ cdbufferb[24] = (dev->drv->ops->size(dev->drv) >> 24) & 0xff; /* track size */
cdbufferb[27] = dev->drv->ops->size(dev->drv) & 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) { if (len > max_len) {
len = max_len; len = max_len;
@@ -2146,7 +2213,7 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
break; 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); ret = dev->drv->ops->audio_play(dev->drv, pos, len, msf);
else else
ret = 0; ret = 0;
@@ -2196,7 +2263,14 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
cdbufferb[pos++] = 0; cdbufferb[pos++] = 0; /*Subchannel length*/ cdbufferb[pos++] = 0; cdbufferb[pos++] = 0; /*Subchannel length*/
cdbufferb[pos++] = cdb[3] & 3; /*Format code*/ cdbufferb[pos++] = cdb[3] & 3; /*Format code*/
if (cdb[3] == 1) { 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) { switch(dev->drv->cd_status) {
case CD_STATUS_PLAYING: case CD_STATUS_PLAYING:
cdbufferb[1] = 0x11; cdbufferb[1] = 0x11;
@@ -2231,7 +2305,13 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
buf_alloc(dev, alloc_length); 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)) { if ((cdb[7] < 0xc0) && (len <= CD_MAX_SECTORS)) {
incompatible_format(dev); incompatible_format(dev);
@@ -2264,18 +2344,22 @@ scsi_cdrom_command(void *p, uint8_t *cdb)
switch(cdb[4] & 3) { switch(cdb[4] & 3) {
case 0: /* Stop the disc. */ case 0: /* Stop the disc. */
if (dev->drv->ops->stop) if (dev->drv->ops && dev->drv->ops->stop)
dev->drv->ops->stop(dev->drv); dev->drv->ops->stop(dev->drv);
break; break;
case 1: /* Start the disc and read the TOC. */ case 1: /* Start the disc and read the TOC. */
/* This causes a TOC reload. */ /* 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; break;
case 2: /* Eject the disc if possible. */ 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); dev->drv->ops->stop(dev->drv);
ui_cdrom_eject(dev->id); ui_cdrom_eject(dev->id);
break; break;
case 3: /* Load the disc (close tray). */ case 3: /* Load the disc (close tray). */
ui_cdrom_reload(dev->id); ui_cdrom_reload(dev->id);
break; break;
@@ -2387,14 +2471,14 @@ atapi_out:
set_phase(dev, SCSI_PHASE_STATUS); set_phase(dev, SCSI_PHASE_STATUS);
if (cdb[8] & 1) { 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); dev->drv->ops->audio_resume(dev->drv);
else { else {
illegal_mode(dev); illegal_mode(dev);
break; break;
} }
} else { } else {
if (dev->drv->ops->audio_pause) if (dev->drv->ops && dev->drv->ops->audio_pause)
dev->drv->ops->audio_pause(dev->drv); dev->drv->ops->audio_pause(dev->drv);
else { else {
illegal_mode(dev); illegal_mode(dev);
@@ -2439,7 +2523,7 @@ atapi_out:
case GPCMD_STOP_PLAY_SCAN: case GPCMD_STOP_PLAY_SCAN:
set_phase(dev, SCSI_PHASE_STATUS); 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); dev->drv->ops->stop(dev->drv);
else { else {
illegal_mode(dev); illegal_mode(dev);
@@ -2737,9 +2821,9 @@ write_to_dma(scsi_cdrom_t *dev)
static void 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; int ret;
switch(dev->packet_status) { switch(dev->packet_status) {
@@ -2826,9 +2910,9 @@ scsi_cdrom_callback(void *p)
static uint32_t 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; uint16_t *cdbufferw;
uint32_t *cdbufferl; uint32_t *cdbufferl;
uint32_t temp = 0; uint32_t temp = 0;
@@ -2881,9 +2965,9 @@ packet_read(void *p, int length)
static void 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; uint16_t *cdbufferw;
uint32_t *cdbufferl; uint32_t *cdbufferl;
@@ -2944,9 +3028,9 @@ packet_write(void *p, uint32_t val, int length)
static void 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) { if (dev) {
free(scsi_cdrom[dev->id]); free(scsi_cdrom[dev->id]);
@@ -2956,11 +3040,11 @@ scsi_cdrom_close(void *p)
static void 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); 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 * Fill in ide->buffer with the output of the "IDENTIFY PACKET DEVICE" command
*/ */
static void 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; scsi_cdrom_t *dev;
char device_identify[9] = { 'E', 'M', 'U', '_', 'C', 'D', '0', '0', 0 }; char device_identify[9] = { 'E', 'M', 'U', '_', 'C', 'D', '0', '0', 0 };

View File

@@ -8,7 +8,7 @@
* *
* Memory handling and MMU. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -1805,7 +1805,7 @@ mem_reset_page_blocks(void)
if (pages == NULL) return; 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_b = mem_write_ramb_page;
pages[c].write_w = mem_write_ramw_page; pages[c].write_w = mem_write_ramw_page;
pages[c].write_l = mem_write_raml_page; pages[c].write_l = mem_write_raml_page;

View File

@@ -8,7 +8,7 @@
* *
* Common UI support functions for the Status Bar module. * 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, <decwiz@yahoo.com> * Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* Miran Grca, <mgrca8@gmail.com> * Miran Grca, <mgrca8@gmail.com>
@@ -54,7 +54,6 @@
#include "../devices/disk/zip.h" #include "../devices/disk/zip.h"
#include "../devices/cdrom/cdrom.h" #include "../devices/cdrom/cdrom.h"
#include "../devices/cdrom/cdrom_image.h" #include "../devices/cdrom/cdrom_image.h"
#include "../devices/cdrom/cdrom_null.h"
#include "../devices/network/network.h" #include "../devices/network/network.h"
#include "../devices/sound/sound.h" #include "../devices/sound/sound.h"
#include "../devices/video/video.h" #include "../devices/video/video.h"

View File

@@ -8,7 +8,7 @@
# #
# Makefile for Windows systems using the MinGW32 environment. # 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, <decwiz@yahoo.com> # Author: Fred N. van Kempen, <decwiz@yahoo.com>
# #
@@ -650,7 +650,7 @@ HDDOBJ := hdd.o \
hdc_ide_ata.o hdc_ide_xta.o hdc_xtide.o hdc_ide_ata.o hdc_ide_xta.o hdc_xtide.o
CDROMOBJ := cdrom.o \ CDROMOBJ := cdrom.o \
cdrom_null.o cdrom_speed.o \ cdrom_speed.o \
cdrom_dosbox.o cdrom_image.o cdrom_dosbox.o cdrom_image.o
ZIPOBJ := zip.o ZIPOBJ := zip.o

View File

@@ -8,7 +8,7 @@
# #
# Makefile for Windows using Visual Studio 2015. # 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, <decwiz@yahoo.com> # Author: Fred N. van Kempen, <decwiz@yahoo.com>
# #
@@ -618,7 +618,7 @@ HDDOBJ := hdd.obj \
hdc_ide_ata.obj hdc_ide_xta.obj hdc_xtide.obj hdc_ide_ata.obj hdc_ide_xta.obj hdc_xtide.obj
CDROMOBJ := cdrom.obj \ CDROMOBJ := cdrom.obj \
cdrom_null.obj cdrom_speed.obj \ cdrom_speed.obj \
cdrom_dosbox.obj cdrom_image.obj cdrom_dosbox.obj cdrom_image.obj
ZIPOBJ := zip.obj ZIPOBJ := zip.obj