From 49f462c3cfa7868cdcc7f647cd7c3f611ffdbced Mon Sep 17 00:00:00 2001 From: Natalia Portillo Date: Tue, 23 Sep 2025 20:48:51 +0100 Subject: [PATCH] Add mode pages for the Yamaha drive. --- src/include/86box/scsi_device.h | 31 ++++++++-------- src/scsi/scsi_cdrom.c | 66 +++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 15 deletions(-) diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index d5d620670..d200aa0a4 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -163,21 +163,22 @@ #define GPCMD_PLAY_AUDIO_TRACK_RELATIVE_12_MATSUSHITA 0xe9 /* Matsushita Vendor Unique command */ /* Mode page codes for mode sense/set */ -#define GPMODE_UNIT_ATN_PAGE 0x00 -#define GPMODE_R_W_ERROR_PAGE 0x01 -#define GPMODE_DISCONNECT_PAGE 0x02 /* Disconnect/reconnect page */ -#define GPMODE_FORMAT_DEVICE_PAGE 0x03 -#define GPMODE_RIGID_DISK_PAGE 0x04 /* Rigid disk geometry page */ -#define GPMODE_FLEXIBLE_DISK_PAGE 0x05 -#define GPMODE_CACHING_PAGE 0x08 -#define GPMODE_CDROM_PAGE_SONY 0x08 -#define GPMODE_CDROM_AUDIO_PAGE_SONY 0x09 -#define GPMODE_CDROM_PAGE 0x0d -#define GPMODE_CDROM_AUDIO_PAGE 0x0e -#define GPMODE_CAPABILITIES_PAGE 0x2a -#define GPMODE_IOMEGA_PAGE 0x2f -#define GPMODE_UNK_VENDOR_PAGE 0x30 -#define GPMODE_ALL_PAGES 0x3f +#define GPMODE_UNIT_ATN_PAGE 0x00 +#define GPMODE_R_W_ERROR_PAGE 0x01 +#define GPMODE_DISCONNECT_PAGE 0x02 /* Disconnect/reconnect page */ +#define GPMODE_FORMAT_DEVICE_PAGE 0x03 +#define GPMODE_RIGID_DISK_PAGE 0x04 /* Rigid disk geometry page */ +#define GPMODE_FLEXIBLE_DISK_PAGE 0x05 +#define GPMODE_CDROM_WRITE_PARAMETERS_PAGE 0x05 +#define GPMODE_CACHING_PAGE 0x08 +#define GPMODE_CDROM_PAGE_SONY 0x08 +#define GPMODE_CDROM_AUDIO_PAGE_SONY 0x09 +#define GPMODE_CDROM_PAGE 0x0d +#define GPMODE_CDROM_AUDIO_PAGE 0x0e +#define GPMODE_CAPABILITIES_PAGE 0x2a +#define GPMODE_IOMEGA_PAGE 0x2f +#define GPMODE_UNK_VENDOR_PAGE 0x30 +#define GPMODE_ALL_PAGES 0x3f /* Mode page codes for presence */ #define GPMODEP_UNIT_ATN_PAGE 0x0000000000000001LL diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index f5b81e369..fe00b7cc3 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -131,6 +131,12 @@ static uint64_t scsi_cdrom_ms_page_flags_sony_scsi = (GPMODEP_R_W_ERROR_PAGE | G (1ULL << 0x0fULL) | GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); +static uint64_t scsi_cdrom_ms_page_flags_yamaha = (GPMODEP_R_W_ERROR_PAGE | GPMODEP_DISCONNECT_PAGE | + GPMODEP_FLEXIBLE_DISK_PAGE | GPMODEP_CACHING_PAGE | + GPMODEP_CDROM_PAGE_SONY | GPMODEP_CDROM_AUDIO_PAGE_SONY | + GPMODEP_CAPABILITIES_PAGE | GPMODEP_ALL_PAGES); + + static uint64_t scsi_cdrom_drive_status_page_flags = ((1ULL << 0x01ULL) | (1ULL << 0x02ULL) | (1ULL << 0x0fULL) | GPMODEP_ALL_PAGES); @@ -241,6 +247,56 @@ static const mode_sense_pages_t scsi_cdrom_ms_pages_changeable_sony_scsi = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }; + +static const mode_sense_pages_t scsi_cdrom_ms_pages_default_yamaha = { + { [0x01] = { GPMODE_R_W_ERROR_PAGE, 0x06, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00 }, + [0x02] = { GPMODE_DISCONNECT_PAGE, 0x0e, 0x10, 0xf0, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00 }, + [0x05] = { GPMODE_CDROM_WRITE_PARAMETERS_PAGE, 0x36, 0x00, 0xc7, 0x0a, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x96, 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00 }, + [0x08] = { GPMODE_CACHING_PAGE, 0x0a, 0x04, 0x00, 0xff, 0xff, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff }, + [0x0d] = { GPMODE_CDROM_PAGE, 0x06, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x4b }, + [0x0e] = { GPMODE_CDROM_AUDIO_PAGE, 0x0e, 0x04, 0x00, 0x00, 0x00, 0x00, 0x4b, + 0x01, 0xff, 0x02, 0xff, 0x00, 0x00, 0x00, + 0x00 }, + [0x2a] = { GPMODE_CAPABILITIES_PAGE, 0x14, 0x07, 0x07, 0x71, 0x6f, 0x29, 0x03, + 0x0b, 0x06, 0x01, 0x00, 0x10, 0x00, 0x10, + 0x8a, 0x00, 0x00, 0x05, 0x83, 0x05, 0x83 } } +}; + +// Not true values, need to check real hardware +static const mode_sense_pages_t scsi_cdrom_ms_pages_changeable_yamaha = { + { + [0x01] = { GPMODE_R_W_ERROR_PAGE, 0x06, 0x85, 0xff, 0x00, 0x00, 0x00, 0x00 }, + [0x02] = { GPMODE_DISCONNECT_PAGE, 0x0e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00 }, + [0x05] = { GPMODE_CDROM_WRITE_PARAMETERS_PAGE, 0x36, 0x5f, 0xff, 0x0f, 0x00, 0x00, 0x3f, + 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 }, + [0x08] = { GPMODE_CACHING_PAGE, 0x0a, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }, + [0x0d] = { GPMODE_CDROM_PAGE, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, + [0x0e] = { GPMODE_CDROM_AUDIO_PAGE, 0x0e, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0f, 0xff, 0x0f, 0xff, 0x00, 0x00, 0x00, + 0x00 }, + [0x2a] = { GPMODE_CAPABILITIES_PAGE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } +}; // clang-format on static gesn_cdb_t *gesn_cdb; @@ -3973,6 +4029,10 @@ scsi_cdrom_drive_reset(const int c) dev->ven_cmd_is_data[0xc6] = 1; dev->ven_cmd_is_data[0xc7] = 1; dev->use_cdb_9 = 1; + } else if (dev->drv->is_yamaha) { + dev->ms_page_flags = scsi_cdrom_ms_page_flags_yamaha; + dev->ms_pages_default = scsi_cdrom_ms_pages_default_yamaha; + dev->ms_pages_changeable = scsi_cdrom_ms_pages_changeable_yamaha; } if (dev->tf == NULL) @@ -4025,6 +4085,12 @@ scsi_cdrom_drive_reset(const int c) id->write = NULL; id->interrupt_drq = dev->drv->is_early; + if (dev->drv->is_yamaha) { + dev->ms_page_flags = scsi_cdrom_ms_page_flags_yamaha; + dev->ms_pages_default = scsi_cdrom_ms_pages_default_yamaha; + dev->ms_pages_changeable = scsi_cdrom_ms_pages_changeable_yamaha; + } + valid = 1; ide_atapi_attach(id);